summaryrefslogtreecommitdiff
path: root/utils/TableGen/IntrinsicEmitter.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2006-03-09 22:30:49 +0000
committerChris Lattner <sabre@nondot.org>2006-03-09 22:30:49 +0000
commit6448ee44c6f232f215d5d9f145a0d71a983c4a3f (patch)
treef584ce953eb7475490619bc2911dacaac9f821a5 /utils/TableGen/IntrinsicEmitter.cpp
parentc92dba26bf7b1576d175021b450e8b988a8efa5e (diff)
downloadllvm-6448ee44c6f232f215d5d9f145a0d71a983c4a3f.tar.gz
llvm-6448ee44c6f232f215d5d9f145a0d71a983c4a3f.tar.bz2
llvm-6448ee44c6f232f215d5d9f145a0d71a983c4a3f.tar.xz
Parse mod/ref properties, autogen mod/ref information
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26669 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/TableGen/IntrinsicEmitter.cpp')
-rw-r--r--utils/TableGen/IntrinsicEmitter.cpp45
1 files changed, 45 insertions, 0 deletions
diff --git a/utils/TableGen/IntrinsicEmitter.cpp b/utils/TableGen/IntrinsicEmitter.cpp
index 8981311def..680264ff20 100644
--- a/utils/TableGen/IntrinsicEmitter.cpp
+++ b/utils/TableGen/IntrinsicEmitter.cpp
@@ -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";
+}