From d5f25dc1eb1fc27ce88a28ec73318c62ea6f6422 Mon Sep 17 00:00:00 2001 From: Anand Shukla Date: Tue, 16 Jul 2002 18:58:08 +0000 Subject: [PATCH] Moved over EmitFunctions to this library llvm-svn: 2928 --- .../Instrumentation/EmitFunctions.cpp | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 llvm/lib/Transforms/Instrumentation/EmitFunctions.cpp diff --git a/llvm/lib/Transforms/Instrumentation/EmitFunctions.cpp b/llvm/lib/Transforms/Instrumentation/EmitFunctions.cpp new file mode 100644 index 000000000000..2d9b9a7c93c2 --- /dev/null +++ b/llvm/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 +}