私の場合、モジュール内のグローバル変数への参照を作成し、参照の後にグローバル変数を定義する必要があります。
グローバル変数を使用する命令を作成するとき、変数の型がわかりません。実際にはシンボルのアドレスだけが必要な場合でも、タイプを指定して llvm::GlobalVariable オブジェクトを作成する必要があります。
これにより、後でグローバル変数を定義するときに問題が発生しました。タイプはわかっていますが、残念ながら、以前に作成した GlobalVariable オブジェクトを置き換えることができません。
擬似コードは次のとおりです。
llvm::Value *val = new llvm::GlobalVariable(module, llvm::Type::getInt32Ty(), false
, llvm::GlobalValue::ExternalLinkage, 0, "myvar");
//.... create instructions
builder.CreatePtrToInt(val, llvm::Type::getInt32Ty());
//Here I need to define and intialize the global variable.
//Now I know the exact type of the variable. It's different as int32
//for example it's int16.
llvm::Value *real_val = new llvm::GlobalVariable(module, llvm::Type::getInt16Ty()
, false,llvm::GlobalValue::ExternalLinkage, 0, "myvar");
明らかに、同じ名前で別の変数を作成することはできません。しかし、最初の GlobalVariable オブジェクトを実際の型に変換し、初期化子を与えるにはどうすればよいでしょうか?
GlobalVariable オブジェクトを作成せずにシンボル アドレスを取得する他の方法はありますか?