atrosinenko wrote:

The comment mentions "extra data" (the discriminator) being always 0 for C++ 
v-table pointers, which is incorrect.

For example, compiling the following example source code
```cpp
struct Base {
  virtual int f() { return 0; }
};

Base *create() { return new Base(); }
```

with `./build/bin/clang -target aarch64-linux-pauthtest -march=v8.3-a -o - -S 
-O1 /tmp/vtable.cpp` results in the following output:

```
_Z6createv:
  // ...
  bl      _Znwm
  adrp    x8, _ZTV4Base+16
  add     x8, x8, :lo12:_ZTV4Base+16
  mov     x16, x0
  movk    x16, #12199, lsl #48
  pacda   x8, x16
  str     x8, [x0]
  // ...
_ZTV4Base:
  .xword  0
  .xword  _ZTI4Base
  .xword  _ZN4Base1fEv@AUTH(ia,44143,addr)
  .size   _ZTV4Base, 24
```

<details>
<summary>Full output</summary>

```
        .aeabi_subsection       aeabi_pauthabi, required, uleb128
        .aeabi_attribute        1, 268435458    // Tag_PAuth_Platform
        .aeabi_attribute        2, 1791 // Tag_PAuth_Schema
        .section        .note.gnu.property,"a",@note
        .p2align        3, 0x0
        .word   4
        .word   24
        .word   5
        .asciz  "GNU"
        .word   3221225473
        .word   16
        .xword  268435458
        .xword  1791
.Lsec_end0:
        .text
        .file   "vtable.cpp"
        .globl  _Z6createv                      // -- Begin function _Z6createv
        .p2align        2
        .type   _Z6createv,@function
_Z6createv:                             // @_Z6createv
        .cfi_startproc
// %bb.0:                               // %entry
        .cfi_b_key_frame
        pacibsp
        .cfi_negate_ra_state
        stp     x29, x30, [sp, #-16]!           // 16-byte Folded Spill
        .cfi_def_cfa_offset 16
        mov     x29, sp
        .cfi_def_cfa w29, 16
        .cfi_offset w30, -8
        .cfi_offset w29, -16
        mov     w0, #8                          // =0x8
        bl      _Znwm
        adrp    x8, _ZTV4Base+16
        add     x8, x8, :lo12:_ZTV4Base+16
        mov     x16, x0
        movk    x16, #12199, lsl #48
        pacda   x8, x16
        str     x8, [x0]
        .cfi_def_cfa wsp, 16
        ldp     x29, x30, [sp], #16             // 16-byte Folded Reload
        .cfi_def_cfa_offset 0
        .cfi_restore w30
        .cfi_restore w29
        retab
.Lfunc_end0:
        .size   _Z6createv, .Lfunc_end0-_Z6createv
        .cfi_endproc
                                        // -- End function
        .section        .text._ZN4Base1fEv,"axG",@progbits,_ZN4Base1fEv,comdat
        .weak   _ZN4Base1fEv                    // -- Begin function 
_ZN4Base1fEv
        .p2align        2
        .type   _ZN4Base1fEv,@function
_ZN4Base1fEv:                           // @_ZN4Base1fEv
        .cfi_startproc
// %bb.0:                               // %entry
        mov     w0, wzr
        ret
.Lfunc_end1:
        .size   _ZN4Base1fEv, .Lfunc_end1-_ZN4Base1fEv
        .cfi_endproc
                                        // -- End function
        .type   _ZTV4Base,@object               // @_ZTV4Base
        .section        .data.rel.ro._ZTV4Base,"awG",@progbits,_ZTV4Base,comdat
        .weak   _ZTV4Base
        .p2align        3, 0x0
_ZTV4Base:
        .xword  0
        .xword  _ZTI4Base
        .xword  _ZN4Base1fEv@AUTH(ia,44143,addr)
        .size   _ZTV4Base, 24

        .type   _ZTI4Base,@object               // @_ZTI4Base
        .section        .data.rel.ro._ZTI4Base,"awG",@progbits,_ZTI4Base,comdat
        .weak   _ZTI4Base
        .p2align        3, 0x0
_ZTI4Base:
        .xword  (_ZTVN10__cxxabiv117__class_type_infoE+16)@AUTH(da,45546,addr)
        .xword  _ZTS4Base
        .size   _ZTI4Base, 16

        .type   _ZTS4Base,@object               // @_ZTS4Base
        .section        .rodata._ZTS4Base,"aG",@progbits,_ZTS4Base,comdat
        .weak   _ZTS4Base
_ZTS4Base:
        .asciz  "4Base"
        .size   _ZTS4Base, 6

        .ident  "clang version 23.0.0git"
        .section        ".note.GNU-stack","",@progbits
        .addrsig
        .addrsig_sym _ZTV4Base
        .addrsig_sym _ZTI4Base
        .addrsig_sym _ZTVN10__cxxabiv117__class_type_infoE
        .addrsig_sym _ZTS4Base
```

</details>

In the default `pauthtest` ABI both the pointer to v-table itself as well as 
the pointers to virtual functions contained in the v-table have non-zero 
discriminators (with both address and constant modifiers). The pointers to 
v-tables can be made non-signed by passing 
`-fno-ptrauth-vtable-pointer-address-discrimination` and 
`-fno-ptrauth-vtable-pointer-type-discrimination`, but it is neither always nor 
by default.

https://github.com/llvm/llvm-project/pull/207265
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to