2014-01-19 6 views
1

를 인쇄 할 AssemblyAnnotationWriter을 구현하려면 어떻게합니까. 나는 함수의 시작하기 전에 #[uses]=1를 인쇄 할 http://llvm.org/doxygen/AssemblyAnnotationWriter_8h_source.html 에서 주어진내가 LLVM에서 패스를 작성하는 방법을 배우고 메타 데이터를

virtual void emitFunctionAnnot(const Function *, formatted_raw_ostream &){}

을 구현하기 위해 노력하고 있습니다.

메서드 내에서 수동으로 emitFunctionAnnot(&F, ferrs());을 호출하면 아래 코드가 작동합니다 (emitFunctionAnnot). 그러나 그것이 그것을 무시하는 전체적인 이유이기 때문에 그것을 manullay라고 부르지 않고 작동해서는 안됩니다. 내가 무시하는 동안 내가 뭔가 잘못하고 있다고 생각한다. 디버깅을 위해 수많은 시간을 보냈습니다. 나는 어떤 도움을 주셔서 감사합니다.

이것은 내가 지금까지 가지고있는 것입니다.

#include "llvm/Pass.h" 
#include "llvm/PassManager.h" 
#include "llvm/Transforms/IPO/PassManagerBuilder.h" 
#include "llvm/DebugInfo.h" 
#include "llvm/IR/Function.h" 
#include "llvm/IR/Module.h" 
#include "llvm/Support/raw_ostream.h" 
#include "llvm/Support/FormattedStream.h" 
#include "llvm/Support/InstIterator.h" 
#include "llvm/IR/Instruction.h" 
#include "llvm/DebugInfo.h" 
#include "llvm/Assembly/AssemblyAnnotationWriter.h" 


#include <ostream> 
#include <fstream> 
#include <iostream> 
#include <stdlib.h> 

using namespace llvm; 

namespace { 


class CommentWriter : public AssemblyAnnotationWriter { 
public: 
virtual void emitFunctionAnnot(const Function *F, 
         formatted_raw_ostream &OS) { 
    OS << "; [#uses=" << F->getNumUses() << ']'; // Output # uses 
    OS << '\n'; 
    } 

}; 

class FunctionInfo : public FunctionPass, public AssemblyAnnotationWriter{ 

public: 
    static char ID; 
    FunctionInfo() : FunctionPass(ID) {} 

void emitFunctionAnnot(const Function *F, formatted_raw_ostream &OS) { 
    errs() << "CALLED"; 
    OS << "; [#uses=" << F->getNumUses() << ']'; // Output # uses 
    OS << '\n'; 
    } 


    virtual bool runOnFunction(Function &F) { 

// emitFunctionAnnot(&F, ferrs()); 
    for (inst_iterator I = inst_begin(F), E = inst_end(F); I != E; ++I){ 
     Instruction &II = *I; 
     errs() << *I; 

    } 
    return false; 
    } 


    virtual void getAnalysisUsage(AnalysisUsage &AU) const { 
    AU.setPreservesAll(); 
    } 
}; 


char FunctionInfo::ID = 0; 

// clang -c -Xclang -load -Xclang ./FunctionInfo.so loop.c 
static void registerMyPass(const PassManagerBuilder &, 
          PassManagerBase &PM) { 
    PM.add(new FunctionInfo()); 
} 
RegisterStandardPasses 
    RegisterMyPass(PassManagerBuilder::EP_EarlyAsPossible, 
        registerMyPass); 

    RegisterPass<FunctionInfo> X("function-info", "Function Information"); 

    } 

답변

0

주석은 LLVM IR 출력에 주석으로 만 존재합니다. 실제로 IR의 일부가 아니므로 패스에서 "추가"하는 것이 아닙니다.

AssemblyAnnotationWriter을 사용하는 방법은 print 함수 (예 : Module::print)의 두 번째 인수로 전달하는 것입니다. 당신은 안에 패스를 할 수 있지만 자동으로 수행되는 것은 아닙니다. 특히 패스를 AssemblyAnnotationWriter에서 상속하는 것은 무의미합니다. 질문에 표시 한 첫 번째 방법은 별도의 클래스에서 상속 한 올바른 방법입니다. 당신이 당신의 패스 모듈의 출력을 원하는 경우 짧은에서

, 그것에 print를 호출합니다. 인쇄물에 주석을 추가하려면 동일한 print을 호출하지만 CommentWriter의 인스턴스를 두 번째 인수로 전달하십시오.