[llvm-commits] [llvm] r63825 - in /llvm/branches/Apple/Dib: ./ include/llvm/ include/llvm/Target/ lib/AsmParser/ lib/CodeGen/SelectionDAG/ lib/VMCore/ test/Assembler/ utils/TableGen/

Bill Wendling isanbard at gmail.com
Wed Feb 4 20:33:06 PST 2009


Author: void
Date: Wed Feb  4 22:33:04 2009
New Revision: 63825

URL: http://llvm.org/viewvc/llvm-project?rev=63825&view=rev
Log:
New feature: add support for target intrinsics being defined in the target
directories themselves.  This also means that VMCore no longer needs to know
about every target's list of intrinsics.  Future work will include converting
the PowerPC target to this interface as an example implementation. With patch by
Dale. Also remove now invalid test.

Removed:
    llvm/branches/Apple/Dib/test/Assembler/2007-04-15-BadIntrinsic.ll
Modified:
    llvm/branches/Apple/Dib/Makefile.rules
    llvm/branches/Apple/Dib/include/llvm/Function.h
    llvm/branches/Apple/Dib/include/llvm/Intrinsics.h
    llvm/branches/Apple/Dib/include/llvm/Intrinsics.td
    llvm/branches/Apple/Dib/include/llvm/Module.h
    llvm/branches/Apple/Dib/include/llvm/Target/TargetMachine.h
    llvm/branches/Apple/Dib/lib/AsmParser/LLParser.cpp
    llvm/branches/Apple/Dib/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp
    llvm/branches/Apple/Dib/lib/VMCore/AutoUpgrade.cpp
    llvm/branches/Apple/Dib/lib/VMCore/Function.cpp
    llvm/branches/Apple/Dib/lib/VMCore/Module.cpp
    llvm/branches/Apple/Dib/lib/VMCore/Verifier.cpp
    llvm/branches/Apple/Dib/utils/TableGen/CodeGenDAGPatterns.cpp
    llvm/branches/Apple/Dib/utils/TableGen/CodeGenDAGPatterns.h
    llvm/branches/Apple/Dib/utils/TableGen/CodeGenIntrinsics.h
    llvm/branches/Apple/Dib/utils/TableGen/CodeGenTarget.cpp
    llvm/branches/Apple/Dib/utils/TableGen/IntrinsicEmitter.cpp
    llvm/branches/Apple/Dib/utils/TableGen/IntrinsicEmitter.h
    llvm/branches/Apple/Dib/utils/TableGen/TableGen.cpp

Modified: llvm/branches/Apple/Dib/Makefile.rules
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/Apple/Dib/Makefile.rules?rev=63825&r1=63824&r2=63825&view=diff

==============================================================================
--- llvm/branches/Apple/Dib/Makefile.rules (original)
+++ llvm/branches/Apple/Dib/Makefile.rules Wed Feb  4 22:33:04 2009
@@ -1346,6 +1346,11 @@
 	$(Echo) "Building $(<F) calling convention information with tblgen"
 	$(Verb) $(TableGen) -gen-callingconv -o $(call SYSPATH, $@) $<
 
+$(TARGET:%=$(ObjDir)/%GenIntrinsics.inc.tmp): \
+$(ObjDir)/%GenIntrinsics.inc.tmp : Intrinsics%.td $(ObjDir)/.dir
+	$(Echo) "Building $(<F) calling convention information with tblgen"
+	$(Verb) $(TableGen) -gen-tgt-intrinsic -o $(call SYSPATH, $@) $<
+
 clean-local::
 	-$(Verb) $(RM) -f $(INCFiles)
 

Modified: llvm/branches/Apple/Dib/include/llvm/Function.h
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/Apple/Dib/include/llvm/Function.h?rev=63825&r1=63824&r2=63825&view=diff

==============================================================================
--- llvm/branches/Apple/Dib/include/llvm/Function.h (original)
+++ llvm/branches/Apple/Dib/include/llvm/Function.h Wed Feb  4 22:33:04 2009
@@ -129,7 +129,7 @@
   /// The particular intrinsic functions which correspond to this value are
   /// defined in llvm/Intrinsics.h.
   ///
-  unsigned getIntrinsicID(bool noAssert = false) const;
+  unsigned getIntrinsicID() const;
   bool isIntrinsic() const { return getIntrinsicID() != 0; }
 
   /// getCallingConv()/setCallingConv(uint) - These method get and set the

Modified: llvm/branches/Apple/Dib/include/llvm/Intrinsics.h
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/Apple/Dib/include/llvm/Intrinsics.h?rev=63825&r1=63824&r2=63825&view=diff

==============================================================================
--- llvm/branches/Apple/Dib/include/llvm/Intrinsics.h (original)
+++ llvm/branches/Apple/Dib/include/llvm/Intrinsics.h Wed Feb  4 22:33:04 2009
@@ -63,6 +63,9 @@
   /// intrinsic.
   Function *getDeclaration(Module *M, ID id, const Type **Tys = 0, 
                            unsigned numTys = 0);
+                           
+  /// Map a GCC builtin name to an intrinsic ID.
+  ID getIntrinsicForGCCBuiltin(const char *Prefix, const char *BuiltinName);
   
 } // End Intrinsic namespace
 

Modified: llvm/branches/Apple/Dib/include/llvm/Intrinsics.td
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/Apple/Dib/include/llvm/Intrinsics.td?rev=63825&r1=63824&r2=63825&view=diff

==============================================================================
--- llvm/branches/Apple/Dib/include/llvm/Intrinsics.td (original)
+++ llvm/branches/Apple/Dib/include/llvm/Intrinsics.td Wed Feb  4 22:33:04 2009
@@ -144,6 +144,8 @@
   list<LLVMType> RetTypes = ret_types;
   list<LLVMType> ParamTypes = param_types;
   list<IntrinsicProperty> Properties = properties;
+
+  bit isTarget = 0;
 }
 
 /// GCCBuiltin - If this intrinsic exactly corresponds to a GCC builtin, this

Modified: llvm/branches/Apple/Dib/include/llvm/Module.h
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/Apple/Dib/include/llvm/Module.h?rev=63825&r1=63824&r2=63825&view=diff

==============================================================================
--- llvm/branches/Apple/Dib/include/llvm/Module.h (original)
+++ llvm/branches/Apple/Dib/include/llvm/Module.h Wed Feb  4 22:33:04 2009
@@ -213,6 +213,10 @@
   Constant *getOrInsertFunction(const std::string &Name, const Type *RetTy, ...)
     END_WITH_NULL;
 
+  Constant *getOrInsertTargetIntrinsic(const std::string &Name,
+                                       const FunctionType *Ty,
+                                       AttrListPtr AttributeList);
+  
   /// getFunction - Look up the specified function in the module symbol table.
   /// If it does not exist, return null.
   Function *getFunction(const std::string &Name) const;

Modified: llvm/branches/Apple/Dib/include/llvm/Target/TargetMachine.h
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/Apple/Dib/include/llvm/Target/TargetMachine.h?rev=63825&r1=63824&r2=63825&view=diff

==============================================================================
--- llvm/branches/Apple/Dib/include/llvm/Target/TargetMachine.h (original)
+++ llvm/branches/Apple/Dib/include/llvm/Target/TargetMachine.h Wed Feb  4 22:33:04 2009
@@ -23,6 +23,7 @@
 class TargetData;
 class TargetSubtarget;
 class TargetInstrInfo;
+class TargetIntrinsicInfo;
 class TargetJITInfo;
 class TargetLowering;
 class TargetFrameInfo;
@@ -118,7 +119,6 @@
   virtual       TargetLowering    *getTargetLowering() const { return 0; }
   virtual const TargetData            *getTargetData() const { return 0; }
   
-  
   /// getTargetAsmInfo - Return target specific asm information.
   ///
   const TargetAsmInfo *getTargetAsmInfo() const {
@@ -141,6 +141,11 @@
   /// details of graph coloring register allocation removed from it.
   ///
   virtual const TargetRegisterInfo *getRegisterInfo() const { return 0; }
+  
+  /// getIntrinsicInfo - If intrinsic information is available, return it.  If
+  /// not, return null.
+  ///
+  virtual const TargetIntrinsicInfo *getIntrinsicInfo() const { return 0; }
 
   /// getJITInfo - If this target supports a JIT, return information for it,
   /// otherwise return null.

Modified: llvm/branches/Apple/Dib/lib/AsmParser/LLParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/Apple/Dib/lib/AsmParser/LLParser.cpp?rev=63825&r1=63824&r2=63825&view=diff

==============================================================================
--- llvm/branches/Apple/Dib/lib/AsmParser/LLParser.cpp (original)
+++ llvm/branches/Apple/Dib/lib/AsmParser/LLParser.cpp Wed Feb  4 22:33:04 2009
@@ -2949,15 +2949,6 @@
   Value *Callee;
   if (ConvertValIDToValue(PFTy, CalleeID, Callee, PFS)) return true;
   
-  // Check for call to invalid intrinsic to avoid crashing later.
-  if (Function *F = dyn_cast<Function>(Callee)) {
-    if (F->hasName() && F->getNameLen() >= 5 &&
-        !strncmp(F->getValueName()->getKeyData(), "llvm.", 5) &&
-        !F->getIntrinsicID(true))
-      return Error(CallLoc, "Call to invalid LLVM intrinsic function '" +
-                   F->getNameStr() + "'");
-  }
-  
   // FIXME: In LLVM 3.0, stop accepting zext, sext and inreg as optional
   // function attributes.
   unsigned ObsoleteFuncAttrs = Attribute::ZExt|Attribute::SExt|Attribute::InReg;

Modified: llvm/branches/Apple/Dib/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/Apple/Dib/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp?rev=63825&r1=63824&r2=63825&view=diff

==============================================================================
--- llvm/branches/Apple/Dib/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp (original)
+++ llvm/branches/Apple/Dib/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp Wed Feb  4 22:33:04 2009
@@ -43,6 +43,7 @@
 #include "llvm/Target/TargetData.h"
 #include "llvm/Target/TargetFrameInfo.h"
 #include "llvm/Target/TargetInstrInfo.h"
+#include "llvm/Target/TargetIntrinsicInfo.h"
 #include "llvm/Target/TargetLowering.h"
 #include "llvm/Target/TargetMachine.h"
 #include "llvm/Target/TargetOptions.h"
@@ -4414,6 +4415,14 @@
   const char *RenameFn = 0;
   if (Function *F = I.getCalledFunction()) {
     if (F->isDeclaration()) {
+      const TargetIntrinsicInfo *II = TLI.getTargetMachine().getIntrinsicInfo();
+      if (II) {
+        if (unsigned IID = II->getIntrinsicID(F)) {
+          RenameFn = visitIntrinsicCall(I, IID);
+          if (!RenameFn)
+            return;
+        }
+      }
       if (unsigned IID = F->getIntrinsicID()) {
         RenameFn = visitIntrinsicCall(I, IID);
         if (!RenameFn)

Modified: llvm/branches/Apple/Dib/lib/VMCore/AutoUpgrade.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/Apple/Dib/lib/VMCore/AutoUpgrade.cpp?rev=63825&r1=63824&r2=63825&view=diff

==============================================================================
--- llvm/branches/Apple/Dib/lib/VMCore/AutoUpgrade.cpp (original)
+++ llvm/branches/Apple/Dib/lib/VMCore/AutoUpgrade.cpp Wed Feb  4 22:33:04 2009
@@ -217,7 +217,7 @@
   // Upgrade intrinsic attributes.  This does not change the function.
   if (NewFn)
     F = NewFn;
-  if (unsigned id = F->getIntrinsicID(true))
+  if (unsigned id = F->getIntrinsicID())
     F->setAttributes(Intrinsic::getAttributes((Intrinsic::ID)id));
   return Upgraded;
 }

Modified: llvm/branches/Apple/Dib/lib/VMCore/Function.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/Apple/Dib/lib/VMCore/Function.cpp?rev=63825&r1=63824&r2=63825&view=diff

==============================================================================
--- llvm/branches/Apple/Dib/lib/VMCore/Function.cpp (original)
+++ llvm/branches/Apple/Dib/lib/VMCore/Function.cpp Wed Feb  4 22:33:04 2009
@@ -175,7 +175,7 @@
     ParentModule->getFunctionList().push_back(this);
 
   // Ensure intrinsics have the right parameter attributes.
-  if (unsigned IID = getIntrinsicID(true))
+  if (unsigned IID = getIntrinsicID())
     setAttributes(Intrinsic::getAttributes(Intrinsic::ID(IID)));
 
 }
@@ -304,7 +304,7 @@
 /// particular intrinsic functions which correspond to this value are defined in
 /// llvm/Intrinsics.h.
 ///
-unsigned Function::getIntrinsicID(bool noAssert) const {
+unsigned Function::getIntrinsicID() const {
   const ValueName *ValName = this->getValueName();
   if (!ValName)
     return 0;
@@ -315,12 +315,9 @@
       || Name[2] != 'v' || Name[3] != 'm')
     return 0;  // All intrinsics start with 'llvm.'
 
-  assert((Len != 5 || noAssert) && "'llvm.' is an invalid intrinsic name!");
-
 #define GET_FUNCTION_RECOGNIZER
 #include "llvm/Intrinsics.gen"
 #undef GET_FUNCTION_RECOGNIZER
-  assert(noAssert && "Invalid LLVM intrinsic name");
   return 0;
 }
 
@@ -373,4 +370,9 @@
                                           getType(id, Tys, numTys)));
 }
 
+// This defines the "Intrinsic::getIntrinsicForGCCBuiltin()" method.
+#define GET_LLVM_INTRINSIC_FOR_GCC_BUILTIN
+#include "llvm/Intrinsics.gen"
+#undef GET_LLVM_INTRINSIC_FOR_GCC_BUILTIN
+
 // vim: sw=2 ai

Modified: llvm/branches/Apple/Dib/lib/VMCore/Module.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/Apple/Dib/lib/VMCore/Module.cpp?rev=63825&r1=63824&r2=63825&view=diff

==============================================================================
--- llvm/branches/Apple/Dib/lib/VMCore/Module.cpp (original)
+++ llvm/branches/Apple/Dib/lib/VMCore/Module.cpp Wed Feb  4 22:33:04 2009
@@ -171,6 +171,25 @@
   return F;  
 }
 
+Constant *Module::getOrInsertTargetIntrinsic(const std::string &Name,
+                                             const FunctionType *Ty,
+                                             AttrListPtr AttributeList) {
+  ValueSymbolTable &SymTab = getValueSymbolTable();
+
+  // See if we have a definition for the specified function already.
+  GlobalValue *F = dyn_cast_or_null<GlobalValue>(SymTab.lookup(Name));
+  if (F == 0) {
+    // Nope, add it
+    Function *New = Function::Create(Ty, GlobalVariable::ExternalLinkage, Name);
+    New->setAttributes(AttributeList);
+    FunctionList.push_back(New);
+    return New; // Return the new prototype.
+  }
+
+  // Otherwise, we just found the existing function or a prototype.
+  return F;  
+}
+
 Constant *Module::getOrInsertFunction(const std::string &Name,
                                       const FunctionType *Ty) {
   AttrListPtr AttributeList = AttrListPtr::get((AttributeWithIndex *)0, 0);

Modified: llvm/branches/Apple/Dib/lib/VMCore/Verifier.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/Apple/Dib/lib/VMCore/Verifier.cpp?rev=63825&r1=63824&r2=63825&view=diff

==============================================================================
--- llvm/branches/Apple/Dib/lib/VMCore/Verifier.cpp (original)
+++ llvm/branches/Apple/Dib/lib/VMCore/Verifier.cpp Wed Feb  4 22:33:04 2009
@@ -1004,10 +1004,9 @@
 void Verifier::visitCallInst(CallInst &CI) {
   VerifyCallSite(&CI);
 
-  if (Function *F = CI.getCalledFunction()) {
+  if (Function *F = CI.getCalledFunction())
     if (Intrinsic::ID ID = (Intrinsic::ID)F->getIntrinsicID())
       visitIntrinsicFunctionCall(ID, CI);
-  }
 }
 
 void Verifier::visitInvokeInst(InvokeInst &II) {

Removed: llvm/branches/Apple/Dib/test/Assembler/2007-04-15-BadIntrinsic.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/Apple/Dib/test/Assembler/2007-04-15-BadIntrinsic.ll?rev=63824&view=auto

==============================================================================
--- llvm/branches/Apple/Dib/test/Assembler/2007-04-15-BadIntrinsic.ll (original)
+++ llvm/branches/Apple/Dib/test/Assembler/2007-04-15-BadIntrinsic.ll (removed)
@@ -1,9 +0,0 @@
-; RUN: not llvm-as %s -o /dev/null -f |& grep {Call to invalid LLVM intrinsic}
-
-declare i32 @llvm.foobar(i32 %foo)
-
-define i32 @test() {
-  %nada = call i32 @llvm.foobar(i32 0)
-  ret i32 %nada
-}
-

Modified: llvm/branches/Apple/Dib/utils/TableGen/CodeGenDAGPatterns.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/Apple/Dib/utils/TableGen/CodeGenDAGPatterns.cpp?rev=63825&r1=63824&r2=63825&view=diff

==============================================================================
--- llvm/branches/Apple/Dib/utils/TableGen/CodeGenDAGPatterns.cpp (original)
+++ llvm/branches/Apple/Dib/utils/TableGen/CodeGenDAGPatterns.cpp Wed Feb  4 22:33:04 2009
@@ -1303,7 +1303,8 @@
 
 // FIXME: REMOVE OSTREAM ARGUMENT
 CodeGenDAGPatterns::CodeGenDAGPatterns(RecordKeeper &R) : Records(R) {
-  Intrinsics = LoadIntrinsics(Records);
+  Intrinsics = LoadIntrinsics(Records, false);
+  TgtIntrinsics = LoadIntrinsics(Records, true);
   ParseNodeInfo();
   ParseNodeTransforms();
   ParseComplexPatterns();

Modified: llvm/branches/Apple/Dib/utils/TableGen/CodeGenDAGPatterns.h
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/Apple/Dib/utils/TableGen/CodeGenDAGPatterns.h?rev=63825&r1=63824&r2=63825&view=diff

==============================================================================
--- llvm/branches/Apple/Dib/utils/TableGen/CodeGenDAGPatterns.h (original)
+++ llvm/branches/Apple/Dib/utils/TableGen/CodeGenDAGPatterns.h Wed Feb  4 22:33:04 2009
@@ -465,6 +465,7 @@
   RecordKeeper &Records;
   CodeGenTarget Target;
   std::vector<CodeGenIntrinsic> Intrinsics;
+  std::vector<CodeGenIntrinsic> TgtIntrinsics;
   
   std::map<Record*, SDNodeInfo> SDNodes;
   std::map<Record*, std::pair<Record*, std::string> > SDNodeXForms;
@@ -515,18 +516,25 @@
   const CodeGenIntrinsic &getIntrinsic(Record *R) const {
     for (unsigned i = 0, e = Intrinsics.size(); i != e; ++i)
       if (Intrinsics[i].TheDef == R) return Intrinsics[i];
+    for (unsigned i = 0, e = TgtIntrinsics.size(); i != e; ++i)
+      if (TgtIntrinsics[i].TheDef == R) return TgtIntrinsics[i];
     assert(0 && "Unknown intrinsic!");
     abort();
   }
   
   const CodeGenIntrinsic &getIntrinsicInfo(unsigned IID) const {
-    assert(IID-1 < Intrinsics.size() && "Bad intrinsic ID!");
-    return Intrinsics[IID-1];
+    if (IID-1 < Intrinsics.size())
+      return Intrinsics[IID-1];
+    if (IID-Intrinsics.size()-1 < TgtIntrinsics.size())
+      return TgtIntrinsics[IID-Intrinsics.size()-1];
+    assert(0 && "Bad intrinsic ID!");
   }
   
   unsigned getIntrinsicID(Record *R) const {
     for (unsigned i = 0, e = Intrinsics.size(); i != e; ++i)
       if (Intrinsics[i].TheDef == R) return i;
+    for (unsigned i = 0, e = TgtIntrinsics.size(); i != e; ++i)
+      if (TgtIntrinsics[i].TheDef == R) return i + Intrinsics.size();
     assert(0 && "Unknown intrinsic!");
     abort();
   }

Modified: llvm/branches/Apple/Dib/utils/TableGen/CodeGenIntrinsics.h
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/Apple/Dib/utils/TableGen/CodeGenIntrinsics.h?rev=63825&r1=63824&r2=63825&view=diff

==============================================================================
--- llvm/branches/Apple/Dib/utils/TableGen/CodeGenIntrinsics.h (original)
+++ llvm/branches/Apple/Dib/utils/TableGen/CodeGenIntrinsics.h Wed Feb  4 22:33:04 2009
@@ -80,7 +80,8 @@
 
   /// LoadIntrinsics - Read all of the intrinsics defined in the specified
   /// .td file.
-  std::vector<CodeGenIntrinsic> LoadIntrinsics(const RecordKeeper &RC);
+  std::vector<CodeGenIntrinsic> LoadIntrinsics(const RecordKeeper &RC,
+                                               bool TargetOnly);
 }
 
 #endif

Modified: llvm/branches/Apple/Dib/utils/TableGen/CodeGenTarget.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/Apple/Dib/utils/TableGen/CodeGenTarget.cpp?rev=63825&r1=63824&r2=63825&view=diff

==============================================================================
--- llvm/branches/Apple/Dib/utils/TableGen/CodeGenTarget.cpp (original)
+++ llvm/branches/Apple/Dib/utils/TableGen/CodeGenTarget.cpp Wed Feb  4 22:33:04 2009
@@ -426,13 +426,17 @@
 // CodeGenIntrinsic Implementation
 //===----------------------------------------------------------------------===//
 
-std::vector<CodeGenIntrinsic> llvm::LoadIntrinsics(const RecordKeeper &RC) {
+std::vector<CodeGenIntrinsic> llvm::LoadIntrinsics(const RecordKeeper &RC,
+                                                   bool TargetOnly) {
   std::vector<Record*> I = RC.getAllDerivedDefinitions("Intrinsic");
   
   std::vector<CodeGenIntrinsic> Result;
 
-  for (unsigned i = 0, e = I.size(); i != e; ++i)
-    Result.push_back(CodeGenIntrinsic(I[i]));
+  for (unsigned i = 0, e = I.size(); i != e; ++i) {
+    bool isTarget = I[i]->getValueAsBit("isTarget");
+    if (isTarget == TargetOnly)
+      Result.push_back(CodeGenIntrinsic(I[i]));
+  }
   return Result;
 }
 

Modified: llvm/branches/Apple/Dib/utils/TableGen/IntrinsicEmitter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/Apple/Dib/utils/TableGen/IntrinsicEmitter.cpp?rev=63825&r1=63824&r2=63825&view=diff

==============================================================================
--- llvm/branches/Apple/Dib/utils/TableGen/IntrinsicEmitter.cpp (original)
+++ llvm/branches/Apple/Dib/utils/TableGen/IntrinsicEmitter.cpp Wed Feb  4 22:33:04 2009
@@ -25,7 +25,10 @@
 void IntrinsicEmitter::run(std::ostream &OS) {
   EmitSourceFileHeader("Intrinsic Function Source Fragment", OS);
   
-  std::vector<CodeGenIntrinsic> Ints = LoadIntrinsics(Records);
+  std::vector<CodeGenIntrinsic> Ints = LoadIntrinsics(Records, TargetOnly);
+  
+  if (TargetOnly && !Ints.empty())
+    TargetPrefix = Ints[0].TargetPrefix;
 
   // Emit the enum information.
   EmitEnumInfo(Ints, OS);
@@ -91,12 +94,12 @@
     if (Ints[I->second].isOverloaded)
       OS << "    if (Len > " << I->first.size()
        << " && !memcmp(Name, \"" << I->first << ".\", "
-       << (I->first.size() + 1) << ")) return Intrinsic::"
+       << (I->first.size() + 1) << ")) return " << TargetPrefix << "Intrinsic::"
        << Ints[I->second].EnumName << ";\n";
     else 
       OS << "    if (Len == " << I->first.size()
          << " && !memcmp(Name, \"" << I->first << "\", "
-         << I->first.size() << ")) return Intrinsic::"
+         << I->first.size() << ")) return " << TargetPrefix << "Intrinsic::"
          << Ints[I->second].EnumName << ";\n";
   }
   OS << "  }\n";
@@ -351,11 +354,13 @@
                              Ints[i].IS.ParamTypeDefs)].push_back(i);
 
   // Loop through the array, emitting one generator for each batch.
+  std::string IntrinsicStr = TargetPrefix + "Intrinsic::";
+  
   for (MapTy::iterator I = UniqueArgInfos.begin(),
        E = UniqueArgInfos.end(); I != E; ++I) {
     for (unsigned i = 0, e = I->second.size(); i != e; ++i)
-      OS << "  case Intrinsic::" << Ints[I->second[i]].EnumName << ":\t\t// "
-         << Ints[I->second[i]].Name << "\n";
+      OS << "  case " << IntrinsicStr << Ints[I->second[i]].EnumName 
+         << ":\t\t// " << Ints[I->second[i]].Name << "\n";
     
     const RecPair &ArgTypes = I->first;
     const std::vector<Record*> &RetTys = ArgTypes.first;
@@ -392,7 +397,11 @@
 EmitAttributes(const std::vector<CodeGenIntrinsic> &Ints, std::ostream &OS) {
   OS << "// Add parameter attributes that are not common to all intrinsics.\n";
   OS << "#ifdef GET_INTRINSIC_ATTRIBUTES\n";
-  OS << "AttrListPtr Intrinsic::getAttributes(ID id) {";
+  if (TargetOnly)
+    OS << "static AttrListPtr getAttributes(" << TargetPrefix 
+       << "Intrinsic::ID id) {";
+  else
+    OS << "AttrListPtr Intrinsic::getAttributes(ID id) {";
   OS << "  // No intrinsic can throw exceptions.\n";
   OS << "  Attributes Attr = Attribute::NoUnwind;\n";
   OS << "  switch (id) {\n";
@@ -404,7 +413,8 @@
     switch (Ints[i].ModRef) {
     default: break;
     case CodeGenIntrinsic::NoMem:
-      OS << "  case Intrinsic::" << Ints[i].EnumName << ":\n";
+      OS << "  case " << TargetPrefix << "Intrinsic::" << Ints[i].EnumName 
+         << ":\n";
       break;
     }
   }
@@ -415,7 +425,8 @@
     default: break;
     case CodeGenIntrinsic::ReadArgMem:
     case CodeGenIntrinsic::ReadMem:
-      OS << "  case Intrinsic::" << Ints[i].EnumName << ":\n";
+      OS << "  case " << TargetPrefix << "Intrinsic::" << Ints[i].EnumName 
+         << ":\n";
       break;
     }
   }
@@ -431,7 +442,8 @@
   for (unsigned i = 0, e = Ints.size(); i != e; ++i) {
     if (Ints[i].ArgumentAttributes.empty()) continue;
     
-    OS << "  case Intrinsic::" << Ints[i].EnumName << ":\n";
+    OS << "  case " << TargetPrefix << "Intrinsic::" << Ints[i].EnumName 
+       << ":\n";
 
     std::vector<std::pair<unsigned, CodeGenIntrinsic::ArgAttribute> > ArgAttrs =
       Ints[i].ArgumentAttributes;
@@ -495,7 +507,7 @@
 typedef std::map<std::string, std::string>::const_iterator StrMapIterator;
 static void EmitBuiltinComparisons(StrMapIterator Start, StrMapIterator End,
                                    unsigned CharStart, unsigned Indent,
-                                   std::ostream &OS) {
+                                   std::string TargetPrefix, std::ostream &OS) {
   if (Start == End) return; // empty range.
   
   // Determine what, if anything, is the same about all these strings.
@@ -522,7 +534,8 @@
       OS << CommonString.size() - CharStart << "))\n";
       ++Indent;
     }
-    OS << std::string(Indent*2, ' ') << "IntrinsicID = Intrinsic::";
+    OS << std::string(Indent*2, ' ') << "IntrinsicID = " << TargetPrefix
+       << "Intrinsic::";
     OS << Start->second << ";\n";
     return;
   }
@@ -535,7 +548,8 @@
     OS << ", \"" << (CommonString.c_str()+CharStart) << "\", ";
     OS << CommonString.size()-CharStart << ")) {\n";
     
-    EmitBuiltinComparisons(Start, End, CommonString.size(), Indent+1, OS);
+    EmitBuiltinComparisons(Start, End, CommonString.size(), Indent+1, 
+                           TargetPrefix, OS);
     OS << std::string(Indent*2, ' ') << "}\n";
     return;
   }
@@ -556,7 +570,7 @@
     for (++NextChar; NextChar != End && NextChar->first[CharStart] == ThisChar;
          ++NextChar)
       /*empty*/;
-    EmitBuiltinComparisons(I, NextChar, CharStart+1, Indent+1, OS);
+    EmitBuiltinComparisons(I, NextChar, CharStart+1, Indent+1, TargetPrefix,OS);
     OS << std::string(Indent*2, ' ') << "  break;\n";
     I = NextChar;
   }
@@ -566,6 +580,7 @@
 /// EmitTargetBuiltins - All of the builtins in the specified map are for the
 /// same target, and we already checked it.
 static void EmitTargetBuiltins(const std::map<std::string, std::string> &BIM,
+                               const std::string &TargetPrefix,
                                std::ostream &OS) {
   // Rearrange the builtins by length.
   std::vector<std::map<std::string, std::string> > BuiltinsByLen;
@@ -584,7 +599,7 @@
     if (BuiltinsByLen[i].empty()) continue;
     OS << "    case " << i << ":\n";
     EmitBuiltinComparisons(BuiltinsByLen[i].begin(), BuiltinsByLen[i].end(),
-                           0, 3, OS);
+                           0, 3, TargetPrefix, OS);
     OS << "      break;\n";
   }
   OS << "    }\n";
@@ -613,7 +628,22 @@
   OS << "// in as BuiltinName, and a target prefix (e.g. 'ppc') is passed\n";
   OS << "// in as TargetPrefix.  The result is assigned to 'IntrinsicID'.\n";
   OS << "#ifdef GET_LLVM_INTRINSIC_FOR_GCC_BUILTIN\n";
-  OS << "  IntrinsicID = Intrinsic::not_intrinsic;\n";
+  
+  if (TargetOnly) {
+    OS << "static " << TargetPrefix << "Intrinsic::ID "
+       << "getIntrinsicForGCCBuiltin(const char "
+       << "*TargetPrefix, const char *BuiltinName) {\n";
+    OS << "  " << TargetPrefix << "Intrinsic::ID IntrinsicID = ";
+  } else {
+    OS << "Intrinsic::ID Intrinsic::getIntrinsicForGCCBuiltin(const char "
+       << "*TargetPrefix, const char *BuiltinName) {\n";
+    OS << "  Intrinsic::ID IntrinsicID = ";
+  }
+  
+  if (TargetOnly)
+    OS << "(" << TargetPrefix<< "Intrinsic::ID)";
+
+  OS << "Intrinsic::not_intrinsic;\n";
   
   // Note: this could emit significantly better code if we cared.
   for (BIMTy::iterator I = BuiltinMap.begin(), E = BuiltinMap.end();I != E;++I){
@@ -625,8 +655,10 @@
     OS << "{\n";
 
     // Emit the comparisons for this target prefix.
-    EmitTargetBuiltins(I->second, OS);
+    EmitTargetBuiltins(I->second, TargetPrefix, OS);
     OS << "  }\n";
   }
+  OS << "  return IntrinsicID;\n";
+  OS << "}\n";
   OS << "#endif\n\n";
 }

Modified: llvm/branches/Apple/Dib/utils/TableGen/IntrinsicEmitter.h
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/Apple/Dib/utils/TableGen/IntrinsicEmitter.h?rev=63825&r1=63824&r2=63825&view=diff

==============================================================================
--- llvm/branches/Apple/Dib/utils/TableGen/IntrinsicEmitter.h (original)
+++ llvm/branches/Apple/Dib/utils/TableGen/IntrinsicEmitter.h Wed Feb  4 22:33:04 2009
@@ -20,9 +20,12 @@
 namespace llvm {
   class IntrinsicEmitter : public TableGenBackend {
     RecordKeeper &Records;
+    bool TargetOnly;
+    std::string TargetPrefix;
     
   public:
-    IntrinsicEmitter(RecordKeeper &R) : Records(R) {}
+    IntrinsicEmitter(RecordKeeper &R, bool T = false) 
+      : Records(R), TargetOnly(T) {}
 
     void run(std::ostream &OS);
     

Modified: llvm/branches/Apple/Dib/utils/TableGen/TableGen.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/Apple/Dib/utils/TableGen/TableGen.cpp?rev=63825&r1=63824&r2=63825&view=diff

==============================================================================
--- llvm/branches/Apple/Dib/utils/TableGen/TableGen.cpp (original)
+++ llvm/branches/Apple/Dib/utils/TableGen/TableGen.cpp Wed Feb  4 22:33:04 2009
@@ -49,6 +49,7 @@
   GenFastISel,
   GenSubtarget,
   GenIntrinsic,
+  GenTgtIntrinsic,
   GenLLVMCConf,
   PrintEnums
 };
@@ -82,6 +83,8 @@
                                "Generate subtarget enumerations"),
                     clEnumValN(GenIntrinsic, "gen-intrinsic",
                                "Generate intrinsic information"),
+                    clEnumValN(GenTgtIntrinsic, "gen-tgt-intrinsic",
+                               "Generate target intrinsic information"),
                     clEnumValN(GenLLVMCConf, "gen-llvmc",
                                "Generate LLVMC configuration library"),
                     clEnumValN(PrintEnums, "print-enums",
@@ -190,6 +193,9 @@
     case GenIntrinsic:
       IntrinsicEmitter(Records).run(*Out);
       break;
+    case GenTgtIntrinsic:
+      IntrinsicEmitter(Records, true).run(*Out);
+      break;
     case GenLLVMCConf:
       LLVMCConfigurationEmitter(Records).run(*Out);
       break;





More information about the llvm-commits mailing list