hoist handling of external globals and special globals up to common code.

This makes a similar code dead in all the other targets, I'll clean it up
in a bit.

This also moves handling of lcomm up before acquisition of a section,
since lcomm never needs a section.

llvm-svn: 93851
This commit is contained in:
Chris Lattner 2010-01-19 04:39:15 +00:00
parent e9d28b19cf
commit 6a160517a0
5 changed files with 62 additions and 74 deletions

View File

@ -240,6 +240,9 @@ namespace llvm {
///
void EmitJumpTableInfo(MachineJumpTableInfo *MJTI, MachineFunction &MF);
/// EmitGlobalVariable - Emit the specified global variable to the .s file.
void EmitGlobalVariable(const GlobalVariable *GV);
/// EmitSpecialLLVMGlobal - Check to see if the specified global is a
/// special global used by LLVM. If so, emit it and return true, otherwise
/// do nothing and return false.

View File

@ -135,11 +135,25 @@ bool AsmPrinter::doInitialization(Module &M) {
return false;
}
/// EmitGlobalVariable - Emit the specified global variable to the .s file.
void AsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
if (!GV->hasInitializer()) // External globals require no code.
return;
// Check to see if this is a special global used by LLVM, if so, emit it.
if (EmitSpecialLLVMGlobal(GV))
return;
// Let the target emit it.
PrintGlobalVariable(GV);
}
bool AsmPrinter::doFinalization(Module &M) {
// Emit global variables.
for (Module::const_global_iterator I = M.global_begin(), E = M.global_end();
I != E; ++I)
PrintGlobalVariable(I);
EmitGlobalVariable(I);
// Emit final debug information.
if (MAI->doesSupportDebugInformation() || MAI->doesSupportExceptionHandling())

View File

@ -1167,13 +1167,6 @@ void ARMAsmPrinter::EmitStartOfAsmFile(Module &M) {
void ARMAsmPrinter::PrintGlobalVariable(const GlobalVariable* GVar) {
const TargetData *TD = TM.getTargetData();
if (!GVar->hasInitializer()) // External global require no code
return;
// Check to see if this is a special global used by LLVM, if so, emit it.
if (EmitSpecialLLVMGlobal(GVar))
return;
MCSymbol *GVarSym = GetGlobalValueSymbol(GVar);
Constant *C = GVar->getInitializer();
@ -1206,25 +1199,12 @@ void ARMAsmPrinter::PrintGlobalVariable(const GlobalVariable* GVar) {
return;
}
const MCSection *TheSection =
getObjFileLowering().SectionForGlobal(GVar, GVKind, Mang, TM);
// Handle the zerofill directive on darwin, which is a special form of BSS
// emission.
if (GVKind.isBSSExtern() && MAI->hasMachoZeroFillDirective()) {
// .globl _foo
OutStreamer.EmitSymbolAttribute(GVarSym, MCStreamer::Global);
// .zerofill __DATA, __common, _foo, 400, 5
OutStreamer.EmitZerofill(TheSection, GVarSym, Size, 1 << Align);
return;
}
if (GVKind.isBSSLocal()) {
if (Size == 0) Size = 1; // .comm Foo, 0 is undefined, avoid it.
if (isDarwin) {
O << MAI->getLCOMMDirective() << *GVarSym << ',' << Size
<< ',' << Align;
<< ',' << Align;
} else if (MAI->getLCOMMDirective() != NULL) {
O << MAI->getLCOMMDirective() << *GVarSym << "," << Size;
} else {
@ -1242,7 +1222,20 @@ void ARMAsmPrinter::PrintGlobalVariable(const GlobalVariable* GVar) {
O << "\n";
return;
}
const MCSection *TheSection =
getObjFileLowering().SectionForGlobal(GVar, GVKind, Mang, TM);
// Handle the zerofill directive on darwin, which is a special form of BSS
// emission.
if (GVKind.isBSSExtern() && MAI->hasMachoZeroFillDirective()) {
// .globl _foo
OutStreamer.EmitSymbolAttribute(GVarSym, MCStreamer::Global);
// .zerofill __DATA, __common, _foo, 400, 5
OutStreamer.EmitZerofill(TheSection, GVarSym, Size, 1 << Align);
return;
}
OutStreamer.SwitchSection(TheSection);
switch (GVar->getLinkage()) {

View File

@ -697,14 +697,6 @@ bool PPCLinuxAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
void PPCLinuxAsmPrinter::PrintGlobalVariable(const GlobalVariable *GVar) {
const TargetData *TD = TM.getTargetData();
if (!GVar->hasInitializer())
return; // External global require no code
// Check to see if this is a special global used by LLVM, if so, emit it.
if (EmitSpecialLLVMGlobal(GVar))
return;
MCSymbol *GVarSym = GetGlobalValueSymbol(GVar);
printVisibility(GVarSym, GVar->getVisibility());
@ -929,13 +921,6 @@ void PPCDarwinAsmPrinter::EmitStartOfAsmFile(Module &M) {
void PPCDarwinAsmPrinter::PrintGlobalVariable(const GlobalVariable *GVar) {
const TargetData *TD = TM.getTargetData();
if (!GVar->hasInitializer())
return; // External global require no code
// Check to see if this is a special global used by LLVM, if so, emit it.
if (EmitSpecialLLVMGlobal(GVar))
return;
MCSymbol *GVarSym = GetGlobalValueSymbol(GVar);
printVisibility(GVarSym, GVar->getVisibility());
@ -963,6 +948,20 @@ void PPCDarwinAsmPrinter::PrintGlobalVariable(const GlobalVariable *GVar) {
return;
}
if (GVKind.isBSSLocal()) {
if (Size == 0) Size = 1; // .comm Foo, 0 is undefined, avoid it.
O << MAI->getLCOMMDirective() << *GVarSym << ',' << Size << ',' << Align;
if (VerboseAsm) {
O << "\t\t" << MAI->getCommentString() << " '";
WriteAsOperand(O, GVar, /*PrintType=*/false, GVar->getParent());
O << "'";
}
O << '\n';
return;
}
const MCSection *TheSection =
getObjFileLowering().SectionForGlobal(GVar, GVKind, Mang, TM);
@ -976,20 +975,6 @@ void PPCDarwinAsmPrinter::PrintGlobalVariable(const GlobalVariable *GVar) {
return;
}
if (GVKind.isBSSLocal()) {
if (Size == 0) Size = 1; // .comm Foo, 0 is undefined, avoid it.
O << MAI->getLCOMMDirective() << *GVarSym << ',' << Size << ',' << Align;
if (VerboseAsm) {
O << "\t\t" << MAI->getCommentString() << " '";
WriteAsOperand(O, GVar, /*PrintType=*/false, GVar->getParent());
O << "'";
}
O << '\n';
return;
}
OutStreamer.SwitchSection(TheSection);
switch (GVar->getLinkage()) {

View File

@ -647,13 +647,6 @@ void X86AsmPrinter::printMachineInstruction(const MachineInstr *MI) {
}
void X86AsmPrinter::PrintGlobalVariable(const GlobalVariable* GVar) {
if (!GVar->hasInitializer())
return; // External global require no code
// Check to see if this is a special global used by LLVM, if so, emit it.
if (EmitSpecialLLVMGlobal(GVar))
return;
const TargetData *TD = TM.getTargetData();
MCSymbol *GVarSym = GetGlobalValueSymbol(GVar);
@ -686,22 +679,9 @@ void X86AsmPrinter::PrintGlobalVariable(const GlobalVariable* GVar) {
return;
}
const MCSection *TheSection =
getObjFileLowering().SectionForGlobal(GVar, GVKind, Mang, TM);
// Handle the zerofill directive on darwin, which is a special form of BSS
// emission.
if (GVKind.isBSSExtern() && MAI->hasMachoZeroFillDirective()) {
// .globl _foo
OutStreamer.EmitSymbolAttribute(GVarSym, MCStreamer::Global);
// .zerofill __DATA, __common, _foo, 400, 5
OutStreamer.EmitZerofill(TheSection, GVarSym, Size, 1 << Align);
return;
}
if (GVKind.isBSSLocal()) {
if (Size == 0) Size = 1; // .comm Foo, 0 is undefined, avoid it.
if (const char *LComm = MAI->getLCOMMDirective()) {
if (GVar->hasLocalLinkage()) {
O << LComm << *GVarSym << ',' << Size;
@ -723,6 +703,19 @@ void X86AsmPrinter::PrintGlobalVariable(const GlobalVariable* GVar) {
O << '\n';
return;
}
const MCSection *TheSection =
getObjFileLowering().SectionForGlobal(GVar, GVKind, Mang, TM);
// Handle the zerofill directive on darwin, which is a special form of BSS
// emission.
if (GVKind.isBSSExtern() && MAI->hasMachoZeroFillDirective()) {
// .globl _foo
OutStreamer.EmitSymbolAttribute(GVarSym, MCStreamer::Global);
// .zerofill __DATA, __common, _foo, 400, 5
OutStreamer.EmitZerofill(TheSection, GVarSym, Size, 1 << Align);
return;
}
OutStreamer.SwitchSection(TheSection);