를 인쇄 할 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");
}