在LLVM IR中一切都是指针吗?
Is everything a pointer in LLVM IR?
我遍历了程序的全局变量,对它们的类型很感兴趣。
用于测试,如:
#include <stdio.h>
int i=0;
int main(){
printf("lala %d n",i);
return 0;
}
我得到的输出是:
Globals:
i Type: 14 //14 ==> POINTER TYPE ID !
StackLock: Stack1
Function Argument: i32* @i
我代码:for (Module::global_iterator I = M.global_begin(), E = M.global_end(); I != E; ++I) {
std::cout << I->getName().str() << " Type: "<< I->getType()->getTypeID() << std::endl;
if (I->getType()->isPointerTy() ) {
std::string o1;
{
raw_string_ostream os1(o1);
I->printAsOperand(os1, true);
}
char* stackLoc = new char[50];
sprintf(stackLoc, "Stack%d", StackCounter++);
errs() << "StackLock: " << stackLoc << "n";
errs() << "Function Argument: " << o1 << "n";
}
}
把所有东西都设置为指针是什么意思?有没有办法坐"真"型的?例如,在我的例子中:获得i变量的整数类型。
根据LLVM IR Reference,全局变量定义了在编译时而不是运行时分配的内存区域,并且必须对它们进行初始化。
作为SSA值,全局变量定义的指针值在作用域(即它们主导)程序中的所有基本块。全球变量总是定义指向其"内容"类型的指针,因为它们描述一个内存区域,LLVM中的所有内存对象都是通过指针访问。
要获得全局变量的实际类型,由于全局变量的LLVM IR内部类型是指针,因此可以使用Type::getContainedType(int)
或Type::getPointerElementType()
来获取指针的指针类型,因为指针类型是派生类型。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- LLvm Jit:如何从抖动代码中取消引用运行时指针?
- llvm 如何知道成员函数指针是否指向虚函数?
- LLVM - 从具有偏移量的指针加载变量
- 将无效指针传递给LLVM Irbuilder createCall
- Llvm C++ API 将指向函数的指针传递给另一个函数
- Clang LLVM为JIT编译功能提供了不良功能指针
- 检查 LLVM 中的指针到指针类型
- LLVM-IR 数组指针分配
- 有什么方法可以获取llvm顺从指针值的原始类型(即指针类型)
- C++11将传统指针转换为智能指针.使用来自llvm的最新SVN-Clang和libc++
- LLVM中的非指针全局变量
- LLVM:创建一个带有空指针操作数的CallInst
- 如何检查LLVM StoreInst的目标是否是函数指针
- 在LLVM中创建字面指针值
- 与 LLVM JIT 代码共享C++指针
- 在LLVM IR中一切都是指针吗?