Skip to content

Commit

Permalink
Clarify common linkage and the requirements on it. Enforce
Browse files Browse the repository at this point in the history
them in the verifier.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78160 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
lattner committed Aug 5, 2009
1 parent 831f6f6 commit 26d054d
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 12 deletions.
25 changes: 14 additions & 11 deletions docs/LangRef.html
Original file line number Diff line number Diff line change
Expand Up @@ -552,19 +552,22 @@
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
Expand Down
7 changes: 6 additions & 1 deletion lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
7 changes: 7 additions & 0 deletions lib/VMCore/Verifier.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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())) {
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 26d054d

Please sign in to comment.