mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-24 20:29:53 +00:00
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@93851 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
71eae71315
commit
48d64ba9d8
@ -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.
|
||||
|
@ -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())
|
||||
|
@ -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()) {
|
||||
|
@ -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()) {
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user