diff --git a/llvm/lib/Target/Alpha/AlphaAsmPrinter.cpp b/llvm/lib/Target/Alpha/AlphaAsmPrinter.cpp index 4d4fb94ded2a..3e7d5e7bbcbf 100644 --- a/llvm/lib/Target/Alpha/AlphaAsmPrinter.cpp +++ b/llvm/lib/Target/Alpha/AlphaAsmPrinter.cpp @@ -49,6 +49,7 @@ namespace { /// typedef std::map ValueMapTy; ValueMapTy NumberForBB; + std::string CurSection; virtual const char *getPassName() const { return "Alpha Assembly Printer"; @@ -62,6 +63,7 @@ namespace { bool runOnMachineFunction(MachineFunction &F); bool doInitialization(Module &M); bool doFinalization(Module &M); + void SwitchSection(std::ostream &OS, const char *NewSection); }; } // end of anonymous namespace @@ -134,8 +136,13 @@ void AlphaAsmPrinter::printOp(const MachineOperand &MO, bool IsCallOp) { O << MO.getSymbolName(); return; - case MachineOperand::MO_GlobalAddress: - O << Mang->getValueName(MO.getGlobal()); + case MachineOperand::MO_GlobalAddress: + //Abuse PCrel to specify pcrel calls + //calls are the only thing that use this flag + if (MO.isPCRelative()) + O << "$" << Mang->getValueName(MO.getGlobal()) << "..ng"; + else + O << Mang->getValueName(MO.getGlobal()); return; default: @@ -169,8 +176,8 @@ bool AlphaAsmPrinter::runOnMachineFunction(MachineFunction &MF) { printConstantPool(MF.getConstantPool()); // Print out labels for the function. - O << "\t.text\n"; - emitAlignment(3); + SwitchSection(O, "text"); + emitAlignment(4); O << "\t.globl\t" << CurrentFnName << "\n"; O << "\t.ent\t" << CurrentFnName << "\n"; @@ -209,8 +216,9 @@ void AlphaAsmPrinter::printConstantPool(MachineConstantPool *MCP) { if (CP.empty()) return; + SwitchSection(O, "section .rodata"); for (unsigned i = 0, e = CP.size(); i != e; ++i) { - O << "\t.section\t.rodata\n"; + // SwitchSection(O, "section .rodata, \"dr\""); emitAlignment(TD.getTypeAlignmentShift(CP[i]->getType())); O << "CPI" << CurrentFnName << "_" << i << ":\t\t\t\t\t" << CommentString << *CP[i] << "\n"; @@ -229,18 +237,17 @@ bool AlphaAsmPrinter::doInitialization(Module &M) // SwitchSection - Switch to the specified section of the executable if we are // not already in it! // -static void SwitchSection(std::ostream &OS, std::string &CurSection, - const char *NewSection) { +void AlphaAsmPrinter::SwitchSection(std::ostream &OS, const char *NewSection) +{ if (CurSection != NewSection) { CurSection = NewSection; if (!CurSection.empty()) - OS << "\t" << NewSection << "\n"; + OS << "\t." << NewSection << "\n"; } } bool AlphaAsmPrinter::doFinalization(Module &M) { const TargetData &TD = TM.getTargetData(); - std::string CurSection; for (Module::const_global_iterator I = M.global_begin(), E = M.global_end(); I != E; ++I) if (I->hasInitializer()) { // External global require no code @@ -253,7 +260,7 @@ bool AlphaAsmPrinter::doFinalization(Module &M) { if (C->isNullValue() && (I->hasLinkOnceLinkage() || I->hasInternalLinkage() || I->hasWeakLinkage() /* FIXME: Verify correct */)) { - SwitchSection(O, CurSection, ".data"); + SwitchSection(O, "data"); if (I->hasInternalLinkage()) O << "\t.local " << name << "\n"; @@ -268,7 +275,7 @@ bool AlphaAsmPrinter::doFinalization(Module &M) { case GlobalValue::WeakLinkage: // FIXME: Verify correct for weak. // Nonnull linkonce -> weak O << "\t.weak " << name << "\n"; - SwitchSection(O, CurSection, ""); + SwitchSection(O, ""); O << "\t.section\t.llvm.linkonce.d." << name << ",\"aw\",@progbits\n"; break; case GlobalValue::AppendingLinkage: @@ -280,9 +287,9 @@ bool AlphaAsmPrinter::doFinalization(Module &M) { // FALL THROUGH case GlobalValue::InternalLinkage: if (C->isNullValue()) - SwitchSection(O, CurSection, ".data"); //was .bss + SwitchSection(O, "bss"); //was .bss else - SwitchSection(O, CurSection, ".data"); + SwitchSection(O, "data"); break; case GlobalValue::GhostLinkage: std::cerr << "GhostLinkage cannot appear in AlphaAsmPrinter!\n"; diff --git a/llvm/lib/Target/Alpha/AlphaISelPattern.cpp b/llvm/lib/Target/Alpha/AlphaISelPattern.cpp index 8f3752f964b8..e594c8664afc 100644 --- a/llvm/lib/Target/Alpha/AlphaISelPattern.cpp +++ b/llvm/lib/Target/Alpha/AlphaISelPattern.cpp @@ -1411,15 +1411,15 @@ unsigned ISel::SelectExpr(SDOperand N) { if (GlobalAddressSDNode *GASD = dyn_cast(N.getOperand(1))) { - //if (GASD->getGlobal()->isExternal()) { + if (GASD->getGlobal()->isExternal()) { //use safe calling convention AlphaLowering.restoreGP(BB); has_sym = true; - BuildMI(BB, Alpha::CALL, 1).addGlobalAddress(GASD->getGlobal(),true); - //} else { + BuildMI(BB, Alpha::CALL, 1).addGlobalAddress(GASD->getGlobal()); + } else { //use PC relative branch call - //BuildMI(BB, Alpha::BSR, 1, Alpha::R26).addGlobalAddress(GASD->getGlobal(),true); - //} + BuildMI(BB, Alpha::BSR, 1, Alpha::R26).addGlobalAddress(GASD->getGlobal(),true); + } } else if (ExternalSymbolSDNode *ESSDN = dyn_cast(N.getOperand(1))) diff --git a/llvm/lib/Target/Alpha/AlphaRegisterInfo.cpp b/llvm/lib/Target/Alpha/AlphaRegisterInfo.cpp index 96a05938f1a5..eb208a2f2b43 100644 --- a/llvm/lib/Target/Alpha/AlphaRegisterInfo.cpp +++ b/llvm/lib/Target/Alpha/AlphaRegisterInfo.cpp @@ -16,6 +16,7 @@ #include "AlphaRegisterInfo.h" #include "llvm/Constants.h" #include "llvm/Type.h" +#include "llvm/Function.h" #include "llvm/CodeGen/ValueTypes.h" #include "llvm/CodeGen/MachineInstrBuilder.h" #include "llvm/CodeGen/MachineFunction.h" @@ -213,7 +214,10 @@ void AlphaRegisterInfo::emitPrologue(MachineFunction &MF) const { //handle GOP offset MI = BuildMI(Alpha::LDGP, 0); MBB.insert(MBBI, MI); - + //evil const_cast until MO stuff setup to handle const + MI = BuildMI(Alpha::ALTENT, 1).addGlobalAddress(const_cast(MF.getFunction()), true); + MBB.insert(MBBI, MI); + // Get the number of bytes to allocate from the FrameInfo long NumBytes = MFI->getStackSize();