leonardchan marked an inline comment as done.
leonardchan added a comment.

In D77592#1985740 <https://reviews.llvm.org/D77592#1985740>, @rjmccall wrote:

> I'm not sure if the AST-level v-table layout abstraction really cares about 
> these differences.  I don't think it vends byte offsets into the v-table, 
> just slot indices (i.e. word offsets).


The primary reason for why I added it in `AST` is because down the line, to 
support the changes to the RTTI component, I'll need to edit 
`VCallAndVBaseOffsetBuilder::getCurrentOffsetOffset()`:

  CharUnits VCallAndVBaseOffsetBuilder::getCurrentOffsetOffset() const {
    // OffsetIndex is the index of this vcall or vbase offset, relative to the
    // vtable address point. (We subtract 3 to account for the information just
    // above the address point, the RTTI info, the offset to top, and the
    // vcall offset itself).
    int64_t OffsetIndex = -(int64_t)(3 + Components.size());
  
    CharUnits PointerWidth =
      Context.toCharUnitsFromBits(Context.getTargetInfo().getPointerWidth(0));
    CharUnits OffsetOffset = PointerWidth * OffsetIndex;
    return OffsetOffset;
  }

Right now, it assumes that the offset is 3 pointer widths below the vtable 
address point, but since we want to make the RTTI component a 32-bit int, we'll 
need to add an extra 4 `CharUnits` to the result. The enum would need to be 
exposed on the AST level so we can check it here. If we move the enum into 
`ItaniumCXXABI` or somewhere under codegen, then we will instead need to check 
every instance vcall or vbase offsets are used in codegen. I tried playing 
around with this idea, but I gave up since there seemed to be too many 
instances I didn't catch since my tests kept failing. I figured this was the 
easiest way.

This is just my experience trying to move things around, but it could be 
there's a better place to put this that I'm not seeing.



================
Comment at: clang/include/clang/AST/VTableBuilder.h:380
+    /// other structs/functions.
+    Relative,
+  };
----------------
rjmccall wrote:
> The only "struct" pointed to by the v-table is the `type_info` object.  How 
> are you planning to handle that?  The standard ABI makes the `type_info` a 
> vague-linkage symbol in most cases, so you won't be able to have a direct 
> relative reference to it.  If you adopt the Apple ARM64 modification for 
> `type_info` equality, you can rely on the `type_info` being defined within 
> the same linkage unit unless the v-table is being emitted as an optimization 
> for a type defined with a key function in a different linkage unit.  You 
> could handle that by making this an "inidirectable" relative reference, where 
> it's either a direct relative reference or a relative reference to a GOT 
> entry, as specified by the low bit in the reference.  But you need *some* 
> solution for this.
The plan I have is to add the "indirectable" relative reference you mention. In 
IR, we emit a `dso_local` global that points to the potentially external 
`type_info` object, and the relative reference is taken on this `dso_local` 
symbol. This IR seems to get lowered to a relative reference to a GOT entry.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D77592/new/

https://reviews.llvm.org/D77592



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to