2017-06-22 2 views
2

私は間接呼び出しを探すためにいくつかのLLVMコードを書いています。今の私はLLVM :: loadinstructions、LLVMをトリガーCコード:: bitcast命令などLLVM:Cでstoredinstとなる間接関数呼び出しを宣言していますか?

を作成しましたが、私はこれをトリガー任意の間接的なCのコードを書くことができないよ:

if(CallInst *CI = dyn_cast<CallInst>(&*S)) { 
    if(!CI->getCalledFunction()) { 
    if(StoreInst *SI = dyn_cast<StoreInst>(CI->getCalledValue())) 
     /* do something */ 
}}} 
+0

を私はあなたが関数ポインタで動作するものが必要と思いますか?多態性を持つC++コードを持っているようで、LLVMで間接呼び出しが行われます。 –

答えて

1

はありますあなたの状態にStoreInstからの読書が含まれていますか? 次の関数を作成すると、条件はLoadInstになります。 LLVM IR対応

extern int printf(const char *fmt, ...); 

static void foo() { 
    printf("Hello!\n"); 
} 

int main() { 
    void (*pointer)(void) = foo; 

    pointer(); 

    return 0; 
} 

; Function Attrs: nounwind ssp uwtable 
define i32 @main() #0 !dbg !7 { 
    %1 = alloca i32, align 4 
    %2 = alloca void()*, align 8 
    store i32 0, i32* %1, align 4 
    call void @llvm.dbg.declare(metadata void()** %2, metadata !11, metadata !15), !dbg !16 
    store void()* @foo, void()** %2, align 8, !dbg !16 
    %3 = load void()*, void()** %2, align 8, !dbg !17 
    call void %3(), !dbg !17 
    ret i32 0, !dbg !18 
} 

clang -g -c -emit-llvm main.cでこれをコンパイルします。

次のコード:

int main(int argc, const char * argv[]) { 
    LLVMContext context; 
    const char *path = "main.bc"; 
    auto BufferOrError = MemoryBuffer::getFile(path); 
    if (!BufferOrError) { 
    std::cout << "Can't open bitcode file '" << path << "'\n"; 
    return 1; 
    } 

    auto moduleOrError = parseBitcodeFile(BufferOrError->get()->getMemBufferRef(), context); 
    if (!moduleOrError) { 
    std::cout << "Can't parse bitcode file '" << path << "'\n"; 
    return 1; 
    } 

    Module *module = moduleOrError->get(); 

    for (auto &F: *module) { 
    for (auto &BB: F) { 
     for (auto &I: BB) { 
     if (CallInst *CI = dyn_cast<CallInst>(&I)) { 
      if (!CI->getCalledFunction()) { 
      CI->dump(); 

      if (StoreInst *SI = dyn_cast<StoreInst>(CI->getCalledValue())) { 
       errs() << "StoreInst\n"; 
       CI->dump(); 
      } 

      if (LoadInst *LI = dyn_cast<LoadInst>(CI->getCalledValue())) { 
       errs() << "LoadInst\n"; 
       LI->dump(); 
      } 
      } 
     } 
     } 
    } 
    } 

    return 0; 
} 

は生成します。

call void %3(), !dbg !17 
LoadInst 
%3 = load void()*, void()** %2, align 8, !dbg !17 
+0

あなたは正しいです、私はloadinstrを起動できますが、storeinstは起動できません。私のコードがstoredinstを起動するかどうかは分かりませんが、それを調べてあなたに戻ってきます。 – laycat

+0

[llvm-devメーリングリスト](http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev)にお尋ねください。あなたはそこで答えを得るでしょう。 –

関連する問題