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 /lib/VMCore/Module.cpp | |
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
Diffstat (limited to 'lib/VMCore/Module.cpp')
-rw-r--r-- | lib/VMCore/Module.cpp | 52 |
1 files changed, 52 insertions, 0 deletions
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. // |