diff options
author | Chris Lattner <sabre@nondot.org> | 2006-03-09 20:34:19 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2006-03-09 20:34:19 +0000 |
commit | 9b843b249462980ae4630dc37d1bcccde884a5a7 (patch) | |
tree | 413da84b9907c4bd3f2d8f0e1734d3ba1c47910e | |
parent | 80c2c9224f443b59b699f355c60eb681867a4ff8 (diff) | |
download | external_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.cpp | 37 | ||||
-rw-r--r-- | utils/TableGen/IntrinsicEmitter.h | 4 |
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 |