[PATCH] D51199: CodeGen: Add two more conditions for adding symbols to the address-significance table.

Peter Collingbourne via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 23 16:52:41 PDT 2018


pcc created this revision.
pcc added a reviewer: rnk.
Herald added a subscriber: hiraditya.

Firstly, require the symbol to be used within the module. If a
symbol is unused within a module, then by definition it cannot be
address-significant within that module. This condition is useful on all
platforms because it could make symbol tables smaller -- without this
change, emitting an address-significance table could cause otherwise
unused undefined symbols to be added to the object file.

But this change is necessary with COFF specifically in order to
preserve the property that an unreferenced undefined symbol in an IR
module does not result in a link failure. This is already the case for
ELF because ELF linkers only reject links with unresolved symbols if
there is a relocation to that symbol, but COFF linkers require all
undefined symbols to be resolved regardless of relocations. So if
a module contains an unreferenced undefined symbol, we need to make
sure not to add it to the address-significance table (and thus the
symbol table) in case it doesn't end up resolved at link time.

Secondly, do not add dllimport symbols to the table. These symbols
won't be able to be resolved because their definitions live in another
module and are accessed via the IAT, and the address-significance
table has no effect on other modules anyway. It wouldn't make sense
to add the IAT entry symbol to the address-significance table either
because the IAT entry isn't address-significant -- the generated code
never takes its address.


Repository:
  rL LLVM

https://reviews.llvm.org/D51199

Files:
  llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
  llvm/test/CodeGen/X86/addrsig.ll


Index: llvm/test/CodeGen/X86/addrsig.ll
===================================================================
--- llvm/test/CodeGen/X86/addrsig.ll
+++ llvm/test/CodeGen/X86/addrsig.ll
@@ -7,6 +7,18 @@
 
 ; CHECK: .addrsig_sym f1
 define void @f1() {
+  %f1 = bitcast void()* @f1 to i8*
+  %f2 = bitcast void()* @f2 to i8*
+  %f3 = bitcast void()* @f3 to i8*
+  %g1 = bitcast i32* @g1 to i8*
+  %g2 = bitcast i32* @g2 to i8*
+  %g3 = bitcast i32* @g3 to i8*
+  %dllimport = bitcast i32* @dllimport to i8*
+  %tls = bitcast i32* @tls to i8*
+  %a1 = bitcast i32* @a1 to i8*
+  %a2 = bitcast i32* @a2 to i8*
+  %i1 = bitcast void()* @i1 to i8*
+  %i2 = bitcast void()* @i2 to i8*
   unreachable
 }
 
@@ -25,6 +37,12 @@
 ; CHECK-NOT: .addrsig_sym g3
 @g3 = external unnamed_addr global i32
 
+; CHECK-NOT: .addrsig_sym unref
+ at unref = external global i32
+
+; CHECK-NOT: .addrsig_sym dllimport
+ at dllimport = external dllimport global i32
+
 ; CHECK-NOT: .addrsig_sym tls
 @tls = thread_local global i32 0
 
Index: llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
===================================================================
--- llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
+++ llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
@@ -1542,7 +1542,8 @@
     // Emit address-significance attributes for all globals.
     OutStreamer->EmitAddrsig();
     for (const GlobalValue &GV : M.global_values())
-      if (!GV.isThreadLocal() && !GV.getName().startswith("llvm.") &&
+      if (!GV.use_empty() && !GV.isThreadLocal() &&
+          !GV.hasDLLImportStorageClass() && !GV.getName().startswith("llvm.") &&
           !GV.hasAtLeastLocalUnnamedAddr())
         OutStreamer->EmitAddrsigSym(getSymbol(&GV));
   }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D51199.162303.patch
Type: text/x-patch
Size: 1693 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180823/ca7344f6/attachment.bin>


More information about the llvm-commits mailing list