2016-03-24 10 views
0

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; 
} 

cevap

0

Bazı kapsamlı github arama yaptıktan sonra bu anlamaya başardı. Here, bir Modül Geçişi'nin nasıl uygulanacağını merak eden başkalarına yardımcı olmak için bir öğreticiyi takip ettiğim cevaptır.