diff options
author | Chris Lattner <sabre@nondot.org> | 2002-11-08 20:34:02 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2002-11-08 20:34:02 +0000 |
commit | a9a93f37779bbab41d73142aa5e4beb43089696e (patch) | |
tree | 8acb3c0486be4adca091be28c260ffe1930839e0 | |
parent | d321593330f0e3c9a1cabf688e7e964f7bda09f5 (diff) |
Add a method "getMainFunction()" that efficiently locates 'main' in a module
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4629 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/Module.h | 6 | ||||
-rw-r--r-- | lib/VMCore/Module.cpp | 52 |
2 files changed, 58 insertions, 0 deletions
diff --git a/include/llvm/Module.h b/include/llvm/Module.h index 2b8c0ab5d0..6f7a14f410 100644 --- a/include/llvm/Module.h +++ b/include/llvm/Module.h @@ -80,6 +80,12 @@ public: /// Function *getFunction(const std::string &Name, const FunctionType *Ty); + /// getMainFunction - This function looks up main efficiently. This is such a + /// common case, that it is a method in Module. If main cannot be found, a + /// null pointer is returned. + /// + Function *getMainFunction(); + /// addTypeName - Insert an entry in the symbol table mapping Str to Type. If /// there is already an entry for this name, true is returned and the symbol /// table is not modified. diff --git a/lib/VMCore/Module.cpp b/lib/VMCore/Module.cpp index 397b5e2834..fec6fec77d 100644 --- a/lib/VMCore/Module.cpp +++ b/lib/VMCore/Module.cpp @@ -139,6 +139,58 @@ bool Module::addTypeName(const std::string &Name, const Type *Ty) { return false; } +/// getMainFunction - This function looks up main efficiently. This is such a +/// common case, that it is a method in Module. If main cannot be found, a +/// null pointer is returned. +/// +Function *Module::getMainFunction() { + std::vector<const Type*> Params; + + // int main(void)... + if (Function *F = getFunction("main", FunctionType::get(Type::IntTy, + Params, false))) + return F; + + // void main(void)... + if (Function *F = getFunction("main", FunctionType::get(Type::VoidTy, + Params, false))) + return F; + + Params.push_back(Type::IntTy); + + // int main(int argc)... + if (Function *F = getFunction("main", FunctionType::get(Type::IntTy, + Params, false))) + return F; + + // void main(int argc)... + if (Function *F = getFunction("main", FunctionType::get(Type::VoidTy, + Params, false))) + return F; + + for (unsigned i = 0; i != 2; ++i) { // Check argv and envp + Params.push_back(PointerType::get(PointerType::get(Type::SByteTy))); + + // int main(int argc, char **argv)... + if (Function *F = getFunction("main", FunctionType::get(Type::IntTy, + Params, false))) + return F; + + // void main(int argc, char **argv)... + if (Function *F = getFunction("main", FunctionType::get(Type::VoidTy, + Params, false))) + return F; + } + + // Loop over all of the methods, trying to find main the hard way... + for (iterator I = begin(), E = end(); I != E; ++I) + if (I->getName() == "main") + return I; + return 0; // Main not found... +} + + + // getTypeName - If there is at least one entry in the symbol table for the // specified type, return it. // |