return 0;
 }
 
-static bool ptr_is_aligned(const void *data, int data_sz)
+static bool ptr_is_aligned(const struct btf *btf, __u32 type_id,
+                          const void *data)
 {
-       return ((uintptr_t)data) % data_sz == 0;
+       int alignment = btf__align_of(btf, type_id);
+
+       if (alignment == 0)
+               return false;
+
+       return ((uintptr_t)data) % alignment == 0;
 }
 
 static int btf_dump_int_data(struct btf_dump *d,
        /* handle packed int data - accesses of integers not aligned on
         * int boundaries can cause problems on some platforms.
         */
-       if (!ptr_is_aligned(data, sz)) {
+       if (!ptr_is_aligned(d->btf, type_id, data)) {
                memcpy(buf, data, sz);
                data = buf;
        }
        int sz = t->size;
 
        /* handle unaligned data; copy to local union */
-       if (!ptr_is_aligned(data, sz)) {
+       if (!ptr_is_aligned(d->btf, type_id, data)) {
                memcpy(&fl, data, sz);
                flp = &fl;
        }
                              __u32 id,
                              const void *data)
 {
-       if (ptr_is_aligned(data, d->ptr_sz) && d->ptr_sz == sizeof(void *)) {
+       if (ptr_is_aligned(d->btf, id, data) && d->ptr_sz == sizeof(void *)) {
                btf_dump_type_values(d, "%p", *(void **)data);
        } else {
                union ptr_data pt;
                                   __u32 id,
                                   __s64 *value)
 {
-       int sz = t->size;
-
        /* handle unaligned enum value */
-       if (!ptr_is_aligned(data, sz)) {
+       if (!ptr_is_aligned(d->btf, id, data)) {
                __u64 val;
                int err;