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
This commit is contained in:
parent
01704bb1db
commit
e64619ce6e
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
}
|
|
@ -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
|
Loading…
Reference in New Issue