[clang] [llvm] [PAC] Fix address discrimination for type info vtable pointers (PR #102199)

Daniil Kovalev via cfe-commits cfe-commits at lists.llvm.org
Fri Sep 20 07:37:47 PDT 2024


kovdan01 wrote:

> I think you should be able to avoid constructing the initializer twice if you restructure the code a bit to just construct the global before the call to BuildVTablePointer. I added GlobalVariable::replaceInitializer because I was looking at this review: it lets you construct the global before the initializer, without having to do awkward things with RAUW.

@efriedma-quic Sorry, I'm not sure if I got your point correctly.

The issue with enabling address discrimination for signed vtable pointers is that it requires self-references - see, for example, llvm/test/CodeGen/AArch64/ptrauth-type-info-vptr-discr.ll:

```
@_ZTI10TestStruct = constant { ptr, ptr } {
  ptr ptrauth (
    ptr getelementptr inbounds ( ; <== raw unsigned pointer
      ptr,
      ptr @_ZTVN10__cxxabiv117__class_type_infoE,
      i64 2),
    i32 2,                       ; <== key
    i64 [[STDTYPEINFO_DISC]],    ; <== constant discr
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ptr @_ZTI10TestStruct),      ; <== address discr
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ptr @_ZTS10TestStruct
}
```

As far as I understand, the correct way of creating such structures which contain self-references, is to use `ConstantInitBuilder` and `getAddrOfCurrentPosition`. As far as I see from its source code, it handles self-references specially. With `ConstantInitBuilder`, we'll not end up with a vector of elements to be passed as struct initializer (`Fields` in our case) - instead, we'll need to call `finishAndSetAsInitializer` on the builder object.

As for `replaceInitializer` - sure, we can use it in existing code below, where we have `if (OldGV) { /* ... */ }`. But I'm not sure how it this newly proposed function can help us in context of this particular patch.

Do I miss smth? Can we somehow differently handle self-references and avoid using `ConstantInitBuilder`? Thanks in advance!



https://github.com/llvm/llvm-project/pull/102199


More information about the cfe-commits mailing list