diff options
-rw-r--r-- | docs/LangRef.html | 25 | ||||
-rw-r--r-- | lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp | 7 | ||||
-rw-r--r-- | lib/VMCore/Verifier.cpp | 7 |
3 files changed, 27 insertions, 12 deletions
diff --git a/docs/LangRef.html b/docs/LangRef.html index 33fc7d4..52ec978 100644 --- a/docs/LangRef.html +++ b/docs/LangRef.html @@ -552,19 +552,22 @@ define i32 @main() { <i>; i32()* </ translation unit that uses it. Unreferenced <tt>linkonce</tt> globals are allowed to be discarded.</dd> + <dt><tt><b><a name="linkage_weak">weak</a></b></tt>: </dt> + <dd>"<tt>weak</tt>" linkage has the same merging semantics as + <tt>linkonce</tt> linkage, except that unreferenced globals with + <tt>weak</tt> linkage may not be discarded. This is used for globals that + are declared "weak" in C source code.</dd> + <dt><tt><b><a name="linkage_common">common</a></b></tt>: </dt> - <dd>"<tt>common</tt>" linkage is exactly the same as <tt>linkonce</tt> - linkage, except that unreferenced <tt>common</tt> globals may not be - discarded. This is used for globals that may be emitted in multiple - translation units, but that are not guaranteed to be emitted into every - translation unit that uses them. One example of this is tentative - definitions in C, such as "<tt>int X;</tt>" at global scope.</dd> + <dd>"<tt>common</tt>" linkage is most similar to "<tt>weak</tt>" linkage, but + they are used for tentative definitions in C, such as "<tt>int X;</tt>" at + global scope. + Symbols with "<tt>common</tt>" linkage are merged in the same way as + <tt>weak symbols</tt>, and they may not be deleted if unreferenced. + Further, <tt>common</tt> symbols may not have an explicit section, and + must have a zero initializer. Functions and aliases may not have common + linkage.</dd> - <dt><tt><b><a name="linkage_weak">weak</a></b></tt>: </dt> - <dd>"<tt>weak</tt>" linkage is the same as <tt>common</tt> linkage, except - that some targets may choose to emit different assembly sequences for them - for target-dependent reasons. This is used for globals that are declared - "weak" in C source code.</dd> <dt><tt><b><a name="linkage_appending">appending</a></b></tt>: </dt> <dd>"<tt>appending</tt>" linkage may only be applied to global variables of diff --git a/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp b/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp index 2f56c2a..d5279ef 100644 --- a/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp +++ b/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp @@ -782,8 +782,13 @@ void X86ATTAsmPrinter::PrintGlobalVariable(const GlobalVariable* GVar) { if (Subtarget->isTargetELF()) O << "\t.type\t" << name << ",@object\n"; + + SectionKind GVKind = TargetLoweringObjectFile::getKindForGlobal(GVar, TM); + + + const MCSection *TheSection = - getObjFileLowering().SectionForGlobal(GVar, Mang, TM); + getObjFileLowering().SectionForGlobal(GVar, GVKind, Mang, TM); SwitchToSection(TheSection); // FIXME: get this stuff from section kind flags. diff --git a/lib/VMCore/Verifier.cpp b/lib/VMCore/Verifier.cpp index 2b83298..f50299b 100644 --- a/lib/VMCore/Verifier.cpp +++ b/lib/VMCore/Verifier.cpp @@ -378,6 +378,12 @@ void Verifier::visitGlobalVariable(GlobalVariable &GV) { "Global variable initializer type does not match global " "variable type!", &GV); + // If the global has common linkage, it must have a zero initializer. + if (GV.hasCommonLinkage()) + Assert1(GV.getInitializer()->isNullValue(), + "'common' global must have a zero initializer!", &GV); + + // Verify that any metadata used in a global initializer points only to // other globals. if (MDNode *FirstNode = dyn_cast<MDNode>(GV.getInitializer())) { @@ -544,6 +550,7 @@ void Verifier::visitFunction(Function &F) { const FunctionType *FT = F.getFunctionType(); unsigned NumArgs = F.arg_size(); + Assert1(!F.hasCommonLinkage(), "Functions may not have common linkage", &F); Assert2(FT->getNumParams() == NumArgs, "# formal arguments must match # of arguments for function type!", &F, FT); |