mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-13 09:33:50 +00:00
Clarify common linkage and the requirements on it. Enforce
them in the verifier. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78160 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
831f6f6d2a
commit
26d054d903
@ -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_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>
|
||||
|
||||
<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>
|
||||
<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 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_appending">appending</a></b></tt>: </dt>
|
||||
<dd>"<tt>appending</tt>" linkage may only be applied to global variables of
|
||||
|
@ -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.
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user