Fonksiyon geçişleri yaratmaya giden çok sayıda örnek gördüm (örn. Brandon Holt ve Adrian Sampson), ancak bir modül geçişi yaratmanın zorluğunu merak ediyorum. Bu çok benzer problemler. Bu örnekte global değişken adlarını görüntülemek için bir modül geçişi uygulamaya çalıştım ve üyeler arasında nasıl yineleme yapmanız gerektiğini anlamak için llvm kaynak kodu.LLVM geçişleri oluştururken ModulePass üzerinden ModulePass kullanımı
Ben LLVM kaynağı derlenmiş sürümünü kullanarak ve pas eklemek için yukarıdaki bağlantılardan örneğini kullanarak ve sonra çalıştırıyorum: o zaman bu anlamsız döndürür
$ clang -Xclang -load -Xclang build/Skeleton/libSkeletonPass.so something.c
. Ancak, bir functionPass uygularsam ve sadece Auto'yu ilklendirilecek türü belirlemek için kullanırsam, ileriye doğru çalışır ve çalışır. Sadece global değişkenleri yanlış yoldan yazdırmaya gidiyorum?
Bu, terminalden gelen hata çıkışının bir macunudır. link
Skeleton.cpp
#include "llvm/Pass.h"
#include "llvm/IR/Function.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/IR/LegacyPassManager.h"
#include "llvm/IR/InstrTypes.h"
#include "llvm/Transforms/IPO/PassManagerBuilder.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
#include "llvm/IR/Module.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/IRReader/IRReader.h"
#include "llvm/IR/LLVMContext.h"
using namespace llvm;
namespace {
// Helper method for converting the name of a LLVM type to a string
static std::string LLVMTypeAsString(const Type *T) {
std::string TypeName;
raw_string_ostream N(TypeName);
T->print(N);
return N.str();
}
struct SkeletonPass : public ModulePass {
static char ID;
SkeletonPass() : ModulePass(ID) {}
virtual bool runOnModule(Module &M) {
for (Module::const_global_iterator GI = M.global_begin(),
GE = M.global_end(); GI != GE; ++GI) {
errs() << "Found global named: " << GI->getName()
<< "\tType: " << LLVMTypeAsString(GI->getType()) << "!\n";
}
return false;
}
};
}
char SkeletonPass::ID = 0;
// Automatically enable the pass.
// http://adriansampson.net/blog/clangpass.html
static void registerSkeletonPass(const PassManagerBuilder &,
legacy::PassManagerBase &PM) {
PM.add(new SkeletonPass());
}
static RegisterStandardPasses
RegisterMyPass(PassManagerBuilder::EP_EarlyAsPossible,
registerSkeletonPass);
something.c
int value0 = 5;
int main(int argc, char const *argv[])
{
int value = 4;
value += 1;
return 0;
}