2016-06-17 21 views
3

最近、llvmを使用してLLVM-IRに呼び出し命令を挿入しました。問題は、addという名前の関数がある場合、IRのadd()が_Z3addv_の可能性があるため、getFuntion(string)を使って見つけることができないということです。私はIRのすべての機能に新しい名前があることを知っていますが、私は新しい名前が正確に何であるか分かりませんでした。LLVM-関数の実名/元の名前で関数を取得する方法

Module *m = f->getParent(); 
    IRBuilder<> builder(m->getContext()); 
    Function *call = m->getFunction("add"); 
    // call is NULL. 
    std::vector<Value *> args; 
    ...... 



Module *m = f->getParent(); 
IRBuilder<> builder(m->getContext()); 
Function *call = m->getFunction("_Z3addv"); 
// call is not NULL. 
std::vector<Value *> args; 
...... 

どのようにして元の名前で機能を見つけることができますか?

+2

にC++の名前をFunction *call = m->getFunction("_Z3addv");

を変更することができますちょうどcxxabi.h が含まれ、素敵なデマングルライブラリを持っていますマングリングはclangによって行われるので、clangのAPIを見てください。 –

答えて

2

ManglerLLVMCoreから再利用できます。ここで

は使い方の例です:

std::string mangledName; 
raw_string_ostream mangledNameStream(mangledName); 
Mangler::getNameWithPrefix(mangledNameStream, "add", m->getDataLayout()); 
// now mangledName contains, well, mangled name :) 
+0

だと思います。これは私が欲しいものです!注意:バッファをフラッシュするために3行の後に 'mangledNameStream.flush()'を追加する必要があります。そうしないと、manglednameはNULLになります。 – qc1iu

+2

私はこれを試しましたが、うまくいかないようです。 'mangledName'には、変換されていない名前が含まれます。 – executor21

0

のlibstdC++次にあなたがint status; Function *call = m->getFunction(abi::__cxa_demangle("_Z3addv"), nullptr, nullptr, &status);

関連する問題