[llvm-commits] [llvm] r71423 - in /llvm/trunk/lib/Target/PIC16: PIC16.h PIC16AsmPrinter.cpp PIC16AsmPrinter.h PIC16MemSelOpt.cpp

Sanjiv Gupta sanjiv.gupta at microchip.com
Sun May 10 23:01:38 PDT 2009


Author: sgupta
Date: Mon May 11 01:01:38 2009
New Revision: 71423

URL: http://llvm.org/viewvc/llvm-project?rev=71423&view=rev
Log:
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.


Modified:
    llvm/trunk/lib/Target/PIC16/PIC16.h
    llvm/trunk/lib/Target/PIC16/PIC16AsmPrinter.cpp
    llvm/trunk/lib/Target/PIC16/PIC16AsmPrinter.h
    llvm/trunk/lib/Target/PIC16/PIC16MemSelOpt.cpp

Modified: llvm/trunk/lib/Target/PIC16/PIC16.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PIC16/PIC16.h?rev=71423&r1=71422&r2=71423&view=diff

==============================================================================
--- llvm/trunk/lib/Target/PIC16/PIC16.h (original)
+++ llvm/trunk/lib/Target/PIC16/PIC16.h Mon May 11 01:01:38 2009
@@ -114,7 +114,7 @@
       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 @@
        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;

Modified: llvm/trunk/lib/Target/PIC16/PIC16AsmPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PIC16/PIC16AsmPrinter.cpp?rev=71423&r1=71422&r2=71423&view=diff

==============================================================================
--- llvm/trunk/lib/Target/PIC16/PIC16AsmPrinter.cpp (original)
+++ llvm/trunk/lib/Target/PIC16/PIC16AsmPrinter.cpp Mon May 11 01:01:38 2009
@@ -87,6 +87,7 @@
           CurLine = line;
         }
       }
+        
       // Print the assembly for the instruction.
       printMachineInstruction(II);
     }
@@ -106,6 +107,8 @@
   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 @@
       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 @@
   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 @@
 
   // 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::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 @@
       O << "\n";
     }
   }
-  IsRomData = false;
 }
 
 bool PIC16AsmPrinter::doFinalization(Module &M) {
+  printDecls();
   O << "\t" << "END\n";
   bool Result = AsmPrinter::doFinalization(M);
   return Result;

Modified: llvm/trunk/lib/Target/PIC16/PIC16AsmPrinter.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PIC16/PIC16AsmPrinter.h?rev=71423&r1=71422&r2=71423&view=diff

==============================================================================
--- llvm/trunk/lib/Target/PIC16/PIC16AsmPrinter.h (original)
+++ llvm/trunk/lib/Target/PIC16/PIC16AsmPrinter.h Mon May 11 01:01:38 2009
@@ -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 @@
                              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 @@
     void EmitGlobalData (Module &M);
     void EmitRomData (Module &M);
     void emitFunctionData(MachineFunction &MF);
+    void printDecls(void);
 
     protected:
     bool doInitialization(Module &M);
@@ -53,8 +54,7 @@
 
     private:
     PIC16TargetLowering *PTLI;
-    bool IsRomData;
-    char FunctionLabelBegin;
+    std::list<const char *> Decls; // List of extern decls.
   };
 } // end of namespace
 

Modified: llvm/trunk/lib/Target/PIC16/PIC16MemSelOpt.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PIC16/PIC16MemSelOpt.cpp?rev=71423&r1=71422&r2=71423&view=diff

==============================================================================
--- llvm/trunk/lib/Target/PIC16/PIC16MemSelOpt.cpp (original)
+++ llvm/trunk/lib/Target/PIC16/PIC16MemSelOpt.cpp Mon May 11 01:01:38 2009
@@ -137,6 +137,8 @@
   }
 
   // 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) {





More information about the llvm-commits mailing list