#ifndef LLVM_TARGET_PIC16_H
#define LLVM_TARGET_PIC16_H
+#include "llvm/Support/ErrorHandling.h"
#include "llvm/Target/TargetMachine.h"
#include <iosfwd>
#include <cassert>
class PIC16TargetMachine;
class FunctionPass;
class MachineCodeEmitter;
- class raw_ostream;
+ class formatted_raw_ostream;
namespace PIC16CC {
enum CondCodes {
// Its temp data: @foo.temp.
// Its arg passing: @foo.args.
//----------------------------------------------
- // Libcall - compiler generated libcall names must have a .lib.
+ // Libcall - compiler generated libcall names must start with .lib.
// This id will be used to emit extern decls for libcalls.
- // Example - libcall name: @sra_i8.lib.
- // To pass args: @sra_i8.args.
- // To return val: @sra_i8.ret.
+ // Example - libcall name: @.lib.sra.i8
+ // To pass args: @.lib.sra.i8.args.
+ // To return val: @.lib.sra.i8.ret.
//----------------------------------------------
// SECTION Names
// uninitialized globals - @udata.<num>.#
// initialized globals - @idata.<num>.#
// Function frame - @<func>.frame_section.
// Function autos - @<func>.autos_section.
- // Declarations - @section.0
+ // Declarations - Enclosed in comments. No section for them.
//----------------------------------------------------------
// Tags used to mangle different names.
case TEMPS_LABEL: return ".temp.";
case ARGS_LABEL: return ".args.";
case RET_LABEL: return ".ret.";
- case LIBCALL: return "__intrinsics";
- case FRAME_SECTION: return ".fpdata.";
- case AUTOS_SECTION: return ".fadata.";
- case CODE_SECTION: return "code";
+ case LIBCALL: return ".lib.";
+ case FRAME_SECTION: return ".frame_section.";
+ case AUTOS_SECTION: return ".autos_section.";
+ case CODE_SECTION: return ".code_section.";
}
}
return STATIC_LOCAL;
assert (0 && "Could not determine Symbol's tag");
+ return PREFIX_SYMBOL; // Silence warning when assertions are turned off.
}
// addPrefix - add prefix symbol to a name if there isn't one already.
static std::string getFrameSectionName(const std::string &Func) {
std::string Func1 = addPrefix(Func);
std::string tag = getTagName(FRAME_SECTION);
- return Func1 + tag + " UDATA_OVR";
+ return Func1 + tag + "# UDATA_OVR";
}
static std::string getAutosSectionName(const std::string &Func) {
std::string Func1 = addPrefix(Func);
std::string tag = getTagName(AUTOS_SECTION);
- return Func1 + tag + " UDATA_OVR";
+ return Func1 + tag + "# UDATA_OVR";
}
static std::string getCodeSectionName(const std::string &Func) {
std::string Func1 = addPrefix(Func);
std::string tag = getTagName(CODE_SECTION);
- return Func1 + tag + " CODE";
+ return Func1 + tag + "# CODE";
}
- // udata and idata section names are generated by a given number.
+ // udata, romdata and idata section names are generated by a given number.
// @udata.<num>.#
- static std::string getUdataSectionName(unsigned num) {
+ static std::string getUdataSectionName(unsigned num,
+ std::string prefix = "") {
std::ostringstream o;
- o << getTagName(PREFIX_SYMBOL) << "udata." << num << ".# UDATA";
+ o << getTagName(PREFIX_SYMBOL) << prefix << "udata." << num
+ << ".# UDATA";
return o.str();
}
- static std::string getIdataSectionName(unsigned num) {
+ static std::string getRomdataSectionName(unsigned num,
+ std::string prefix = "") {
std::ostringstream o;
- o << getTagName(PREFIX_SYMBOL) << "idata." << num << ".# IDATA";
- return o.str();
+ o << getTagName(PREFIX_SYMBOL) << prefix << "romdata." << num
+ << ".# ROMDATA";
+ return o.str();
}
- static std::string getDeclSectionName(void) {
- std::string dsname = "decl_section.1";
- dsname = addPrefix(dsname);
- return dsname;
+ static std::string getIdataSectionName(unsigned num,
+ std::string prefix = "") {
+ std::ostringstream o;
+ o << getTagName(PREFIX_SYMBOL) << prefix << "idata." << num
+ << ".# IDATA";
+ return o.str();
}
inline static bool isLocalName (const std::string &Name) {
}
}
}
-
}; // class PAN.
inline static const char *PIC16CondCodeToString(PIC16CC::CondCodes CC) {
switch (CC) {
- default: assert(0 && "Unknown condition code");
+ default: llvm_unreachable("Unknown condition code");
case PIC16CC::NE: return "ne";
case PIC16CC::EQ: return "eq";
case PIC16CC::LT: return "lt";
case PIC16CC::ULT: return "lt";
case PIC16CC::LE: return "le";
+ case PIC16CC::ULE: return "le";
case PIC16CC::GT: return "gt";
case PIC16CC::UGT: return "gt";
case PIC16CC::GE: return "ge";
+ case PIC16CC::UGE: return "ge";
}
}
inline static bool isSignedComparison(PIC16CC::CondCodes CC) {
switch (CC) {
- default: assert(0 && "Unknown condition code");
+ default: llvm_unreachable("Unknown condition code");
case PIC16CC::NE:
case PIC16CC::EQ:
case PIC16CC::LT:
FunctionPass *createPIC16ISelDag(PIC16TargetMachine &TM);
- FunctionPass *createPIC16CodePrinterPass(raw_ostream &OS,
- PIC16TargetMachine &TM,
- CodeGenOpt::Level OptLevel,
- bool Verbose);
- // Banksel optimzer pass.
+ // Banksel optimizer pass.
FunctionPass *createPIC16MemSelOptimizerPass();
+
+ extern Target ThePIC16Target;
+ extern Target TheCooperTarget;
+
} // end namespace llvm;
// Defines symbolic names for PIC16 registers. This defines a mapping from