diff options
author | Bruno Cardoso Lopes <bruno.cardoso@gmail.com> | 2007-11-12 19:49:57 +0000 |
---|---|---|
committer | Bruno Cardoso Lopes <bruno.cardoso@gmail.com> | 2007-11-12 19:49:57 +0000 |
commit | b439132d1629a30415e425872cf1d27b80c127f6 (patch) | |
tree | 437aa856df60ba0f7c8ca2f5c37a91e1a94af4aa /llvm/lib/Target/Mips/MipsAsmPrinter.cpp | |
parent | 040f696bfc6064b5dc678b47bb475bc84a712fcb (diff) | |
download | bcm5719-llvm-b439132d1629a30415e425872cf1d27b80c127f6.tar.gz bcm5719-llvm-b439132d1629a30415e425872cf1d27b80c127f6.zip |
Added JumpTable support
Fixed some AsmPrinter issues
Added GLOBAL_OFFSET_TABLE Node handle.
llvm-svn: 44024
Diffstat (limited to 'llvm/lib/Target/Mips/MipsAsmPrinter.cpp')
-rw-r--r-- | llvm/lib/Target/Mips/MipsAsmPrinter.cpp | 82 |
1 files changed, 57 insertions, 25 deletions
diff --git a/llvm/lib/Target/Mips/MipsAsmPrinter.cpp b/llvm/lib/Target/Mips/MipsAsmPrinter.cpp index 2dc9c2f2663..4a934b5f3fc 100644 --- a/llvm/lib/Target/Mips/MipsAsmPrinter.cpp +++ b/llvm/lib/Target/Mips/MipsAsmPrinter.cpp @@ -29,6 +29,7 @@ #include "llvm/Target/TargetAsmInfo.h" #include "llvm/Target/TargetData.h" #include "llvm/Target/TargetMachine.h" +#include "llvm/Target/TargetOptions.h" #include "llvm/Support/Mangler.h" #include "llvm/ADT/Statistic.h" #include "llvm/ADT/SetVector.h" @@ -237,9 +238,8 @@ emitFunctionStart(MachineFunction &MF) const Function *F = MF.getFunction(); SwitchToTextSection(getSectionForFunction(*F).c_str(), F); - // On Mips GAS, if .align #n is present, #n means the number of bits - // to be cleared. So, if we want 4 byte alignment, we must have .align 2 - EmitAlignment(1, F); + // 2 bits aligned + EmitAlignment(2, F); O << "\t.globl\t" << CurrentFnName << "\n"; O << "\t.ent\t" << CurrentFnName << "\n"; @@ -280,6 +280,9 @@ runOnMachineFunction(MachineFunction &MF) // Print out constants referenced by the function EmitConstantPool(MF.getConstantPool()); + // Print out jump tables referenced by the function + EmitJumpTableInfo(MF.getJumpTableInfo(), MF); + O << "\n\n"; // What's my mangled name? @@ -388,6 +391,11 @@ printOperand(const MachineInstr *MI, int opNum) O << MO.getSymbolName(); break; + case MachineOperand::MO_JumpTableIndex: + O << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber() + << '_' << MO.getJumpTableIndex(); + break; + // FIXME: Verify correct case MachineOperand::MO_ConstantPoolIndex: O << TAI->getPrivateGlobalPrefix() << "CPI" @@ -450,19 +458,30 @@ doFinalization(Module &M) std::string name = Mang->getValueName(I); Constant *C = I->getInitializer(); unsigned Size = TD->getABITypeSize(C->getType()); - unsigned Align = TD->getPrefTypeAlignment(C->getType()); + unsigned Align = TD->getPreferredAlignmentLog(I); + // Is this correct ? if (C->isNullValue() && (I->hasLinkOnceLinkage() || - I->hasInternalLinkage() || I->hasWeakLinkage() - /* FIXME: Verify correct */)) { - - SwitchToDataSection(".data", I); - if (I->hasInternalLinkage()) - O << "\t.local " << name << "\n"; - - O << "\t.comm " << name << "," - << TD->getABITypeSize(C->getType()) - << "," << Align << "\n"; + I->hasInternalLinkage() || I->hasWeakLinkage())) + { + if (Size == 0) Size = 1; // .comm Foo, 0 is undefined, avoid it. + + if (!NoZerosInBSS && TAI->getBSSSection()) + SwitchToDataSection(TAI->getBSSSection(), I); + else + SwitchToDataSection(TAI->getDataSection(), I); + + if (I->hasInternalLinkage()) { + if (TAI->getLCOMMDirective()) + O << TAI->getLCOMMDirective() << name << "," << Size; + else + O << "\t.local\t" << name << "\n"; + } else { + O << TAI->getCOMMDirective() << name << "," << Size; + // The .comm alignment in bytes. + if (TAI->getCOMMDirectiveTakesAlignment()) + O << "," << (1 << Align); + } } else { @@ -483,24 +502,37 @@ doFinalization(Module &M) // something. For now, just emit them as external. case GlobalValue::ExternalLinkage: // If external or appending, declare as a global symbol - O << "\t.globl " << name << "\n"; + O << TAI->getGlobalDirective() << name << "\n"; + // Fall Through case GlobalValue::InternalLinkage: - if (C->isNullValue()) - SwitchToDataSection(".bss", I); - else - SwitchToDataSection(".data", I); + // FIXME: special handling for ".ctors" & ".dtors" sections + if (I->hasSection() && (I->getSection() == ".ctors" || + I->getSection() == ".dtors")) { + std::string SectionName = ".section " + I->getSection(); + SectionName += ",\"aw\",%progbits"; + SwitchToDataSection(SectionName.c_str()); + } else { + if (C->isNullValue() && !NoZerosInBSS && TAI->getBSSSection()) + SwitchToDataSection(TAI->getBSSSection(), I); + else if (!I->isConstant()) + SwitchToDataSection(TAI->getDataSection(), I); + else { + // Read-only data. + if (TAI->getReadOnlySection()) + SwitchToDataSection(TAI->getReadOnlySection(), I); + else + SwitchToDataSection(TAI->getDataSection(), I); + } + } break; case GlobalValue::GhostLinkage: - cerr << "Should not have any" - << "unmaterialized functions!\n"; + cerr << "Should not have any unmaterialized functions!\n"; abort(); case GlobalValue::DLLImportLinkage: - cerr << "DLLImport linkage is" - << "not supported by this target!\n"; + cerr << "DLLImport linkage is not supported by this target!\n"; abort(); case GlobalValue::DLLExportLinkage: - cerr << "DLLExport linkage is" - << "not supported by this target!\n"; + cerr << "DLLExport linkage is not supported by this target!\n"; abort(); default: assert(0 && "Unknown linkage type!"); |