diff --git a/lib/Target/PIC16/PIC16.h b/lib/Target/PIC16/PIC16.h index 04fb1720302..bf4421b2f2e 100644 --- a/lib/Target/PIC16/PIC16.h +++ b/lib/Target/PIC16/PIC16.h @@ -114,7 +114,7 @@ namespace PIC16CC { case TEMPS_LABEL: return ".temp."; case ARGS_LABEL: return ".args."; case RET_LABEL: return ".ret."; - case LIBCALL: return ".lib."; + case LIBCALL: return "__intrinsics"; case FRAME_SECTION: return ".fpdata."; case AUTOS_SECTION: return ".fadata."; case CODE_SECTION: return "code"; @@ -234,6 +234,12 @@ namespace PIC16CC { return o.str(); } + static std::string getDeclSectionName(void) { + std::string dsname = "decl_section.1"; + dsname = addPrefix(dsname); + return dsname; + } + inline static bool isLocalName (const std::string &Name) { if (getSymbolTag(Name) == AUTOS_LABEL) return true; diff --git a/lib/Target/PIC16/PIC16AsmPrinter.cpp b/lib/Target/PIC16/PIC16AsmPrinter.cpp index 1aebe09209c..f88d9e7e627 100644 --- a/lib/Target/PIC16/PIC16AsmPrinter.cpp +++ b/lib/Target/PIC16/PIC16AsmPrinter.cpp @@ -87,6 +87,7 @@ bool PIC16AsmPrinter::runOnMachineFunction(MachineFunction &MF) { CurLine = line; } } + // Print the assembly for the instruction. printMachineInstruction(II); } @@ -106,6 +107,8 @@ FunctionPass *llvm::createPIC16CodePrinterPass(raw_ostream &o, return new PIC16AsmPrinter(o, tm, tm.getTargetAsmInfo(), OptLevel, verbose); } + +// printOperand - print operand of insn. void PIC16AsmPrinter::printOperand(const MachineInstr *MI, int opNum) { const MachineOperand &MO = MI->getOperand(opNum); @@ -126,8 +129,14 @@ void PIC16AsmPrinter::printOperand(const MachineInstr *MI, int opNum) { break; } case MachineOperand::MO_ExternalSymbol: { - std::string Name = MO.getSymbolName(); - O << MO.getSymbolName(); + const char *Sname = MO.getSymbolName(); + + // If its a libcall name, record it to decls section. + if (PAN::getSymbolTag(Sname) == PAN::LIBCALL) { + Decls.push_back(Sname); + } + + O << Sname; break; } case MachineOperand::MO_MachineBasicBlock: @@ -144,6 +153,23 @@ void PIC16AsmPrinter::printCCOperand(const MachineInstr *MI, int opNum) { O << PIC16CondCodeToString((PIC16CC::CondCodes)CC); } +void PIC16AsmPrinter::printDecls(void) { + // If no libcalls used, return. + if (Decls.empty()) return; + + const Section *S = TAI->getNamedSection(PAN::getDeclSectionName().c_str()); + SwitchToSection(S); + // Remove duplicate entries. + Decls.sort(); + Decls.unique(); + for (std::list::const_iterator I = Decls.begin(); + I != Decls.end(); I++) { + O << TAI->getExternDirective() << *I << "\n"; + // FIXME: Use PAN::getXXXLabel() funtions hrer. + O << TAI->getExternDirective() << *I << ".args." << "\n"; + O << TAI->getExternDirective() << *I << ".ret." << "\n"; + } +} bool PIC16AsmPrinter::doInitialization (Module &M) { bool Result = AsmPrinter::doInitialization(M); @@ -188,7 +214,7 @@ void PIC16AsmPrinter::EmitExternsAndGlobals (Module &M) { // Emit header file to include declaration of library functions // FIXME: find out libcall names. - O << "\t#include C16IntrinsicCalls.INC\n"; + // O << "\t#include C16IntrinsicCalls.INC\n"; // Emit declarations for external variable declarations and definitions. for (Module::const_global_iterator I = M.global_begin(), E = M.global_end(); @@ -212,7 +238,6 @@ void PIC16AsmPrinter::EmitExternsAndGlobals (Module &M) { void PIC16AsmPrinter::EmitRomData (Module &M) { SwitchToSection(TAI->getReadOnlySection()); - IsRomData = true; for (Module::global_iterator I = M.global_begin(), E = M.global_end(); I != E; ++I) { if (!I->hasInitializer()) // External global require no code. @@ -238,10 +263,10 @@ void PIC16AsmPrinter::EmitRomData (Module &M) O << "\n"; } } - IsRomData = false; } bool PIC16AsmPrinter::doFinalization(Module &M) { + printDecls(); O << "\t" << "END\n"; bool Result = AsmPrinter::doFinalization(M); return Result; diff --git a/lib/Target/PIC16/PIC16AsmPrinter.h b/lib/Target/PIC16/PIC16AsmPrinter.h index 13a269b5fa3..2bc8a57e717 100644 --- a/lib/Target/PIC16/PIC16AsmPrinter.h +++ b/lib/Target/PIC16/PIC16AsmPrinter.h @@ -21,6 +21,8 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Target/TargetAsmInfo.h" #include "llvm/Target/TargetMachine.h" +#include +#include namespace llvm { struct VISIBILITY_HIDDEN PIC16AsmPrinter : public AsmPrinter { @@ -28,8 +30,6 @@ namespace llvm { const TargetAsmInfo *T, CodeGenOpt::Level OL, bool V) : AsmPrinter(O, TM, T, OL, V) { - FunctionLabelBegin = '@'; - IsRomData = false; PTLI = TM.getTargetLowering(); } private : @@ -46,6 +46,7 @@ namespace llvm { void EmitGlobalData (Module &M); void EmitRomData (Module &M); void emitFunctionData(MachineFunction &MF); + void printDecls(void); protected: bool doInitialization(Module &M); @@ -53,8 +54,7 @@ namespace llvm { private: PIC16TargetLowering *PTLI; - bool IsRomData; - char FunctionLabelBegin; + std::list Decls; // List of extern decls. }; } // end of namespace diff --git a/lib/Target/PIC16/PIC16MemSelOpt.cpp b/lib/Target/PIC16/PIC16MemSelOpt.cpp index 688fee2cf79..d433e31fbe7 100644 --- a/lib/Target/PIC16/PIC16MemSelOpt.cpp +++ b/lib/Target/PIC16/PIC16MemSelOpt.cpp @@ -137,6 +137,8 @@ bool MemSelOpt::processInstruction(MachineInstr *MI) { } // Get the section name(NewBank) for MemOp. + // This assumes that the section names for globals are laready set by + // AsmPrinter->doInitialization. std::string NewBank = CurBank; if (Op.getType() == MachineOperand::MO_GlobalAddress && Op.getGlobal()->getType()->getAddressSpace() == PIC16ISD::RAM_SPACE) {