summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2016-05-16 21:14:24 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2016-05-16 21:14:24 +0000
commite64619ce6e9a67354668790e842d9313e3ac6e74 (patch)
tree5c9d3dbfd5a7aac81b553919df823caa0340f243
parent01704bb1dbc3febdd7eb09ed0cd8f3ee65be5e98 (diff)
downloadbcm5719-llvm-e64619ce6e9a67354668790e842d9313e3ac6e74.tar.gz
bcm5719-llvm-e64619ce6e9a67354668790e842d9313e3ac6e74.zip
Fail early on unknown appending linkage variables.
In practice only a few well known appending linkage variables work. Currently if codegen sees an unknown appending linkage variable it will just print it as a regular global. That is wrong as the symbol in the produced object file has different semantics as the one provided by the appending linkage. This just errors early instead of producing a broken .o. llvm-svn: 269706
-rw-r--r--llvm/docs/LangRef.rst5
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp9
-rw-r--r--llvm/test/CodeGen/X86/2007-08-13-AppendingLinkage.ll12
-rw-r--r--llvm/test/CodeGen/X86/AppendingLinkage.ll4
4 files changed, 12 insertions, 18 deletions
diff --git a/llvm/docs/LangRef.rst b/llvm/docs/LangRef.rst
index a9b79ec502e..afc27af47f8 100644
--- a/llvm/docs/LangRef.rst
+++ b/llvm/docs/LangRef.rst
@@ -250,6 +250,11 @@ linkage:
together. This is the LLVM, typesafe, equivalent of having the
system linker append together "sections" with identical names when
.o files are linked.
+
+ Unfortunately this doesn't correspond to any feature in .o files, so it
+ can only be used for variables like ``llvm.global_ctors`` which llvm
+ interprets specially.
+
``extern_weak``
The semantics of this linkage follow the ELF object file model: the
symbol is weak until linked, if not linked, the symbol becomes null
diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
index ed16eea8270..e9335054275 100644
--- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
@@ -318,17 +318,14 @@ void AsmPrinter::EmitLinkage(const GlobalValue *GV, MCSymbol *GVSym) const {
OutStreamer->EmitSymbolAttribute(GVSym, MCSA_Weak);
}
return;
- case GlobalValue::AppendingLinkage:
- // FIXME: appending linkage variables should go into a section of
- // their name or something. For now, just emit them as external.
case GlobalValue::ExternalLinkage:
- // If external or appending, declare as a global symbol.
- // .globl _foo
+ // If external, declare as a global symbol: .globl _foo
OutStreamer->EmitSymbolAttribute(GVSym, MCSA_Global);
return;
case GlobalValue::PrivateLinkage:
case GlobalValue::InternalLinkage:
return;
+ case GlobalValue::AppendingLinkage:
case GlobalValue::AvailableExternallyLinkage:
case GlobalValue::ExternalWeakLinkage:
llvm_unreachable("Should never emit this");
@@ -1562,7 +1559,7 @@ bool AsmPrinter::EmitSpecialLLVMGlobal(const GlobalVariable *GV) {
return true;
}
- return false;
+ report_fatal_error("unknown special variable");
}
/// EmitLLVMUsedList - For targets that define a MAI::UsedDirective, mark each
diff --git a/llvm/test/CodeGen/X86/2007-08-13-AppendingLinkage.ll b/llvm/test/CodeGen/X86/2007-08-13-AppendingLinkage.ll
deleted file mode 100644
index e08a5c493b5..00000000000
--- a/llvm/test/CodeGen/X86/2007-08-13-AppendingLinkage.ll
+++ /dev/null
@@ -1,12 +0,0 @@
-; RUN: llc < %s -march=x86 | not grep drectve
-; PR1607
-
-%hlvm_programs_element = type { i8*, i32 (i32, i8**)* }
-@hlvm_programs = appending constant [1 x %hlvm_programs_element]
-zeroinitializer
-
-define %hlvm_programs_element* @hlvm_get_programs() {
-entry:
- ret %hlvm_programs_element* getelementptr([1 x %hlvm_programs_element], [1 x %hlvm_programs_element]*
- @hlvm_programs, i32 0, i32 0)
-}
diff --git a/llvm/test/CodeGen/X86/AppendingLinkage.ll b/llvm/test/CodeGen/X86/AppendingLinkage.ll
new file mode 100644
index 00000000000..1a49287d1b3
--- /dev/null
+++ b/llvm/test/CodeGen/X86/AppendingLinkage.ll
@@ -0,0 +1,4 @@
+; RUN: not llc < %s -march=x86 2>&1 | FileCheck %s
+
+; CHECK: unknown special variable
+@foo = appending constant [1 x i32 ]zeroinitializer
OpenPOWER on IntegriCloud