xref: /minix3/minix/llvm/passes/WeakAliasModuleOverride/WeakAliasModuleOverride.cpp (revision 5ba302fdeaa9e153d58b5dcaef42d660aedee92e)
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