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
This commit is contained in:
Chris Lattner 2010-01-19 06:25:51 +00:00
parent 258281d8ac
commit 814819f6ea
6 changed files with 40 additions and 26 deletions

View File

@ -192,7 +192,7 @@ namespace llvm {
/// LCOMMDirective - This is the name of a directive (if supported) that can /// LCOMMDirective - This is the name of a directive (if supported) that can
/// be used to efficiently declare a local (internal) block of zero /// be used to efficiently declare a local (internal) block of zero
/// initialized data in the .bss/.data section. The syntax expected is: /// initialized data in the .bss/.data section. The syntax expected is:
/// @verbatim <LCOMMDirective> SYMBOLNAME LENGTHINBYTES, ALIGNMENT /// @verbatim <LCOMMDirective> SYMBOLNAME LENGTHINBYTES
/// @endverbatim /// @endverbatim
const char *LCOMMDirective; // Defaults to null. const char *LCOMMDirective; // Defaults to null.
@ -202,10 +202,6 @@ namespace llvm {
/// argument that specifies the alignment of the declaration. /// argument that specifies the alignment of the declaration.
bool COMMDirectiveTakesAlignment; // Defaults to true. 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 /// HasDotTypeDotSizeDirective - True if the target has .type and .size
/// directives, this is true for most ELF targets. /// directives, this is true for most ELF targets.
bool HasDotTypeDotSizeDirective; // Defaults to true. bool HasDotTypeDotSizeDirective; // Defaults to true.
@ -418,9 +414,6 @@ namespace llvm {
bool getCOMMDirectiveTakesAlignment() const { bool getCOMMDirectiveTakesAlignment() const {
return COMMDirectiveTakesAlignment; return COMMDirectiveTakesAlignment;
} }
bool getLCOMMDirectiveTakesAlignment() const {
return LCOMMDirectiveTakesAlignment;
}
bool hasDotTypeDotSizeDirective() const { bool hasDotTypeDotSizeDirective() const {
return HasDotTypeDotSizeDirective; return HasDotTypeDotSizeDirective;
} }

View File

@ -259,6 +259,7 @@ class TargetLoweringObjectFileMachO : public TargetLoweringObjectFile {
const MCSection *ConstDataSection; const MCSection *ConstDataSection;
const MCSection *DataCoalSection; const MCSection *DataCoalSection;
const MCSection *DataCommonSection; const MCSection *DataCommonSection;
const MCSection *DataBSSSection;
const MCSection *FourByteConstantSection; const MCSection *FourByteConstantSection;
const MCSection *EightByteConstantSection; const MCSection *EightByteConstantSection;
const MCSection *SixteenByteConstantSection; const MCSection *SixteenByteConstantSection;

View File

@ -171,21 +171,34 @@ void AsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
WriteAsOperand(O, GV, /*PrintType=*/false, GV->getParent()); WriteAsOperand(O, GV, /*PrintType=*/false, GV->getParent());
O << '\n'; O << '\n';
} }
// Handle common symbols.
if (GVKind.isCommon()) { if (GVKind.isCommon()) {
// .comm _foo, 42, 4 // .comm _foo, 42, 4
OutStreamer.EmitCommonSymbol(GVSym, Size, 1 << AlignLog); OutStreamer.EmitCommonSymbol(GVSym, Size, 1 << AlignLog);
} else if (const char *LComm = MAI->getLCOMMDirective()) { return;
// .lcomm _foo, 42, 4
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);
} }
// 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;
O << '\n';
return;
}
// .local _foo
O << "\t.local\t" << *GVSym << '\n';
// .comm _foo, 42, 4
OutStreamer.EmitCommonSymbol(GVSym, Size, 1 << AlignLog);
return; return;
} }

View File

@ -56,7 +56,6 @@ MCAsmInfo::MCAsmInfo() {
LCOMMDirective = 0; LCOMMDirective = 0;
COMMDirective = "\t.comm\t"; COMMDirective = "\t.comm\t";
COMMDirectiveTakesAlignment = true; COMMDirectiveTakesAlignment = true;
LCOMMDirectiveTakesAlignment = false;
HasDotTypeDotSizeDirective = true; HasDotTypeDotSizeDirective = true;
HasSingleParameterDotFile = true; HasSingleParameterDotFile = true;
UsedDirective = 0; UsedDirective = 0;

View File

@ -33,15 +33,15 @@ MCAsmInfoDarwin::MCAsmInfoDarwin() {
WeakDefDirective = "\t.weak_definition "; WeakDefDirective = "\t.weak_definition ";
WeakRefDirective = "\t.weak_reference "; WeakRefDirective = "\t.weak_reference ";
HiddenDirective = "\t.private_extern "; HiddenDirective = "\t.private_extern ";
LCOMMDirective = "\t.lcomm\t";
ZeroDirective = "\t.space\t"; // ".space N" emits N zeros. ZeroDirective = "\t.space\t"; // ".space N" emits N zeros.
HasMachoZeroFillDirective = true; // Uses .zerofill HasMachoZeroFillDirective = true; // Uses .zerofill
HasStaticCtorDtorReferenceInStaticMode = true; HasStaticCtorDtorReferenceInStaticMode = true;
LCOMMDirectiveTakesAlignment = true;
SetDirective = "\t.set"; SetDirective = "\t.set";
ProtectedDirective = "\t.globl\t"; ProtectedDirective = "\t.globl\t";
HasDotTypeDotSizeDirective = false; HasDotTypeDotSizeDirective = false;
UsedDirective = "\t.no_dead_strip\t"; 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 // _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 // about them. This is not necessary on 10.6 and later, but it

View File

@ -761,15 +761,18 @@ void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,
ConstDataCoalSection ConstDataCoalSection
= getMachOSection("__DATA","__const_coal", MCSectionMachO::S_COALESCED, = getMachOSection("__DATA","__const_coal", MCSectionMachO::S_COALESCED,
SectionKind::getText()); SectionKind::getText());
DataCommonSection
= getMachOSection("__DATA","__common", MCSectionMachO::S_ZEROFILL,
SectionKind::getBSS());
ConstDataSection // .const_data ConstDataSection // .const_data
= getMachOSection("__DATA", "__const", 0, = getMachOSection("__DATA", "__const", 0,
SectionKind::getReadOnlyWithRel()); SectionKind::getReadOnlyWithRel());
DataCoalSection DataCoalSection
= getMachOSection("__DATA","__datacoal_nt", MCSectionMachO::S_COALESCED, = getMachOSection("__DATA","__datacoal_nt", MCSectionMachO::S_COALESCED,
SectionKind::getDataRel()); SectionKind::getDataRel());
DataCommonSection
= getMachOSection("__DATA","__common", MCSectionMachO::S_ZEROFILL,
SectionKind::getBSS());
DataBSSSection
= getMachOSection("__DATA","__bss", MCSectionMachO::S_ZEROFILL,
SectionKind::getBSS());
LazySymbolPointerSection LazySymbolPointerSection
@ -934,6 +937,11 @@ SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
if (Kind.isBSSExtern()) if (Kind.isBSSExtern())
return DataCommonSection; 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. // Otherwise, just drop the variable in the normal data section.
return DataSection; return DataSection;
} }