jjzjj

java - 将 ANTLR 解析规则映射到用于代码生成的自定义 Java AST 类

我似乎在AST->StringTemplate方面苦苦挣扎,可能是因为我来自手工编写解析器->LLVM。我正在寻找的是一种自动将解析规则与可以表示它的AST类匹配并包含生成目标语言输出的方法的方法。(在这种情况下可能使用StringTemplate。)在伪代码中,给出这个示例语法:numberExpression:DIGIT+;我想把它映射到这个AST类:classNumberExpressionASTextendsBaseAST{privatedoublevalue;publicNumberExpressionAST(node){this.value=node.value;}publ

c++ - Clang 与 LLVMC——有什么区别?

llvmc.exe和clang.exe有什么区别?我使用哪一个来编译C或C++代码? 最佳答案 llvmc是LLVM工具链中各种程序的前端,特别是llvm-*的,即默认情况下它将尝试使用llvm-gcc和llvm-g++编译C和C++文件。如果你想使用-clang,你可以将-clang传递给llvmc,并且可能可以配置llvmc所以clang将默认使用,但我不知道该怎么做。我建议直接使用clang和clang++,它们可以作为gcc和的替代品>g++. 关于c++-Clang与LLVMC

c++ - 仅当类重写方法时,XCode 4.3/4.4 类型信息才会在动态加载的共享库中实例化的类丢失

我在运行时加载的共享库中实例化的对象上使用dynamic_cast时遇到了一个问题,但前提是该类包含一个覆盖另一个方法的方法。我正在使用带有“AppleLLVM3.1编译器”的Xcode4.3我已经在Linux上使用gcc和clang编译了相同的代码并且没有问题所以我假设它是Xcode中的编译器错误但是有有人以前见过这个吗?假设类定义在名为“test3.h”的header中#pragmaonceclassc1{public:virtual~c1();virtualvoidfoo();};classc2:publicc1{public:voidfoo()override;};classc

python - llvm 可以从托管语言执行代码吗?

我正在制作一个应用程序,我想使用ExecutionEngine加载和执行llvm位码。到目前为止,我已经设法使用通过clang编译的非常简单的C代码来做到这一点。我的想法是,如果我在这个项目中使用llvm,那么它可能比语言更不可知,特别是选择lua/python/javascript。但我对这如何适用于托管或脚本语言感到困惑,因为它们通常与具有GC等资源的平台相关联。所以我不确定它实际上是如何通过ExecutionEngine工作的。作为示例场景,假设用户想要编写一些在我的应用程序中运行的python代码。然后我希望他们向我提供代表该python代码的位码,然后我将使用llvm的Exe

c++ - 如何从 Clang 中的 CallExpr 获取函数指针的参数?

我正在尝试分析其中包含函数调用的C源代码。我能够使用下面的源代码分析正常的函数调用以毫无问题地获取它们的参数,其中ce是一个CallExpr对象:1.if(ce!=NULL){2.QualTypeq=ce->getType();3.constType*t=q.getTypePtrOrNull();4.5.if(t!=NULL){6.llvm::errs()isFunctionPointerType()isPointerType()getCalleeDecl();13.while(D->getPreviousDecl()!=NULL)14.D=D->getPreviousDecl();1

c++ - 如何使用编译数据库为文件生成 LLVM 位码?

我想为大量我有compilationdatabase的C源文件生成LLVM位码.有没有办法调用clang以便它读取编译数据库并使用适当的标志?背景对于玩具程序,生成LLVMbitcode的命令很简单:clang-emit-llvm-cfoo.c-ofoo.bc但是,大型项目中的源文件需要许多额外的编译标志,包括-I和-D等等。我想编写一个脚本来遍历大量源文件并在每个源文件上调用clang-emit-llvm...以生成LLVM位码。困难在于每个clang-emit-llvm...命令都必须具有特定于该源文件的标志。我有一个用于这些源文件的编译数据库,它完美地捕获了每个单独的源文件所需的

c++ - 为什么 clang 输出对齐特定的东西

假设我有一个基本的c程序,我用clang编译它,如下所示:#include"stdio.h"intx=0x7FFFFFFF;intmain(void){printf("%d\n",x);}使用clang-emit-llvmtemp.c-fno-rtti-O3-S编译生成以下位码:;ModuleID='temp.c'targetdatalayout="e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128"targettriple="i686-pc-linux-gnu"@x=globali322147483647,align4@.str=privateu

c++ - 如何根据 LLVM 中 LoadInst 的结果解析 AllocaInst?

从概念上讲,我想做的事情非常简单。我正在使用AllocatechniquedescribedintheKaleidoscopeexample与mem2reg配对以减少手动创建Phi节点的需要。我已经实现了我的自定义语言的几个方面,但是我遇到了以通用方式实现后递增/递减的问题。我的AST节点PostIncrDecrNode包含一个标记来表示++或--和一个表达式AST节点,该节点被代码生成以返回一个llvm::Value*很像Kaleidoscope的例子。我已经注意到我可能需要返回llvm::Value*以外的东西,因为我的语言是非常类型安全的,我需要知道诸如整数类型的符号性之类的东西

c++ - 为什么 clang/llvm 不对此进行优化?

使用clang3.9编译此代码时:constexprboolis_small(longlongv){returnv它生成的程序集等同于intf(inta){returna;},因为它确定is_small(a)将始终为真,因为a是一个int,这(在我的平台)总是小于0x4000000000000000。当我将is_small更改为:constexprboolis_small(longlongv){returnv>=-0x4000000000000000;}正如预期的那样,发生了完全相同的情况。但是,当我更改is_small以检查这两个条件时:constexprboolis_small(l

c++ - LLVM 在运行时获取声明函数的参数值

我正在编写一个LLVMpass,它需要获取传递给声明函数的值并将其打印出来。请注意声明的函数在LLVMIR中被调用。我已经编写了一个模块传递来迭代程序中的所有指令。获取指令中被调用函数参数的片段如下:for(auto&B:F){for(auto&I:B){if(auto*InvokeI=dyn_cast(&I)){if(InvokeI->getCalledFunction()->getName().str()=="function_name"){errs()getOperand(0))getOperand(1))getOperand(2))但是,如果被调用函数的LLVMIR看起来像这样