aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2006-03-09 20:34:19 +0000
committerChris Lattner <sabre@nondot.org>2006-03-09 20:34:19 +0000
commit9b843b249462980ae4630dc37d1bcccde884a5a7 (patch)
tree413da84b9907c4bd3f2d8f0e1734d3ba1c47910e
parent80c2c9224f443b59b699f355c60eb681867a4ff8 (diff)
downloadexternal_llvm-9b843b249462980ae4630dc37d1bcccde884a5a7.zip
external_llvm-9b843b249462980ae4630dc37d1bcccde884a5a7.tar.gz
external_llvm-9b843b249462980ae4630dc37d1bcccde884a5a7.tar.bz2
autogenerate the function name recognizer
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26663 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--utils/TableGen/IntrinsicEmitter.cpp37
-rw-r--r--utils/TableGen/IntrinsicEmitter.h4
2 files changed, 41 insertions, 0 deletions
diff --git a/utils/TableGen/IntrinsicEmitter.cpp b/utils/TableGen/IntrinsicEmitter.cpp
index dd4324e..902c261 100644
--- a/utils/TableGen/IntrinsicEmitter.cpp
+++ b/utils/TableGen/IntrinsicEmitter.cpp
@@ -55,10 +55,14 @@ void IntrinsicEmitter::run(std::ostream &OS) {
// Emit the enum information.
EmitEnumInfo(Ints, OS);
+
+ // Emit the function name recognizer.
+ EmitFnNameRecognizer(Ints, OS);
}
void IntrinsicEmitter::EmitEnumInfo(const std::vector<CodeGenIntrinsic> &Ints,
std::ostream &OS) {
+ OS << "// Enum values for Intrinsics.h\n";
OS << "#ifdef GET_INTRINSIC_ENUM_VALUES\n";
for (unsigned i = 0, e = Ints.size(); i != e; ++i) {
OS << " " << Ints[i].EnumName;
@@ -68,3 +72,36 @@ void IntrinsicEmitter::EmitEnumInfo(const std::vector<CodeGenIntrinsic> &Ints,
}
OS << "#endif\n\n";
}
+
+void IntrinsicEmitter::
+EmitFnNameRecognizer(const std::vector<CodeGenIntrinsic> &Ints,
+ std::ostream &OS) {
+ // Build a function name -> intrinsic name mapping.
+ std::map<std::string, std::string> IntMapping;
+ for (unsigned i = 0, e = Ints.size(); i != e; ++i)
+ IntMapping[Ints[i].Name] = Ints[i].EnumName;
+
+ OS << "// Function name -> enum value recognizer code.\n";
+ OS << "#ifdef GET_FUNCTION_RECOGNIZER\n";
+ OS << " switch (Name[5]) {\n";
+ OS << " // The 'llvm.' namespace is reserved!\n";
+ OS << " default: assert(0 && \"Unknown LLVM intrinsic function!\");\n";
+ // Emit the intrinsics in sorted order.
+ char LastChar = 0;
+ for (std::map<std::string, std::string>::iterator I = IntMapping.begin(),
+ E = IntMapping.end(); I != E; ++I) {
+ assert(I->first.size() > 5 && std::string(I->first.begin(),
+ I->first.begin()+5) == "llvm." &&
+ "Invalid intrinsic name!");
+ if (I->first[5] != LastChar) {
+ LastChar = I->first[5];
+ OS << " case '" << LastChar << "':\n";
+ }
+
+ OS << " if (Name == \"" << I->first << "\") return Intrinsic::"
+ << I->second << ";\n";
+ }
+ OS << " }\n";
+ OS << "#endif\n";
+}
+
diff --git a/utils/TableGen/IntrinsicEmitter.h b/utils/TableGen/IntrinsicEmitter.h
index debbe4b..5ce12da 100644
--- a/utils/TableGen/IntrinsicEmitter.h
+++ b/utils/TableGen/IntrinsicEmitter.h
@@ -28,6 +28,10 @@ namespace llvm {
void EmitEnumInfo(const std::vector<CodeGenIntrinsic> &Ints,
std::ostream &OS);
+
+ void EmitFnNameRecognizer(const std::vector<CodeGenIntrinsic> &Ints,
+ std::ostream &OS);
+
};
} // End llvm namespace