2011-10-16 70 views
8

我想記錄一些動態行爲到一些全局變量。所以我寫了一個通行證來測試代碼並插入一些指令來更新全局變量。我試圖使用GlobalVariable構造函數來定義一個全局變量,但有兩個問題。首先,我如何在包含main函數的模塊中定義全局變量?其次,我怎樣才能在其他模塊中聲明這些全局變量?這就像「extern double someThing」一樣。如何在LLVM中聲明全局變量?

的目標程序是用C寫

+0

什麼語言是您使用? ([LLVM](http://llvm.org/)不是一種語言,它是「模塊化和可重用的編譯器和工具鏈技術的集合」)。 –

+2

這聽起來像是他們使用LLVM API直接構建程序,而不是通過編譯語言。 –

+1

是的,我只是想插入幾條指令。 – dalibocai

回答

21

有一個工具,它可以回答這個問題和有關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); 
+0

看起來像C++,而不是C('ConstantPointerNull :: get()'調用)。 –

+6

@Keith Thompson,無論如何你都不能寫C語言的LLVM傳球,那麼問題是什麼? –

+1

OP表示目標程序是用C編寫的(我對LLVM不熟悉,所以我不會進一步評論。) –