我对llvm还不熟悉,我正在编写一个小型的llvm IR Builder。我使用IRBuilder和所有这些Create*函数来生成IR。我要做的是创建一个load指令,它创建一个新的局部变量,其值为以前分配的llvm:: value 。
我所期望的是:
%2 = load i32* %1
使用%2加载指令的结果和%1以前分配的值(CreateAlloca)
以下是我尝试过的:
// Get Ptr from Val
Value* ptr = ConstantExpr::getIntToPtr((Constant*)loc[n],PointerType::getUnqual(builder-&
我正在尝试用一个常量替换一个地址的所有实例。
我正在使用以下命令获取并测试store的地址(i是一条指令)
//already know it's a store instruction at this point
llvm::Value *addy = i->getOperand(0);
if(llvm::ConstantInt* c = dyn_cast<llvm:::ConstantInt>(addy)){
//replace all uses of the address with the constant
//operand(1) will be
在我的计算机上,long取9223372036854775807的最大值。但是,当我用更大的值处理unsigned long时,编译器会抛出一个警告,当我已经将其定义为unsigned long时,需要将其解释为unsigned long。为什么是这种情况?
//assigning maximum value of a long integer. (No error)
long max_l = 9223372036854775807L;
//assigning an unsigned long integer.
unsigned long max_ul = 92233720368547758
我对从LLVM数组中创建、存储和获取值的步骤感到有点困惑,到目前为止,我使用以下命令创建它:
auto type = llvm::ArrayType::get(<TYPE>, <SOME_UINT>);
auto array = builder.CreateAlloca(type);
有了这个,我尝试让llvm::InBoundGEP到每个元素,并存储它们的llvm::Value,但这不起作用……
有没有指导你这么做的指南?
我正在写一个条件,看看const llvm::Value*是否为常量。代码如下:
if(const Constant* c = dynamic_cast<Constant>(val)){
......
}
"val“在这里是一个常量llvm::Value*,然而,编译器说
error: 'llvm::Constant' is not a reference or pointer
if(const Constant* c = dynamic_cast<Constant>(val)){
^
我正在尝试使用LLVM build store指令构建器为以下代码构建一个空指针:
int *x;
x = 0;
我面临的问题是,当将0赋值给x时,我得到了一个不兼容的类型错误,因为0是i32类型,而x是i32**类型。我使用LLVMPointerType为零创建一个指针类型,并在BuildStore构建器中使用它,但是LLVMPointerType返回一个LLVMTypeRef,而BuildStore需要LLVMValueRef类型的参数。我被卡住了,不能输入cast,真的需要一些帮助。
还有在LLVM中创建空指针的其他方法吗?
我在这里看到过一篇关于“使用指令不是指令”的文章,我遇到了一个类似的问题,但是没有一个很好的理由。
我使用moe ()编写LLVM来构建编译器,我的问题基本上可以归结为3行:
let pointer = L.build_alloca float_t ("reg") builder in L.dump_value(pointer);
let test = L.build_store (L.const_float float_t 32.3) pointer builder in L.dump_value(test);
let loaded = L.bu
什么是波尔保证返回作为?我是否可以依赖bool类型总是被解释为0或1?如果bool的数值解释在C99中是不可靠的,那么在那里有标准吗?在LLVM、GCC或VisualC++中,当我依赖bool进行算术运算时,有什么值得我注意的地方吗?
举个例子,如果我这么做了呢:
// An example of calculating a possible stride in bytes.
// hasData(), is8bit(), and is16bit() return as bool type
unsigned int stride = object->hasData() * object
我想从两个基本的c++函数生成LLVM IR代码,如下所示。
int newFun2(int x){
int z = x + x;
return z;
}
int newFun(int *y){
int first = y[3]; //How to define it using the LLVM API?
int num = newFun2(first);
return num;
}
我的问题是使用LLVM获取数组参数的索引。有什么想法吗?非常感谢
编织品
--这是我使用API:的代码
llvm::LLVMContext &context =
我知道如何使用LLVM API (特别是SwitchInst)编译这段代码:
switch (h)
{
case 11:
.......
case 22:
........
}
但我不知道,有没有可能用SwitchInst编译这样的代码:
Select Case x
Case 11 To 40
...........
Case 41 To 70
...........
End Select
如何设置范围内的案例标签?
switchOperator->addCase(...What I need to put here
我有一个名为indexValue的值*类型,类型是i32。我认为indexValue必须持有一个类型为int的数字。现在我想使用indexValue指出的确切数字,所以我喜欢这样:
ConstantInt* CI = llvm::cast<llvm::ConstantInt>(indexValue); //This is wrong, so is dyn_cast.
uint64_t index = indexValue->getZExtValue();
uint64_t size = index + 1;
我不知道这是不是正确的方法。那么,有人能告诉我们从值中获取整数内