diff options
| author | Anand Shukla <ashukla@cs.uiuc.edu> | 2002-07-12 20:10:50 +0000 |
|---|---|---|
| committer | Anand Shukla <ashukla@cs.uiuc.edu> | 2002-07-12 20:10:50 +0000 |
| commit | 127412b0dab172b733d7fffb2953cb4a8d7f6996 (patch) | |
| tree | 16ee81acfa2610ee22fc0edf85c7ac789c436ed2 /llvm/lib/Transforms | |
| parent | 83ce4f9298b337bcdbafb5c2abd57e7fae2495c6 (diff) | |
| download | bcm5719-llvm-127412b0dab172b733d7fffb2953cb4a8d7f6996.tar.gz bcm5719-llvm-127412b0dab172b733d7fffb2953cb4a8d7f6996.zip | |
Initial version: adds a function table to output code
llvm-svn: 2881
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Instrumentation/ProfilePaths/EmitFunctions/EmitFunctions.cpp | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/ProfilePaths/EmitFunctions/EmitFunctions.cpp b/llvm/lib/Transforms/Instrumentation/ProfilePaths/EmitFunctions/EmitFunctions.cpp new file mode 100644 index 00000000000..e177f89f32f --- /dev/null +++ b/llvm/lib/Transforms/Instrumentation/ProfilePaths/EmitFunctions/EmitFunctions.cpp @@ -0,0 +1,52 @@ +//===-- EmitFunctions.cpp - interface to insert instrumentation --*- C++ -*--=// +// +// This inserts a global constant table with function pointers all along +// +//===----------------------------------------------------------------------===// + +//#include "llvm/Transforms/Instrumentation/ProfilePaths.h" +//#include "llvm/Transforms/Utils/UnifyFunctionExitNodes.h" +#include "llvm/Support/CFG.h" +#include "llvm/Transforms/Instrumentation/EmitFunctions.h" +#include "llvm/Constants.h" +#include "llvm/DerivedTypes.h" +#include "llvm/iMemory.h" +#include "llvm/Constants.h" +#include "llvm/Module.h" +#include <iostream> +#include <fstream> + +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){ + Function *F = MI; + if(F->size()<=1) continue; + ConstantPointerRef *cpref = ConstantPointerRef::get(F); + vType.push_back(MI->getType()); + vConsts.push_back(cpref); + } + + StructType *sttype = StructType::get(vType); + ConstantStruct *cstruct = ConstantStruct::get(sttype, vConsts); + + GlobalVariable *gb = new GlobalVariable(cstruct->getType(), true, true, + cstruct, "llvmFunctionTable"); + M.getGlobalList().push_back(gb); + return true; // Always modifies function +} |

