[llvm-dev] RFC: a renaming/redesign for LLVM's bitset metadata

Philip Reames via llvm-dev llvm-dev at lists.llvm.org
Wed Jun 8 21:24:34 PDT 2016

On 06/01/2016 03:48 PM, Peter Collingbourne via llvm-dev wrote:
> Hi all,
> The bitset metadata currently used in LLVM has a few problems:
> 1. It has the wrong name. The name "bitset" refers to an 
> implementation detail of one use of the metadata (i.e. its original 
> use case, CFI). This makes it harder to understand, as the name makes 
> no sense in the context of virtual call optimization.
> 2. It is represented using a global named metadata node, rather than 
> being directly associated with a global. This makes it harder to 
> manipulate the metadata when rebuilding global variables, summarise it 
> as part of ThinLTO and drop unused metadata when associated globals 
> are dropped. For this reason, CFI does not currently work correctly 
> when both CFI and vcall opt are enabled, as vcall opt needs to rebuild 
> vtable globals, and fails to associate metadata with the rebuilt 
> globals. As I understand it, the same problem could also affect ASan, 
> which rebuilds globals with a red zone.
> I would like to solve both of these problems in the following way:
> 1. Rename the metadata to "type metadata". This new name reflects how 
> the metadata is currently being used (i.e. to represent type 
> information for CFI and vtable opt).
> 2. Attach metadata directly to the globals that it pertains to, rather 
> than using the "llvm.bitsets" global metadata node as we are doing 
> now. This would be done using the newly introduced capability to 
> attach metadata to global variables (r271348 and r271358). Passes 
> which manipulate globals can easily copy metadata between globals with 
> the GlobalObject::copyMetadata function, which would be taught to 
> understand type metadata.
> To give an example of how this would look, suppose that we have the 
> following declarations:
> class A {
>   virtual void f() {}
> };
> class B : public A {
>   virtual void f() {}
>   virtual void g() {}
> };
> The vtables for A and B would be represented in IR like this:
> @_ZTV1A = constant [3 x i8*] [i8* ..., i8* ..., i8* @A::f], !type !0
> @_ZTV1B = constant [4 x i8*] [i8* ..., i8* ..., i8* @B::f, i8* @B::g], 
> type !0, !type !1
> !0 = {i64 16, !"A"}
> !1 = {i64 16, !"B"}
> The metadata !0 indicates that the attached global has an address 
> point for the type A at byte offset 16, and metadata !1 indicates that 
> the attached global has an address point for the type B at byte offset 
> 16. We attach !0 to _ZTV1A, which indicates that the vtable for A has 
> a valid address point for A at offset 16, and attach both !0 and !1 to 
> _ZTV1B, which indicates that the vtable for B has a valid address 
> point for both A and B at offset 16.
Can you define "address point"?  I don't recognize the term and thus 
didn't understand the example.

FTR, I have no stance on the proposal.
> I also plan to apply this renaming to existing passes and intrinsics 
> that use the "bitset" name.
> Thanks,
> -- 
> -- 
> Peter
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160608/840c5cbb/attachment.html>

More information about the llvm-dev mailing list