2016-04-09 23 views
1

私は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を使用し、機能

答えて

1

の指示を挿入を開始することができます[OK]を、LLVMは「自動的に」ということありませんようです。

私は、コードをもう一度実行したときに機能が注文を変更したことに気付きました。そのため、コード(本体)を挿入しなくても関数を作成すると、モジュールのgetOrInsert()メソッドでこの関数を参照する限り、プロトタイプが作成され、本体へのそれ以上の宣言を待ちますクラス。

これが正解か、それとも明確かどうかはわかりませんが、私の問題は解決しました...