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