 5ba302fdea
			
		
	
	
		5ba302fdea
		
	
	
	
	
		
			
			Allows instrumentation of Minix components using LLVM passes from
"llvm-apps" repository
In addition, the change does the following:
 1. Move releasetools/generate_gold_plugin.sh to minix/llvm
 2. Move external/bsd/llvm/passes to minix/llvm/passes
 3. libLTO.so, LLVMgold.so and WeakAliasModuleOverride.so files
    now get installed in minix/llvm/bin
		
	
			
		
			
				
	
	
		
			87 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
 | |
| #include "llvm/IR/GlobalVariable.h"
 | |
| #include "llvm/IR/Module.h"
 | |
| #include "llvm/Pass.h"
 | |
| 
 | |
| #include "llvm/Support/raw_ostream.h"
 | |
| #include "llvm/Support/Regex.h"
 | |
| 
 | |
| using namespace llvm;
 | |
| 
 | |
| //#define passLog(M) (errs() << "WeakAliasModuleOverride: " << M << "\n")
 | |
| #define passLog(M) /* nothing */
 | |
| 
 | |
| namespace {
 | |
|   class WeakAliasModuleOverride : public ModulePass {
 | |
| 
 | |
|   public:
 | |
|     static char ID;
 | |
|     WeakAliasModuleOverride() : ModulePass(ID) {
 | |
|     }
 | |
| 
 | |
|     virtual bool runOnModule(Module &M) {
 | |
|       const Module::FunctionListType &listFcts = M.getFunctionList();
 | |
|       const Module::GlobalListType &listGlobalVars = M.getGlobalList();
 | |
| 
 | |
|       std::string Asm = M.getModuleInlineAsm();
 | |
| 
 | |
|       passLog("ASM START\n"
 | |
| 	  << Asm
 | |
| 	  << "ASM END\n");
 | |
| 
 | |
|       // Filter out Function symbols
 | |
|       for(Module::const_iterator it = listFcts.begin(), end=listFcts.end(); it!= end; ++it)
 | |
|       {
 | |
| 	if (it->isDeclaration())
 | |
| 	  continue;
 | |
| 
 | |
| 	// Filter out the assembly weak symbol as well as its default value
 | |
|         std::string symbolName = it->getName();
 | |
|         std::string matchWeak = "(^.weak.* " + symbolName + "\n)";
 | |
|         std::string matchAssignement = "(^" + symbolName + " .*=.*\n)";
 | |
| 
 | |
|         Regex filterWeak(matchWeak, Regex::Newline);
 | |
|         Regex filterAssignement(matchAssignement, Regex::Newline);
 | |
| 
 | |
|         while(filterWeak.match(Asm))
 | |
|           Asm = filterWeak.sub("", Asm);
 | |
| 
 | |
|         while(filterAssignement.match(Asm))
 | |
|           Asm = filterAssignement.sub("", Asm);
 | |
|       }
 | |
| 
 | |
|       // Filter out GlobalVariable symbols
 | |
|       for(Module::const_global_iterator it = listGlobalVars.begin(), end=listGlobalVars.end(); it!= end; ++it)
 | |
|       {
 | |
| 	if (! it->hasInitializer())
 | |
| 	  continue;
 | |
| 
 | |
| 	// Filter out the assembly weak symbol as well as its default value
 | |
|         std::string symbolName = it->getName();
 | |
|         std::string matchWeak = "(^.weak.* " + symbolName + "\n)";
 | |
|         std::string matchAssignement = "(^" + symbolName + " .*=.*\n)";
 | |
| 
 | |
|         Regex filterWeak(matchWeak, Regex::Newline);
 | |
|         Regex filterAssignement(matchAssignement, Regex::Newline);
 | |
| 
 | |
|         while(filterWeak.match(Asm))
 | |
|           Asm = filterWeak.sub("", Asm);
 | |
| 
 | |
|         while(filterAssignement.match(Asm))
 | |
|           Asm = filterAssignement.sub("", Asm);
 | |
|       }
 | |
| 
 | |
|       M.setModuleInlineAsm(Asm);
 | |
| 
 | |
|       passLog("ASM START - registered\n"
 | |
| 	  << M.getModuleInlineAsm()
 | |
| 	  << "ASM END\n");
 | |
| 
 | |
|       return true;
 | |
|     }
 | |
|   };
 | |
| }
 | |
| 
 | |
| char WeakAliasModuleOverride::ID = 0;
 | |
| RegisterPass<WeakAliasModuleOverride> WEAK_ALIAS_MODULE_OVERRIDE("weak-alias-module-override", "Fix Weak Alias overrides");
 |