summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Target/PIC16/PIC16.h8
-rw-r--r--llvm/lib/Target/PIC16/PIC16AsmPrinter.cpp35
-rw-r--r--llvm/lib/Target/PIC16/PIC16AsmPrinter.h8
-rw-r--r--llvm/lib/Target/PIC16/PIC16MemSelOpt.cpp2
4 files changed, 43 insertions, 10 deletions
diff --git a/llvm/lib/Target/PIC16/PIC16.h b/llvm/lib/Target/PIC16/PIC16.h
index 04fb1720302..bf4421b2f2e 100644
--- a/llvm/lib/Target/PIC16/PIC16.h
+++ b/llvm/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/llvm/lib/Target/PIC16/PIC16AsmPrinter.cpp b/llvm/lib/Target/PIC16/PIC16AsmPrinter.cpp
index 1aebe09209c..f88d9e7e627 100644
--- a/llvm/lib/Target/PIC16/PIC16AsmPrinter.cpp
+++ b/llvm/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 char*>::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/llvm/lib/Target/PIC16/PIC16AsmPrinter.h b/llvm/lib/Target/PIC16/PIC16AsmPrinter.h
index 13a269b5fa3..2bc8a57e717 100644
--- a/llvm/lib/Target/PIC16/PIC16AsmPrinter.h
+++ b/llvm/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 <list>
+#include <string>
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<const char *> Decls; // List of extern decls.
};
} // end of namespace
diff --git a/llvm/lib/Target/PIC16/PIC16MemSelOpt.cpp b/llvm/lib/Target/PIC16/PIC16MemSelOpt.cpp
index 688fee2cf79..d433e31fbe7 100644
--- a/llvm/lib/Target/PIC16/PIC16MemSelOpt.cpp
+++ b/llvm/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) {
OpenPOWER on IntegriCloud