From: Anand Shukla Date: Tue, 16 Jul 2002 18:58:08 +0000 (+0000) Subject: Moved over EmitFunctions to this library X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=e0b514259c649e0363373da2b301ee92866d3a5d;p=oota-llvm.git Moved over EmitFunctions to this library git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2928 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Instrumentation/EmitFunctions.cpp b/lib/Transforms/Instrumentation/EmitFunctions.cpp new file mode 100644 index 00000000000..2d9b9a7c93c --- /dev/null +++ b/lib/Transforms/Instrumentation/EmitFunctions.cpp @@ -0,0 +1,45 @@ +//===-- EmitFunctions.cpp - interface to insert instrumentation --*- C++ -*--=// +// +// This inserts a global constant table with function pointers all along +// +//===----------------------------------------------------------------------===// + +#include "llvm/Transforms/Instrumentation/EmitFunctions.h" +#include "llvm/Constants.h" +#include "llvm/DerivedTypes.h" +#include "llvm/Constants.h" +#include "llvm/Module.h" + +using std::vector; + +struct EmitFunctionTable : public Pass { + const char *getPassName() const { return "EmitFunctionTablePass"; } + + bool run(Module &M); +}; + +// Create a new pass to add function table +// +Pass *createEmitFunctionTablePass() { + return new EmitFunctionTable(); +} + +// Per Module pass for inserting function table +bool EmitFunctionTable::run(Module &M){ + vector vType; + vector vConsts; + for(Module::iterator MI = M.begin(), ME = M.end(); MI!=ME; ++MI) + if (!MI->isExternal()) { + ConstantPointerRef *CP = ConstantPointerRef::get(MI); + vType.push_back(MI->getType()); + vConsts.push_back(CP); + } + + StructType *sttype = StructType::get(vType); + ConstantStruct *cstruct = ConstantStruct::get(sttype, vConsts); + + GlobalVariable *gb = new GlobalVariable(cstruct->getType(), true, false, + cstruct, "llvmFunctionTable"); + M.getGlobalList().push_back(gb); + return true; // Always modifies program +}