我想記錄一些動態行爲到一些全局變量。所以我寫了一個通行證來測試代碼並插入一些指令來更新全局變量。我試圖使用GlobalVariable構造函數來定義一個全局變量,但有兩個問題。首先,我如何在包含main函數的模塊中定義全局變量?其次,我怎樣才能在其他模塊中聲明這些全局變量?這就像「extern double someThing」一樣。如何在LLVM中聲明全局變量?
的目標程序是用C寫
我想記錄一些動態行爲到一些全局變量。所以我寫了一個通行證來測試代碼並插入一些指令來更新全局變量。我試圖使用GlobalVariable構造函數來定義一個全局變量,但有兩個問題。首先,我如何在包含main函數的模塊中定義全局變量?其次,我怎樣才能在其他模塊中聲明這些全局變量?這就像「extern double someThing」一樣。如何在LLVM中聲明全局變量?
的目標程序是用C寫
有一個工具,它可以回答這個問題和有關LLVM API其他許多問題:llc -march=cpp
。您可以使用Clang或llvm-gcc生成位碼文件,然後構建一個C++代碼,該代碼應使用cpp
後端重建相同的模塊。
輸出示例,展示如何定義一個全局變量int *
:
// Global Variable Declarations
GlobalVariable* gvar_ptr_abc = new GlobalVariable(/*Module=*/*mod,
/*Type=*/PointerTy_0,
/*isConstant=*/false,
/*Linkage=*/GlobalValue::CommonLinkage,
/*Initializer=*/0, // has initializer, specified below
/*Name=*/"abc");
gvar_ptr_abc->setAlignment(4);
// Constant Definitions
ConstantPointerNull* const_ptr_2 = ConstantPointerNull::get(PointerTy_0);
// Global Variable Definitions
gvar_ptr_abc->setInitializer(const_ptr_2);
看起來像C++,而不是C('ConstantPointerNull :: get()'調用)。 –
@Keith Thompson,無論如何你都不能寫C語言的LLVM傳球,那麼問題是什麼? –
OP表示目標程序是用C編寫的(我對LLVM不熟悉,所以我不會進一步評論。) –
什麼語言是您使用? ([LLVM](http://llvm.org/)不是一種語言,它是「模塊化和可重用的編譯器和工具鏈技術的集合」)。 –
這聽起來像是他們使用LLVM API直接構建程序,而不是通過編譯語言。 –
是的,我只是想插入幾條指令。 – dalibocai