Parse mod/ref properties, autogen mod/ref information
authorChris Lattner <sabre@nondot.org>
Thu, 9 Mar 2006 22:30:49 +0000 (22:30 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 9 Mar 2006 22:30:49 +0000 (22:30 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26669 91177308-0d34-0410-b5e6-96231b3b80d8

utils/TableGen/IntrinsicEmitter.cpp
utils/TableGen/IntrinsicEmitter.h

index 8981311def2ee30be4a8432e92a2f964bd46bd26..680264ff20bf3bee8dea6602185ab2811cf43f76 100644 (file)
@@ -26,6 +26,7 @@ std::vector<CodeGenIntrinsic> llvm::LoadIntrinsics(const RecordKeeper &RC) {
 
 CodeGenIntrinsic::CodeGenIntrinsic(Record *R) {
   std::string DefName = R->getName();
+  ModRef = WriteMem;
   
   if (DefName.size() <= 4 || 
       std::string(DefName.begin(), DefName.begin()+4) != "int_")
@@ -54,6 +55,29 @@ CodeGenIntrinsic::CodeGenIntrinsic(Record *R) {
   }
   if (ArgTypes.size() == 0)
     throw "Intrinsic '"+DefName+"' needs at least a type for the ret value!";
+  
+  // Parse the intrinsic properties.
+  ListInit *PropList = R->getValueAsListInit("Properties");
+  for (unsigned i = 0, e = PropList->getSize(); i != e; ++i) {
+    DefInit *DI = dynamic_cast<DefInit*>(PropList->getElement(i));
+    assert(DI && "Invalid list type!");
+    Record *Property = DI->getDef();
+    assert(Property->isSubClassOf("IntrinsicProperty") &&
+           "Expected a property!");
+
+    if (Property->getName() == "InstrNoMem")
+      ModRef = NoMem;
+    else if (Property->getName() == "InstrReadArgMem")
+      ModRef = ReadArgMem;
+    else if (Property->getName() == "IntrReadMem")
+      ModRef = ReadMem;
+    else if (Property->getName() == "InstrWriteArgMem")
+      ModRef = WriteArgMem;
+    else if (Property->getName() == "IntrWriteMem")
+      ModRef = WriteMem;
+    else
+      assert(0 && "Unknown property!");
+  }
 }
 
 //===----------------------------------------------------------------------===//
@@ -73,6 +97,9 @@ void IntrinsicEmitter::run(std::ostream &OS) {
 
   // Emit the intrinsic verifier.
   EmitVerifier(Ints, OS);
+  
+  // Emit mod/ref info for each function.
+  EmitModRefInfo(Ints, OS);
 }
 
 void IntrinsicEmitter::EmitEnumInfo(const std::vector<CodeGenIntrinsic> &Ints,
@@ -146,3 +173,21 @@ void IntrinsicEmitter::EmitVerifier(const std::vector<CodeGenIntrinsic> &Ints,
   OS << "#endif\n\n";
 }
 
+void IntrinsicEmitter::EmitModRefInfo(const std::vector<CodeGenIntrinsic> &Ints,
+                                      std::ostream &OS) {
+  OS << "// BasicAliasAnalysis code.\n";
+  OS << "#ifdef GET_MODREF_BEHAVIOR\n";
+  for (unsigned i = 0, e = Ints.size(); i != e; ++i) {
+    switch (Ints[i].ModRef) {
+    default: break;
+    case CodeGenIntrinsic::NoMem:
+      OS << "  NoMemoryTable.push_back(\"" << Ints[i].Name << "\");\n";
+      break;
+    case CodeGenIntrinsic::ReadArgMem:
+    case CodeGenIntrinsic::ReadMem:
+      OS << "  OnlyReadsMemoryTable.push_back(\"" << Ints[i].Name << "\");\n";
+      break;
+    }
+  }
+  OS << "#endif\n\n";
+}
index f09f6f633b43a8f6792f8d321e8c785d9cda2319..ce1b3b63a854e4941022567bd72e68251c3d6ee7 100644 (file)
@@ -33,6 +33,8 @@ namespace llvm {
                               std::ostream &OS);
     void EmitVerifier(const std::vector<CodeGenIntrinsic> &Ints, 
                       std::ostream &OS);
+    void EmitModRefInfo(const std::vector<CodeGenIntrinsic> &Ints, 
+                        std::ostream &OS);
   };
 
 } // End llvm namespace