From a9a93f37779bbab41d73142aa5e4beb43089696e Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 8 Nov 2002 20:34:02 +0000 Subject: [PATCH] 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 --- include/llvm/Module.h | 6 +++++ lib/VMCore/Module.cpp | 52 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/include/llvm/Module.h b/include/llvm/Module.h index 2b8c0ab5d0e..6f7a14f410b 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 397b5e28341..fec6fec77d3 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 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. // -- 2.34.1