summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorSanjiv Gupta <sanjiv.gupta@microchip.com>2009-05-11 06:01:38 +0000
committerSanjiv Gupta <sanjiv.gupta@microchip.com>2009-05-11 06:01:38 +0000
commit9d175c15e768d5ed4cb8fb1771621a299b87a94a (patch)
treeaa2faddc22f06e3b3f43432128b886fa8672c11b /llvm
parentaeec9d53cedcd096911042a902e0f70a5bb403ad (diff)
downloadbcm5719-llvm-9d175c15e768d5ed4cb8fb1771621a299b87a94a.tar.gz
bcm5719-llvm-9d175c15e768d5ed4cb8fb1771621a299b87a94a.zip
Detect calls to compiler intrinsics and emit an extern declarations
only for those. These extern declarations to intrinsics are currently being emitted at the bottom of generated .s file, which works fine with gpasm(not sure about MPSAM though). PIC16 linker generates errors for few cases (function-args/struct_args_5) if you do not include any extern declarations (even if no intrinsics are being used), but that needs to be fixed in the linker itself. llvm-svn: 71423
Diffstat (limited to 'llvm')
-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