diff options
author | Anand Shukla <ashukla@cs.uiuc.edu> | 2002-07-16 18:58:08 +0000 |
---|---|---|
committer | Anand Shukla <ashukla@cs.uiuc.edu> | 2002-07-16 18:58:08 +0000 |
commit | e0b514259c649e0363373da2b301ee92866d3a5d (patch) | |
tree | 81f7d16b618737cb2830abdffe853eb0a0bdf072 /lib/Transforms/Instrumentation/EmitFunctions.cpp | |
parent | f080ec7dcd3a7bec57b82bc5be28ed5203248e03 (diff) |
Moved over EmitFunctions to this library
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2928 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Instrumentation/EmitFunctions.cpp')
-rw-r--r-- | lib/Transforms/Instrumentation/EmitFunctions.cpp | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/lib/Transforms/Instrumentation/EmitFunctions.cpp b/lib/Transforms/Instrumentation/EmitFunctions.cpp new file mode 100644 index 0000000000..2d9b9a7c93 --- /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<const Type*> vType; + vector<Constant *> 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 +} |