diff options
author | Chris Lattner <sabre@nondot.org> | 2010-01-19 06:25:51 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-01-19 06:25:51 +0000 |
commit | 814819f6ea7fb0638fe73920299fda0da941a59e (patch) | |
tree | b8e9a2368cf9e4ee1579017f894644b088f65b53 | |
parent | 258281d8ac7b6ab61d64948340038e5f6692e3c0 (diff) | |
download | external_llvm-814819f6ea7fb0638fe73920299fda0da941a59e.zip external_llvm-814819f6ea7fb0638fe73920299fda0da941a59e.tar.gz external_llvm-814819f6ea7fb0638fe73920299fda0da941a59e.tar.bz2 |
stop using the .lcomm pseudoop on darwin, instead, directly use the
.zerofill directive. Streamerize its generation.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@93868 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/MC/MCAsmInfo.h | 9 | ||||
-rw-r--r-- | include/llvm/Target/TargetLoweringObjectFile.h | 1 | ||||
-rw-r--r-- | lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 31 | ||||
-rw-r--r-- | lib/MC/MCAsmInfo.cpp | 1 | ||||
-rw-r--r-- | lib/MC/MCAsmInfoDarwin.cpp | 4 | ||||
-rw-r--r-- | lib/Target/TargetLoweringObjectFile.cpp | 16 |
6 files changed, 38 insertions, 24 deletions
diff --git a/include/llvm/MC/MCAsmInfo.h b/include/llvm/MC/MCAsmInfo.h index 22f1475..82a4787 100644 --- a/include/llvm/MC/MCAsmInfo.h +++ b/include/llvm/MC/MCAsmInfo.h @@ -192,7 +192,7 @@ namespace llvm { /// LCOMMDirective - This is the name of a directive (if supported) that can /// be used to efficiently declare a local (internal) block of zero /// initialized data in the .bss/.data section. The syntax expected is: - /// @verbatim <LCOMMDirective> SYMBOLNAME LENGTHINBYTES, ALIGNMENT + /// @verbatim <LCOMMDirective> SYMBOLNAME LENGTHINBYTES /// @endverbatim const char *LCOMMDirective; // Defaults to null. @@ -202,10 +202,6 @@ namespace llvm { /// argument that specifies the alignment of the declaration. bool COMMDirectiveTakesAlignment; // Defaults to true. - /// LCOMMDirectiveTakesAlignment - True if LCOMMDirective takes a third - /// argument that specifies the alignment of the declaration. - bool LCOMMDirectiveTakesAlignment; // Defaults to false. - /// HasDotTypeDotSizeDirective - True if the target has .type and .size /// directives, this is true for most ELF targets. bool HasDotTypeDotSizeDirective; // Defaults to true. @@ -418,9 +414,6 @@ namespace llvm { bool getCOMMDirectiveTakesAlignment() const { return COMMDirectiveTakesAlignment; } - bool getLCOMMDirectiveTakesAlignment() const { - return LCOMMDirectiveTakesAlignment; - } bool hasDotTypeDotSizeDirective() const { return HasDotTypeDotSizeDirective; } diff --git a/include/llvm/Target/TargetLoweringObjectFile.h b/include/llvm/Target/TargetLoweringObjectFile.h index 304518a..d3e5cf2 100644 --- a/include/llvm/Target/TargetLoweringObjectFile.h +++ b/include/llvm/Target/TargetLoweringObjectFile.h @@ -259,6 +259,7 @@ class TargetLoweringObjectFileMachO : public TargetLoweringObjectFile { const MCSection *ConstDataSection; const MCSection *DataCoalSection; const MCSection *DataCommonSection; + const MCSection *DataBSSSection; const MCSection *FourByteConstantSection; const MCSection *EightByteConstantSection; const MCSection *SixteenByteConstantSection; diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 411a0f0..fbbcc27 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -171,21 +171,34 @@ void AsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) { WriteAsOperand(O, GV, /*PrintType=*/false, GV->getParent()); O << '\n'; } + + // Handle common symbols. if (GVKind.isCommon()) { // .comm _foo, 42, 4 OutStreamer.EmitCommonSymbol(GVSym, Size, 1 << AlignLog); - } else if (const char *LComm = MAI->getLCOMMDirective()) { - // .lcomm _foo, 42, 4 + return; + } + + // Handle local BSS symbols. + if (MAI->hasMachoZeroFillDirective()) { + const MCSection *TheSection = + getObjFileLowering().SectionForGlobal(GV, GVKind, Mang, TM); + // .zerofill __DATA, __bss, _foo, 400, 5 + OutStreamer.EmitZerofill(TheSection, GVSym, Size, 1 << AlignLog); + return; + } + + if (const char *LComm = MAI->getLCOMMDirective()) { + // .lcomm _foo, 42 O << LComm << *GVSym << ',' << Size; - if (MAI->getLCOMMDirectiveTakesAlignment()) - O << ',' << AlignLog; O << '\n'; - } else { - // .local _foo - O << "\t.local\t" << *GVSym << '\n'; - // .comm _foo, 42, 4 - OutStreamer.EmitCommonSymbol(GVSym, Size, 1 << AlignLog); + return; } + + // .local _foo + O << "\t.local\t" << *GVSym << '\n'; + // .comm _foo, 42, 4 + OutStreamer.EmitCommonSymbol(GVSym, Size, 1 << AlignLog); return; } diff --git a/lib/MC/MCAsmInfo.cpp b/lib/MC/MCAsmInfo.cpp index 556b0aa..731ccf9 100644 --- a/lib/MC/MCAsmInfo.cpp +++ b/lib/MC/MCAsmInfo.cpp @@ -56,7 +56,6 @@ MCAsmInfo::MCAsmInfo() { LCOMMDirective = 0; COMMDirective = "\t.comm\t"; COMMDirectiveTakesAlignment = true; - LCOMMDirectiveTakesAlignment = false; HasDotTypeDotSizeDirective = true; HasSingleParameterDotFile = true; UsedDirective = 0; diff --git a/lib/MC/MCAsmInfoDarwin.cpp b/lib/MC/MCAsmInfoDarwin.cpp index a1f6051..664a55c 100644 --- a/lib/MC/MCAsmInfoDarwin.cpp +++ b/lib/MC/MCAsmInfoDarwin.cpp @@ -33,15 +33,15 @@ MCAsmInfoDarwin::MCAsmInfoDarwin() { WeakDefDirective = "\t.weak_definition "; WeakRefDirective = "\t.weak_reference "; HiddenDirective = "\t.private_extern "; - LCOMMDirective = "\t.lcomm\t"; ZeroDirective = "\t.space\t"; // ".space N" emits N zeros. HasMachoZeroFillDirective = true; // Uses .zerofill HasStaticCtorDtorReferenceInStaticMode = true; - LCOMMDirectiveTakesAlignment = true; SetDirective = "\t.set"; ProtectedDirective = "\t.globl\t"; HasDotTypeDotSizeDirective = false; UsedDirective = "\t.no_dead_strip\t"; + // Note: Even though darwin has the .lcomm directive, it is just a synonym for + // zerofill, so we prefer to use .zerofill. // _foo.eh symbols are currently always exported so that the linker knows // about them. This is not necessary on 10.6 and later, but it diff --git a/lib/Target/TargetLoweringObjectFile.cpp b/lib/Target/TargetLoweringObjectFile.cpp index 77203e0..01fb217 100644 --- a/lib/Target/TargetLoweringObjectFile.cpp +++ b/lib/Target/TargetLoweringObjectFile.cpp @@ -761,16 +761,19 @@ void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx, ConstDataCoalSection = getMachOSection("__DATA","__const_coal", MCSectionMachO::S_COALESCED, SectionKind::getText()); - DataCommonSection - = getMachOSection("__DATA","__common", MCSectionMachO::S_ZEROFILL, - SectionKind::getBSS()); ConstDataSection // .const_data = getMachOSection("__DATA", "__const", 0, SectionKind::getReadOnlyWithRel()); DataCoalSection = getMachOSection("__DATA","__datacoal_nt", MCSectionMachO::S_COALESCED, SectionKind::getDataRel()); - + DataCommonSection + = getMachOSection("__DATA","__common", MCSectionMachO::S_ZEROFILL, + SectionKind::getBSS()); + DataBSSSection + = getMachOSection("__DATA","__bss", MCSectionMachO::S_ZEROFILL, + SectionKind::getBSS()); + LazySymbolPointerSection = getMachOSection("__DATA", "__la_symbol_ptr", @@ -933,6 +936,11 @@ SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, // DATA, __common section with the .zerofill directive. if (Kind.isBSSExtern()) return DataCommonSection; + + // Put zero initialized globals with local linkage in __DATA,__bss directive + // with the .zerofill directive (aka .lcomm). + if (Kind.isBSSLocal()) + return DataBSSSection; // Otherwise, just drop the variable in the normal data section. return DataSection; |