我一直玩clang一段时间,我偶然发现了"test/SemaTemplate/dependent-template-recover.cpp"(在clang发行版中),它应该提供从模板错误中恢复的提示.
整个过程可以很容易地删除到最小的例子:
template<typename T, typename U, int N> struct X {
void f(T* t)
{
// expected-error{{use 'template' keyword to treat 'f0' as a dependent template name}}
t->f0<U>();
}
};
Run Code Online (Sandbox Code Playgroud)
clang产生的错误消息:
tpl.cpp:6:13: error: use 'template' keyword to treat 'f0' as a dependent template name
t->f0<U>();
^
template
1 error generated.
Run Code Online (Sandbox Code Playgroud)
...但我很难理解究竟应该插入template关键字以使代码在语法上正确?
LLVM有phi指令,有很奇怪的解释:
'phi'指令用于在表示函数的SSA图中实现φ节点.
通常,它用于实现分支.如果我理解正确,则需要进行依赖性分析,在某些情况下,它可以帮助避免不必要的加载.然而,它仍然很难理解它究竟做了什么.
万花筒的例子很好地解释了它的if情况.然而,如何实现像&&和的逻辑运算并不清楚||.如果我在线llvm编译器输入以下内容:
void main1(bool r, bool y) {
bool l = y || r;
}
Run Code Online (Sandbox Code Playgroud)
最后几行完全让我困惑:
; <label>:10 ; preds = %7, %0
%11 = phi i1 [ true, %0 ], [ %9, %7 ]
%12 = zext i1 %11 to i8
Run Code Online (Sandbox Code Playgroud)
看起来phi节点产生可以使用的结果.而且我的印象是,phi节点只是定义了哪些路径值.
有人可以解释什么是Phi节点,以及如何实现||它?
我想查看指针指向的元素数组.在GDB中,这可以通过使用运算符'@'将指向的内存视为给定长度的人工数组来完成
*pointer @ length
Run Code Online (Sandbox Code Playgroud)
length我想要查看的元素数量在哪里.
上述语法在随Xcode 4.1提供的LLDB中不起作用.
有什么方法可以在LLDB中完成上述工作吗?
纵观LLVM文件,他们提到,他们使用"RTTI的自定义窗体",这是他们的原因isa<>,cast<>和dyn_cast<>模板功能.
通常,阅读一个库重新实现一种语言的一些基本功能是一种可怕的代码味道,只是邀请运行.但是,这是我们所说的LLVM:这些人正在研究C++编译器和 C++运行时.如果他们不知道他们在做什么,我会非常沮丧,因为我更喜欢Mac OS附带clang的gcc版本.
尽管如此,由于缺乏经验,我还是想知道正常RTTI的缺陷是什么.我知道它只适用于有v-table的类型,但只提出两个问题:
virtual?虚拟析构函数似乎很擅长这一点.我不明白LLVM和java(字节码)之间的区别,它们是什么?
-edit-由'他们是什么'我的意思是LLVM和java(字节码)之间的差异,而不是LLVM和java.
我知道我可以print someFloatVariable在设置断点时键入po [self someIvarHoldingAnObject],但是我不能做有用的事情,比如:
[self setAlpha:1];
Run Code Online (Sandbox Code Playgroud)
然后吐出来:
错误:'[self'不是有效的命令.
奇怪的是我可以打电话po [self someIvarHoldingAnObject],它将打印出它的描述.
我相信我在一年前看过一个视频,其中有人演示了如何在运行时通过控制台执行代码,如果我没有弄错,这个人也提供了参数并为指针分配了对象.怎么做?
我认为这个问题很清楚.我正在尝试编写一个编译器检测头,以便能够在应用程序中包含有关使用哪个编译器和哪个版本的信息.
这是我正在使用的代码的一部分:
/* GNU C Compiler Detection */
#elif defined __GNUC__
#ifdef __MINGW32__
#define COMPILER "MinGW GCC %d.%d.%d"
#else
#define COMPILER "GCC %d.%d.%d"
#endif
#define COMP_VERSION __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__
#endif
Run Code Online (Sandbox Code Playgroud)
哪个可以这样使用:
printf(" Compiled using " COMPILER "\n", COMP_VERSION);
Run Code Online (Sandbox Code Playgroud)
有没有办法检测LLVM及其版本?和CLANG?
我的应用程序需要在同一个(单线程)进程中运行许多单独的上下文.他们都共享一个LLVMContext.
该过程将运行许多上下文(在线程意义上); 也就是说,每个基于boost::context(仍在库,预先批准的库)的延续对象中运行一个函数,这意味着每个上下文都可以产生,但它们基本上在相同的单线程进程中运行.每个应该基本上独立于另一个运行,更重要的是,每个中的编译错误不应该影响其他的执行.
这些上下文中的每一个都将动态调用跨多个转换单元(TU)的代码.一些翻译单元可以在许多这些上下文中共享.新的或修改的翻译单元中的编译错误不应影响其他上下文.
澄清编辑: 例如,TU A可能在两个上下文之间共享,上下文X和Y.仅仅为了拥有完整的图片,假设X也将运行来自其他翻译单元的代码,即B和D,同时Y也会有C.在某些时候,X决定对A进行修改,因此它创建一个新的TU A.1,它是A的副本,并在那里应用修改,因此这些不会影响上下文Y.希望这个例子清楚说明要求.
我最初的冲动是llvm::Module为每个上下文关联一个,但由于它在LLVM中未定义,在处于中间编译状态的模块中会发生什么,我决定llvm::Module为每个翻译单元添加一个(因为这个原因,请参阅此问题),以及副本我之前解释过的写入策略,当翻译单元的修改本地发生在上下文时,以避免修改影响其他上下文.
我遇到的主要双重问题是:
如何将上下文中的不同模块链接在一起,以便将它们作为统一库调用?我正在使用C++ api.我特别警惕这个影响这个功能的讨厌的旧bug.如果我将所有模块的所有权转移到JIT,这个bug会不会影响我ExecutionEngine::addModule()?
一旦翻译单元上的修改强制更新其中一个模块,需要执行哪些步骤?我是否需要删除/删除旧模块对象并创建一个新模块?有没有我读过的回收政策?
我对此的第二个问题是:
ExecutionEngine我需要?整个申请一个?每个上下文一个?每个模块一个?希望问题的范围不要过于庞大.
许多动态语言实现(或想要实现)JIT编译器以加快其执行时间.不可避免地,来自花生画廊的人问他们为什么不使用LLVM.答案通常是,"LLVM不适合构建JIT." (例如,Armin Rigo的评论.)
为什么LLVM不适合构建JIT?
注意:我知道LLVM有自己的JIT.如果LLVM曾经不适合,但现在适合,请说明改变了什么.我不是在讨论在LLVM JIT上运行LLVM字节码,我在谈论使用LLVM库来实现动态语言的JIT.
我LLVM Profile Error: Failed to write file "default.profraw": Permission denied在Xcode中运行单元测试后出现错误.我不知道Xcode试图将此文件写入的位置.
我应该为哪个文件夹授予权限?