pass the mangler down into the various SectionForGlobal methods.
[oota-llvm.git] / lib / Target / PIC16 / PIC16.h
index bf4421b2f2e92a1d80c92e7e466a753a4519ca0f..447beba7d693744260f71ab81d3206d05697ef7b 100644 (file)
@@ -15,6 +15,7 @@
 #ifndef LLVM_TARGET_PIC16_H
 #define LLVM_TARGET_PIC16_H
 
+#include "llvm/Support/ErrorHandling.h"
 #include "llvm/Target/TargetMachine.h"
 #include <iosfwd>
 #include <cassert>
@@ -26,7 +27,7 @@ namespace llvm {
   class PIC16TargetMachine;
   class FunctionPass;
   class MachineCodeEmitter;
-  class raw_ostream;
+  class formatted_raw_ostream;
 
 namespace PIC16CC {
   enum CondCodes {
@@ -72,18 +73,18 @@ namespace PIC16CC {
     //           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. 
@@ -114,10 +115,10 @@ namespace PIC16CC {
       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.";
       }
     }
 
@@ -151,6 +152,7 @@ namespace PIC16CC {
         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.
@@ -205,39 +207,45 @@ namespace PIC16CC {
     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) {
@@ -285,7 +293,6 @@ namespace PIC16CC {
         }
       }
     }
-
   }; // class PAN.
 
 
@@ -301,21 +308,23 @@ namespace PIC16CC {
 
   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:
@@ -334,12 +343,12 @@ namespace PIC16CC {
 
 
   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