私はLLVMの関数の宣言を前方に使用しようとしているが、私はそれを行うことができないんだけど...それを行う理由は、このエラーです:前方宣言
error: invalid forward reference to function 'f' with wrong type! "
右今私はこのコードでそれをしようとしています:
std::vector<Type *> args_type = f->get_args_type();
Module* mod = get_module();
std::string struct_name("struct.");
struct_name.append(f->get_name());
Type* StructTy = mod->getTypeByName(struct_name);
if (!StructTy) {
StructTy = Type::getVoidTy(getGlobalContext());
}
FunctionType *ftype = FunctionType::get(StructTy, args_type, false);
//Function *func = Function::Create(ftype, GlobalValue::InternalLinkage, f->get_name(), get_module());
Constant* c = mod->getOrInsertFunction(f->get_name(), ftype);
Function *func = cast<Function>(c);
しかし、私はコードを生成するときにIRに表示されません。上記の同じコードを使用して関数を再作成すると、機能します。私は関数内に物事を挿入し始めた直後にBasicBlockを挿入しているのだろうかと思います。
今それはそれは私のIR
define internal void @main() {
entry:
...
}
define internal %struct.f @f(i32* %x) {
entry:
...
}
ある方法です私は@main関数の前にdeclare %struct.f @f(i32*)
を置くことは、この問題を解決するだろうと信じているが、私はそれを行う方法を見つけ出すことはできません...
概要:私はちょうどファイルの先頭にdeclare
で何かを作成したいので、私はそれが後でdefine
を使用し、機能