C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 如何从LLVM中的LoadInst结果的值中解析AllocaInst?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
从概念上讲,我想做的事情非常简单.我使用 Alloca technique described in the Kaleidoscope examplemem2reg配对,以减少手动创建Phi节点的需要.

我已经实现了我的自定义语言的几个方面,但是我遇到了以通用方式实现后递增/递减的问题.

我的AST节点PosTincrDecrNode包含一个用于表示的标记或 – 以及一个表达式AST节点,该节点被编码为返回llvm :: Value *,就像KalEIDoscope示例一样.我已经注意到我可能需要返回一些其他的llvm :: Value *,因为我的语言非常安全,我需要知道诸如整数类型的符号之类的东西,但现在我觉得我可能还需要跟踪llvm :: AllocaInst.

一个简单的示例情况是这样的代码

@H_301_17@int MyFunction(int i) { return i++; }

我的调试AST打印如下所示:

@H_301_17@- CompilationUnit:test.str - FunctionDeclarationNode - IdentifierNode:int - IdentifierNode:MyFunction - FunctionParameterNode - IdentifierNode:int - IdentifierNode:i - BlockNode - ReturnNode - PosTincrDecrNode - IdentifierNode:i

最后两行是这里的相关部分,因为我有一个PosTincrDecrNode,它包含一个将被编码为如下代码的IdentifierNode:

@H_301_17@Value* IdentifierNode::codeGenInternal(CodeGenContext& context) { Value* rtn = NULL; SharedSymbolEntry entry = context.getSymbolInScopeByName(*value); Value* val = entry ? entry->llvmVal : NULL; if(val) { IRBuilder<>* builder = context.getIRBuilder(); rtn = builder->CreateLoad(val,value->c_str()); } else { context.handleCodeGenError(*this,"UnkNown variable name: " + Twine(value->c_str())); } return rtn; }

SharedSymbolEntry entry = context.getSymbolInScopeByName(* value);使用存储的shared_ptr到标识符节点的std :: String“value”成员(也就是变量名称)来查找我的SharedSymbolEntry(只是一个包装器类型来存储语言特定信息以及llvm :: Value *,它是llvm: :AllocaInst *)在上下文堆栈中,由函数参数或变量AST节点填充入口块allocas.

问题是PosTincrDecrNode无法访问alloca,只能从load rtn = builder-> CreateLoad(val,value-> c_str());返回llvm :: Value *.

在LLVM中有什么方法可以从llvm :: Value *中解析llvm :: AllocaInst *,以便在存储指令中使用它(存储指令需要一个指针,在这种情况下我只有整数值)?

我遇到了一些类似的问题,但我不确定他们是否回答了我的问题.
最后一个似乎暗示这可能根本不可能,所以我很好奇别人如何解决这个问题.

> llvm-dependencies-alloca-load
> llvm-pass-how-to-insert-a-variable-using-existing-variable-value
> get-pointer-to-llvmvalue-previously-allocated-for-createload-function

解决方法

当你返回一个llvm :: Value *(在你的情况下它是一个LoadInst *)你可以使用LLVM RTTI系统将llvm:Value *强制转换为llvm :: LoadInst *,如下所示:

@H_301_17@Value* val = someFunction(...); if (llvm::LoadInst* I = dyn_cast<llvm::LoadInst>(val) { // do something with the load instruction I } else // not a load instruction

有了llvm :: LoadInst *,你可以使用getPointerOperand()轻松访问加载发生的地址.现在您可以尝试将指针操作数转换回AllocaInst *,如上例所示.如果它成功了你有你的AllocaInst,当它失败时它就是其他的东西(例如GetElementPtrInst).

大佬总结

以上是大佬教程为你收集整理的c – 如何从LLVM中的LoadInst结果的值中解析AllocaInst?全部内容,希望文章能够帮你解决c – 如何从LLVM中的LoadInst结果的值中解析AllocaInst?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。