3

私の場合、モジュール内のグローバル変数への参照を作成し、参照の後にグローバル変数を定義する必要があります。

グローバル変数を使用する命令を作成するとき、変数の型がわかりません。実際にはシンボルのアドレスだけが必要な場合でも、タイプを指定して 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 オブジェクトを作成せずにシンボル アドレスを取得する他の方法はありますか?

4

0 に答える 0