mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-25 13:24:46 +00:00
Now that we have everything nicely factored (e.g. asmprinter is not
doing global variable classification anymore) and hookized, sink almost all target targets global variable emission code into AsmPrinter and out of each target. Some notes: 1. PIC16 does completely custom and crazy stuff, so it is not changed. 2. XCore has some custom handling for extra directives. I'll look at it next. 3. This switches linux/ppc to use .globl instead of .global. If .globl is actually wrong, let me know and I'll fix it. 4. This makes linux/ppc get a lot of random cases right which were obviously wrong before, it is probably now a bit healthier. 5. Blackfin will probably start getting .comm and other things that it didn't before. If this is undesirable, it should explicitly opt out of these things by clearing the relevant fields of MCAsmInfo. This leads to a nice diffstat: 14 files changed, 127 insertions(+), 830 deletions(-) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@93858 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -70,7 +70,6 @@ namespace {
|
||||
const char *Modifier = 0);
|
||||
void printFCCOperand(const MachineInstr *MI, int opNum,
|
||||
const char *Modifier = 0);
|
||||
void PrintGlobalVariable(const GlobalVariable *GVar);
|
||||
void printSavedRegsBitmask(MachineFunction &MF);
|
||||
void printHex32(unsigned int Value);
|
||||
|
||||
@@ -423,98 +422,6 @@ void MipsAsmPrinter::EmitStartOfAsmFile(Module &M) {
|
||||
O << "\t.previous" << '\n';
|
||||
}
|
||||
|
||||
void MipsAsmPrinter::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;
|
||||
|
||||
O << "\n\n";
|
||||
MCSymbol *GVarSym = GetGlobalValueSymbol(GVar);
|
||||
Constant *C = GVar->getInitializer();
|
||||
const Type *CTy = C->getType();
|
||||
unsigned Size = TD->getTypeAllocSize(CTy);
|
||||
|
||||
// A data structure or array is aligned in memory to the largest
|
||||
// alignment boundary required by any data type inside it (this matches
|
||||
// the Preferred Type Alignment). For integral types, the alignment is
|
||||
// the type size.
|
||||
unsigned Align;
|
||||
if (CTy->getTypeID() == Type::IntegerTyID ||
|
||||
CTy->getTypeID() == Type::VoidTyID) {
|
||||
assert(!(Size & (Size-1)) && "Alignment is not a power of two!");
|
||||
Align = Log2_32(Size);
|
||||
} else
|
||||
Align = TD->getPreferredTypeAlignmentShift(CTy);
|
||||
|
||||
printVisibility(GVarSym, GVar->getVisibility());
|
||||
|
||||
OutStreamer.SwitchSection(getObjFileLowering().SectionForGlobal(GVar, Mang,
|
||||
TM));
|
||||
|
||||
if (C->isNullValue() && !GVar->hasSection()) {
|
||||
if (!GVar->isThreadLocal() &&
|
||||
(GVar->hasLocalLinkage() || GVar->isWeakForLinker())) {
|
||||
if (Size == 0) Size = 1; // .comm Foo, 0 is undefined, avoid it.
|
||||
|
||||
if (GVar->hasLocalLinkage())
|
||||
O << "\t.local\t" << *GVarSym << '\n';
|
||||
|
||||
O << MAI->getCOMMDirective() << *GVarSym << ',' << Size;
|
||||
if (MAI->getCOMMDirectiveTakesAlignment())
|
||||
O << ',' << (1 << Align);
|
||||
|
||||
O << '\n';
|
||||
return;
|
||||
}
|
||||
}
|
||||
switch (GVar->getLinkage()) {
|
||||
case GlobalValue::LinkOnceAnyLinkage:
|
||||
case GlobalValue::LinkOnceODRLinkage:
|
||||
case GlobalValue::CommonLinkage:
|
||||
case GlobalValue::WeakAnyLinkage:
|
||||
case GlobalValue::WeakODRLinkage:
|
||||
// FIXME: Verify correct for weak.
|
||||
// Nonnull linkonce -> weak
|
||||
O << "\t.weak " << *GVarSym << '\n';
|
||||
break;
|
||||
case GlobalValue::AppendingLinkage:
|
||||
// FIXME: appending linkage variables should go into a section of their name
|
||||
// or something. For now, just emit them as external.
|
||||
case GlobalValue::ExternalLinkage:
|
||||
// If external or appending, declare as a global symbol
|
||||
O << MAI->getGlobalDirective() << *GVarSym << '\n';
|
||||
// Fall Through
|
||||
case GlobalValue::PrivateLinkage:
|
||||
case GlobalValue::LinkerPrivateLinkage:
|
||||
case GlobalValue::InternalLinkage:
|
||||
break;
|
||||
case GlobalValue::GhostLinkage:
|
||||
llvm_unreachable("Should not have any unmaterialized functions!");
|
||||
case GlobalValue::DLLImportLinkage:
|
||||
llvm_unreachable("DLLImport linkage is not supported by this target!");
|
||||
case GlobalValue::DLLExportLinkage:
|
||||
llvm_unreachable("DLLExport linkage is not supported by this target!");
|
||||
default:
|
||||
llvm_unreachable("Unknown linkage type!");
|
||||
}
|
||||
|
||||
EmitAlignment(Align, GVar);
|
||||
|
||||
if (MAI->hasDotTypeDotSizeDirective()) {
|
||||
O << "\t.type " << *GVarSym << ",@object\n";
|
||||
O << "\t.size " << *GVarSym << ',' << Size << '\n';
|
||||
}
|
||||
|
||||
O << *GVarSym << ":\n";
|
||||
EmitGlobalConstant(C);
|
||||
}
|
||||
|
||||
|
||||
// Force static initialization.
|
||||
extern "C" void LLVMInitializeMipsAsmPrinter() {
|
||||
RegisterAsmPrinter<MipsAsmPrinter> X(TheMipsTarget);
|
||||
|
Reference in New Issue
Block a user