1 //===-- ExtractGV.cpp - Global Value extraction pass ----------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This pass extracts global values
12 //===----------------------------------------------------------------------===//
14 #include "llvm/Instructions.h"
15 #include "llvm/LLVMContext.h"
16 #include "llvm/Module.h"
17 #include "llvm/Pass.h"
18 #include "llvm/Constants.h"
19 #include "llvm/Transforms/IPO.h"
20 #include "llvm/Support/Compiler.h"
25 /// @brief A pass to extract specific functions and their dependencies.
26 class VISIBILITY_HIDDEN GVExtractorPass
: public ModulePass
{
27 std::vector
<GlobalValue
*> Named
;
31 static char ID
; // Pass identification, replacement for typeid
33 /// FunctionExtractorPass - If deleteFn is true, this pass deletes as the
34 /// specified function. Otherwise, it deletes as much of the module as
35 /// possible, except for the function specified.
37 explicit GVExtractorPass(std::vector
<GlobalValue
*>& GVs
, bool deleteS
= true,
38 bool relinkCallees
= false)
39 : ModulePass(&ID
), Named(GVs
), deleteStuff(deleteS
),
40 reLink(relinkCallees
) {}
42 bool runOnModule(Module
&M
) {
43 if (Named
.size() == 0) {
44 return false; // Nothing to extract
50 M
.setModuleInlineAsm("");
55 for (std::vector
<GlobalValue
*>::iterator GI
= Named
.begin(),
56 GE
= Named
.end(); GI
!= GE
; ++GI
) {
57 if (Function
* NamedFunc
= dyn_cast
<Function
>(*GI
)) {
58 // If we're in relinking mode, set linkage of all internal callees to
59 // external. This will allow us extract function, and then - link
60 // everything together
62 for (Function::iterator B
= NamedFunc
->begin(), BE
= NamedFunc
->end();
64 for (BasicBlock::iterator I
= B
->begin(), E
= B
->end();
66 if (CallInst
* callInst
= dyn_cast
<CallInst
>(&*I
)) {
67 Function
* Callee
= callInst
->getCalledFunction();
68 if (Callee
&& Callee
->hasLocalLinkage())
69 Callee
->setLinkage(GlobalValue::ExternalLinkage
);
75 NamedFunc
->setLinkage(GlobalValue::ExternalLinkage
);
76 NamedFunc
->deleteBody();
77 assert(NamedFunc
->isDeclaration() && "This didn't make the function external!");
79 if (!(*GI
)->isDeclaration()) {
80 cast
<GlobalVariable
>(*GI
)->setInitializer(0); //clear the initializer
81 (*GI
)->setLinkage(GlobalValue::ExternalLinkage
);
88 bool isolateGV(Module
&M
) {
89 // Mark all globals internal
90 // FIXME: what should we do with private linkage?
91 for (Module::global_iterator I
= M
.global_begin(), E
= M
.global_end(); I
!= E
; ++I
)
92 if (!I
->isDeclaration()) {
93 I
->setLinkage(GlobalValue::InternalLinkage
);
95 for (Module::iterator I
= M
.begin(), E
= M
.end(); I
!= E
; ++I
)
96 if (!I
->isDeclaration()) {
97 I
->setLinkage(GlobalValue::InternalLinkage
);
100 // Make sure our result is globally accessible...
101 // by putting them in the used array
103 std::vector
<Constant
*> AUGs
;
105 PointerType::getUnqual(Type::getInt8Ty(M
.getContext()));
106 for (std::vector
<GlobalValue
*>::iterator GI
= Named
.begin(),
107 GE
= Named
.end(); GI
!= GE
; ++GI
) {
108 (*GI
)->setLinkage(GlobalValue::ExternalLinkage
);
109 AUGs
.push_back(ConstantExpr::getBitCast(*GI
, SBP
));
111 ArrayType
*AT
= ArrayType::get(SBP
, AUGs
.size());
112 Constant
*Init
= ConstantArray::get(AT
, AUGs
);
113 GlobalValue
*gv
= new GlobalVariable(M
, AT
, false,
114 GlobalValue::AppendingLinkage
,
116 gv
->setSection("llvm.metadata");
119 // All of the functions may be used by global variables or the named
120 // globals. Loop through them and create a new, external functions that
121 // can be "used", instead of ones with bodies.
122 std::vector
<Function
*> NewFunctions
;
124 Function
*Last
= --M
.end(); // Figure out where the last real fn is.
126 for (Module::iterator I
= M
.begin(); ; ++I
) {
127 if (std::find(Named
.begin(), Named
.end(), &*I
) == Named
.end()) {
128 Function
*New
= Function::Create(I
->getFunctionType(),
129 GlobalValue::ExternalLinkage
);
130 New
->copyAttributesFrom(I
);
132 // If it's not the named function, delete the body of the function
133 I
->dropAllReferences();
135 M
.getFunctionList().push_back(New
);
136 NewFunctions
.push_back(New
);
140 if (&*I
== Last
) break; // Stop after processing the last function
143 // Now that we have replacements all set up, loop through the module,
144 // deleting the old functions, replacing them with the newly created
146 if (!NewFunctions
.empty()) {
147 unsigned FuncNum
= 0;
148 Module::iterator I
= M
.begin();
150 if (std::find(Named
.begin(), Named
.end(), &*I
) == Named
.end()) {
151 // Make everything that uses the old function use the new dummy fn
152 I
->replaceAllUsesWith(NewFunctions
[FuncNum
++]);
155 ++I
; // Move the iterator to the new function
157 // Delete the old function!
158 M
.getFunctionList().erase(Old
);
161 ++I
; // Skip the function we are extracting
163 } while (&*I
!= NewFunctions
[0]);
170 char GVExtractorPass::ID
= 0;
173 ModulePass
*llvm::createGVExtractionPass(std::vector
<GlobalValue
*>& GVs
,
174 bool deleteFn
, bool relinkCallees
) {
175 return new GVExtractorPass(GVs
, deleteFn
, relinkCallees
);