Below is a stripped down version of the pass.<br>The compile line is: clang -O0 -S -emit-llvm -o test.S test.c && opt -S -mem2reg -load <path to extract lib> -extract < test.S > test_opt.S<br><br>#include "llvm/Analysis/DependenceAnalysis.h"<br>
#include "llvm/Analysis/LoopInfo.h"<br>#include "llvm/Analysis/LoopPass.h"<br>#include "llvm/Analysis/ScalarEvolution.h"<br>#include "llvm/Function.h"<br>#include "llvm/Module.h"<br>
#include "llvm/Pass.h"<br>#include "llvm/Support/raw_ostream.h"<br><br>using namespace llvm;<br>using namespace std;<br><br>namespace<br>{<br> class ExtractFeatures : public ModulePass<br> {<br> public:<br>
static char ID;<br><br> ExtractFeatures() : ModulePass(ID)<br> {<br> module = NULL;<br> loopInfo = NULL;<br> scalarEvolution = NULL;<br> }<br>
<br> virtual bool runOnModule(Module& m)<br> {<br> module = &m;<br> bool modified = false;<br><br><br> for (Module::iterator functionIter = module->begin(); functionIter != module->end(); functionIter++)<br>
{<br> if (functionIter->isDeclaration())<br> continue;<br><br> Attributes attributes = functionIter->getFnAttributes();<br> if (!attributes.hasAttribute(Attributes::AlwaysInline))<br>
{<br> functionIter->addFnAttr(llvm::Attributes::AlwaysInline);<br><br> errs() << "AlwaysInline NOT detected\n";<br><br> modified = true;<br>
}<br> else<br> {<br> errs() << "AlwaysInline detected\n";<br> }<br> }<br><br> return modified;<br>
}<br><br> virtual void getAnalysisUsage(AnalysisUsage &analysisUsage) const<br> {<br> analysisUsage.addRequired<LoopInfo>();<br> analysisUsage.addPreserved<LoopInfo>();<br>
analysisUsage.addRequired<ScalarEvolution>();<br> analysisUsage.addPreserved<ScalarEvolution>();<br> analysisUsage.addRequired<DependenceAnalysis>();<br> analysisUsage.addPreserved<DependenceAnalysis>();<br>
}<br><br> private:<br> DependenceAnalysis* dependenceAnalysis;<br> LoopInfo* loopInfo;<br> Module* module;<br> ScalarEvolution* scalarEvolution;<br> };<br>
<br> char ExtractFeatures::ID = 0;<br><br> static RegisterPass<ExtractFeatures> X("extract", "Extract source features", true, true);<br>}<br><br><br>