ビットコードファイルを解析するためにLLVM APIを使用しています。私は以下のスニペットを持っており、このコマンドを使ってビットコード$CC -emit-llvm -c -g source.c
を生成します。ここで、CCはclang
パスに設定されています。LLVMのビットコード関数のパラメータの誤検出
#include <stdio.h>
struct Point {
int a;
int b;
};
int func_0(struct Point p, int x) {
return 0;
}
TypeIDは、パラメータの種類に基づいて数値を、持っていることになっています。しかし、整数x
と構造体Point
の両方については、10
の値が得られ、これはTokenTyID
と呼ばれます。だから、私は関数isIntegerTy()
とisStructTy()
をそれぞれ使用して、少なくともこの場合は正しい結果が得られるかどうかを確認することにしました。この解決策は、整数パラメータx
に対して機能しますが、構造体に対しては機能しません。 構造体を正しく識別してフィールドを読み取るにはどうすればよいですか?ただ、私はこのコードを使用ビットコードを解析するために、完全性
:
using namespace llvm;
int main(int argc, char** argv) {
LLVMContext context;
OwningPtr<MemoryBuffer> mb;
MemoryBuffer::getFile(FileName, mb);
Module *m = ParseBitcodeFile(mb.get(), context);
for (Module::const_iterator i = m->getFunctionList().begin(), e = m->getFunctionList().end(); i != e; ++i) {
if (i->isDeclaration() || i->getName().str() == "main")
continue;
std::cout << i->getName().str() << std::endl;
Type* ret_type = i->getReturnType();
std::cout << "\t(ret) " << ret_type->getTypeID() << std::endl;
Function::const_arg_iterator ai;
Function::const_arg_iterator ae;
for (ai = i->arg_begin(), ae = i->arg_end(); ai != ae; ++ai) {
Type* t = ai->getType();
std::cout << "\t" << ai->getName().str() << " " << t->getTypeID()
<< "(" << t->getFunctionNumParams() << ")"
<< " is struct? " << (t->isStructTy() ? "Y" : "N")
<< " is int? " << (t->isIntegerTy() ? "Y" : "N")
<< "\n";
}
}
return 0;
}
私は構造体で打ち鳴らすことによって行わ翻訳についてのこの記事Why does Clang coerce struct parameters to intsを読んで、私はそれが私と同じ問題であるかなり確信しています。
'clang -S -emit-llvm'を使用してLLVM IRをダンプしようとしましたか? – arrowd
はい、うまくいきません。 "-S"オプションでIRコードを生成し、 "llvm-as"でビットコードを生成すると、問題は同じになります。 – Surcle
私は、生成されたIRを見て、あなたの構造がどのように変化しているかを調べることを意味します。 – arrowd