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