mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-01 02:33:44 +00:00
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:
parent
258281d8ac
commit
814819f6ea
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
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;
|
||||
}
|
||||
|
||||
// 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;
|
||||
}
|
||||
|
||||
|
@ -56,7 +56,6 @@ MCAsmInfo::MCAsmInfo() {
|
||||
LCOMMDirective = 0;
|
||||
COMMDirective = "\t.comm\t";
|
||||
COMMDirectiveTakesAlignment = true;
|
||||
LCOMMDirectiveTakesAlignment = false;
|
||||
HasDotTypeDotSizeDirective = true;
|
||||
HasSingleParameterDotFile = true;
|
||||
UsedDirective = 0;
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user