[llvm-commits] CVS: llvm/lib/Target/CBackend/Writer.cpp

Andrew Lenharth alenhar2 at cs.uiuc.edu
Tue Nov 28 11:53:54 PST 2006



Changes in directory llvm/lib/Target/CBackend:

Writer.cpp updated: 1.285 -> 1.286
---
Log message:

Get the asminfo for the target most closely matching the module and use that for inline asm

---
Diffs of the changes:  (+26 -28)

 Writer.cpp |   54 ++++++++++++++++++++++++++----------------------------
 1 files changed, 26 insertions(+), 28 deletions(-)


Index: llvm/lib/Target/CBackend/Writer.cpp
diff -u llvm/lib/Target/CBackend/Writer.cpp:1.285 llvm/lib/Target/CBackend/Writer.cpp:1.286
--- llvm/lib/Target/CBackend/Writer.cpp:1.285	Mon Nov 27 17:50:49 2006
+++ llvm/lib/Target/CBackend/Writer.cpp	Tue Nov 28 13:53:36 2006
@@ -30,6 +30,7 @@
 #include "llvm/CodeGen/IntrinsicLowering.h"
 #include "llvm/Transforms/Scalar.h"
 #include "llvm/Target/TargetMachineRegistry.h"
+#include "llvm/Target/TargetAsmInfo.h"
 #include "llvm/Support/CallSite.h"
 #include "llvm/Support/CFG.h"
 #include "llvm/Support/GetElementPtrTypeIterator.h"
@@ -74,11 +75,12 @@
     Mangler *Mang;
     LoopInfo *LI;
     const Module *TheModule;
+    const TargetAsmInfo* TAsm;
     std::map<const Type *, std::string> TypeNames;
 
     std::map<const ConstantFP *, unsigned> FPConstantMap;
   public:
-    CWriter(std::ostream &o) : Out(o) {}
+    CWriter(std::ostream &o) : Out(o), TAsm(0) {}
 
     virtual const char *getPassName() const { return "C backend"; }
 
@@ -127,6 +129,8 @@
     bool writeInstructionCast(const Instruction &I);
 
   private :
+    std::string InterpretASMConstraint(InlineAsm::ConstraintInfo& c);
+
     void lowerIntrinsics(Function &F);
 
     void printModule(Module *M);
@@ -2257,47 +2261,42 @@
 //This could be broken into a bunch of peices and spread accross the 
 //targets, but this information is only useful here.
 //TODO: work out platform independent constraints and factor those out
-static std::string InterpretConstraint(const std::string& target, 
-                                       InlineAsm::ConstraintInfo& c) {
+std::string CWriter::InterpretASMConstraint(InlineAsm::ConstraintInfo& c) {
 
   assert(c.Codes.size() == 1 && "Too many asm constraint codes to handle");
 
   //catch numeric constraints
   if (c.Codes[0].find_first_not_of("0123456789") >= c.Codes[0].size())
     return c.Codes[0];
-  
-  static const char* x86_table[] = {"{si}", "S",
-                                    "{di}", "D",
-                                    "{ax}", "a",
-                                    "{cx}", "c",
-                                    "q",    "q",
-                                    "r",    "r",
-                                    "m",    "m",
-                                    "{memory}", "memory",
-                                    "{flags}", "",
-                                    "{dirflag}", "",
-                                    "{fpsr}", "",
-                                    "{cc}", "cc"
-  };
 
   const char** table = 0;
-  int tbl_len = 0;
-  if (target == "i686-pc-linux-gnu") {
-    table = x86_table;
-    tbl_len = sizeof(x86_table) / sizeof(char*);
+  
+  //Grab the translation table from TargetAsmInfo if it exists
+  if (!TAsm) {
+    std::string E;
+    const TargetMachineRegistry::Entry* Match = 
+      TargetMachineRegistry::getClosestStaticTargetForModule(*TheModule, E);
+    if (Match) {
+      //Per platform Target Machines don't exist, so create it
+      // this must be done only once
+      const TargetMachine* TM = Match->CtorFn(*TheModule, "");
+      TAsm = TM->getTargetAsmInfo();
+    }
   }
-  for (int i = 0; i < tbl_len && table; i += 2)
+  if (TAsm)
+    table = TAsm->getAsmCBE();
+
+  //Search the translation table if it exists
+  for (int i = 0; table && table[i]; i += 2)
     if (c.Codes[0] == table[i])
       return table[i+1];
 
-  std::cerr << target << "\n";
-  std::cerr << c.Codes[0] << "\n";
   assert(0 && "Unknown Asm Constraint");
   return "";
 }
 
 //TODO: import logic from AsmPrinter.cpp
-static std::string gccifyAsm(const std::string& target, std::string asmstr) {
+static std::string gccifyAsm(std::string asmstr) {
   for (std::string::size_type i = 0; i != asmstr.size(); ++i)
     if (asmstr[i] == '\n')
       asmstr.replace(i, 1, "\\n");
@@ -2323,7 +2322,6 @@
 
 void CWriter::visitInlineAsm(CallInst &CI) {
   InlineAsm* as = cast<InlineAsm>(CI.getOperand(0));
-  const std::string& target = TheModule->getTargetTriple();
   std::vector<InlineAsm::ConstraintInfo> Constraints = as->ParseConstraints();
   std::vector<std::pair<std::string, Value*> > Input;
   std::vector<std::pair<std::string, Value*> > Output;
@@ -2333,7 +2331,7 @@
          E = Constraints.end(); I != E; ++I) {
     assert(I->Codes.size() == 1 && "Too many asm constraint codes to handle");
     std::string c = 
-      InterpretConstraint(target, *I);
+      InterpretASMConstraint(*I);
     switch(I->Type) {
     default:
       assert(0 && "Unknown asm constraint");
@@ -2362,7 +2360,7 @@
   }
   
   //fix up the asm string for gcc
-  std::string asmstr = gccifyAsm(target, as->getAsmString());
+  std::string asmstr = gccifyAsm(as->getAsmString());
   
   Out << "__asm__ volatile (\"" << asmstr << "\"\n";
   Out << "        :";






More information about the llvm-commits mailing list