1*5ba302fdSKoustubha Bhat 2*5ba302fdSKoustubha Bhat #include "llvm/IR/GlobalVariable.h" 3*5ba302fdSKoustubha Bhat #include "llvm/IR/Module.h" 4*5ba302fdSKoustubha Bhat #include "llvm/Pass.h" 5*5ba302fdSKoustubha Bhat 6*5ba302fdSKoustubha Bhat #include "llvm/Support/raw_ostream.h" 7*5ba302fdSKoustubha Bhat #include "llvm/Support/Regex.h" 8*5ba302fdSKoustubha Bhat 9*5ba302fdSKoustubha Bhat using namespace llvm; 10*5ba302fdSKoustubha Bhat 11*5ba302fdSKoustubha Bhat //#define passLog(M) (errs() << "WeakAliasModuleOverride: " << M << "\n") 12*5ba302fdSKoustubha Bhat #define passLog(M) /* nothing */ 13*5ba302fdSKoustubha Bhat 14*5ba302fdSKoustubha Bhat namespace { 15*5ba302fdSKoustubha Bhat class WeakAliasModuleOverride : public ModulePass { 16*5ba302fdSKoustubha Bhat 17*5ba302fdSKoustubha Bhat public: 18*5ba302fdSKoustubha Bhat static char ID; WeakAliasModuleOverride()19*5ba302fdSKoustubha Bhat WeakAliasModuleOverride() : ModulePass(ID) { 20*5ba302fdSKoustubha Bhat } 21*5ba302fdSKoustubha Bhat runOnModule(Module & M)22*5ba302fdSKoustubha Bhat virtual bool runOnModule(Module &M) { 23*5ba302fdSKoustubha Bhat const Module::FunctionListType &listFcts = M.getFunctionList(); 24*5ba302fdSKoustubha Bhat const Module::GlobalListType &listGlobalVars = M.getGlobalList(); 25*5ba302fdSKoustubha Bhat 26*5ba302fdSKoustubha Bhat std::string Asm = M.getModuleInlineAsm(); 27*5ba302fdSKoustubha Bhat 28*5ba302fdSKoustubha Bhat passLog("ASM START\n" 29*5ba302fdSKoustubha Bhat << Asm 30*5ba302fdSKoustubha Bhat << "ASM END\n"); 31*5ba302fdSKoustubha Bhat 32*5ba302fdSKoustubha Bhat // Filter out Function symbols 33*5ba302fdSKoustubha Bhat for(Module::const_iterator it = listFcts.begin(), end=listFcts.end(); it!= end; ++it) 34*5ba302fdSKoustubha Bhat { 35*5ba302fdSKoustubha Bhat if (it->isDeclaration()) 36*5ba302fdSKoustubha Bhat continue; 37*5ba302fdSKoustubha Bhat 38*5ba302fdSKoustubha Bhat // Filter out the assembly weak symbol as well as its default value 39*5ba302fdSKoustubha Bhat std::string symbolName = it->getName(); 40*5ba302fdSKoustubha Bhat std::string matchWeak = "(^.weak.* " + symbolName + "\n)"; 41*5ba302fdSKoustubha Bhat std::string matchAssignement = "(^" + symbolName + " .*=.*\n)"; 42*5ba302fdSKoustubha Bhat 43*5ba302fdSKoustubha Bhat Regex filterWeak(matchWeak, Regex::Newline); 44*5ba302fdSKoustubha Bhat Regex filterAssignement(matchAssignement, Regex::Newline); 45*5ba302fdSKoustubha Bhat 46*5ba302fdSKoustubha Bhat while(filterWeak.match(Asm)) 47*5ba302fdSKoustubha Bhat Asm = filterWeak.sub("", Asm); 48*5ba302fdSKoustubha Bhat 49*5ba302fdSKoustubha Bhat while(filterAssignement.match(Asm)) 50*5ba302fdSKoustubha Bhat Asm = filterAssignement.sub("", Asm); 51*5ba302fdSKoustubha Bhat } 52*5ba302fdSKoustubha Bhat 53*5ba302fdSKoustubha Bhat // Filter out GlobalVariable symbols 54*5ba302fdSKoustubha Bhat for(Module::const_global_iterator it = listGlobalVars.begin(), end=listGlobalVars.end(); it!= end; ++it) 55*5ba302fdSKoustubha Bhat { 56*5ba302fdSKoustubha Bhat if (! it->hasInitializer()) 57*5ba302fdSKoustubha Bhat continue; 58*5ba302fdSKoustubha Bhat 59*5ba302fdSKoustubha Bhat // Filter out the assembly weak symbol as well as its default value 60*5ba302fdSKoustubha Bhat std::string symbolName = it->getName(); 61*5ba302fdSKoustubha Bhat std::string matchWeak = "(^.weak.* " + symbolName + "\n)"; 62*5ba302fdSKoustubha Bhat std::string matchAssignement = "(^" + symbolName + " .*=.*\n)"; 63*5ba302fdSKoustubha Bhat 64*5ba302fdSKoustubha Bhat Regex filterWeak(matchWeak, Regex::Newline); 65*5ba302fdSKoustubha Bhat Regex filterAssignement(matchAssignement, Regex::Newline); 66*5ba302fdSKoustubha Bhat 67*5ba302fdSKoustubha Bhat while(filterWeak.match(Asm)) 68*5ba302fdSKoustubha Bhat Asm = filterWeak.sub("", Asm); 69*5ba302fdSKoustubha Bhat 70*5ba302fdSKoustubha Bhat while(filterAssignement.match(Asm)) 71*5ba302fdSKoustubha Bhat Asm = filterAssignement.sub("", Asm); 72*5ba302fdSKoustubha Bhat } 73*5ba302fdSKoustubha Bhat 74*5ba302fdSKoustubha Bhat M.setModuleInlineAsm(Asm); 75*5ba302fdSKoustubha Bhat 76*5ba302fdSKoustubha Bhat passLog("ASM START - registered\n" 77*5ba302fdSKoustubha Bhat << M.getModuleInlineAsm() 78*5ba302fdSKoustubha Bhat << "ASM END\n"); 79*5ba302fdSKoustubha Bhat 80*5ba302fdSKoustubha Bhat return true; 81*5ba302fdSKoustubha Bhat } 82*5ba302fdSKoustubha Bhat }; 83*5ba302fdSKoustubha Bhat } 84*5ba302fdSKoustubha Bhat 85*5ba302fdSKoustubha Bhat char WeakAliasModuleOverride::ID = 0; 86*5ba302fdSKoustubha Bhat RegisterPass<WeakAliasModuleOverride> WEAK_ALIAS_MODULE_OVERRIDE("weak-alias-module-override", "Fix Weak Alias overrides"); 87