Questions tagged «llvm»

LLVM项目是模块化和可重用的编译器及工具链技术的集合。llvm标记主要用于编写C ++代码(或通过C绑定的另一种语言)以与LLVM库进行接口,而不是任何(越来越多的)具有LLVM的工具。有关LLVM生成的机器代码的问题,请参见`llvm-codegen`标签。

5
C ++标准是否允许未初始化的bool使程序崩溃?
我知道C ++ 中的“未定义行为”几乎可以允许编译器执行其想要的任何操作。但是,由于我认为代码足够安全,因此发生了一次崩溃,这让我感到惊讶。 在这种情况下,真正的问题仅在使用特定编译器的特定平台上发生,并且仅在启用优化后才发生。 为了重现此问题并将其简化到最大程度,我尝试了几件事。下面是一个函数的提取物被称为Serialize,这将需要一个布尔参数,并复制字符串true或false到现有的目标缓冲区。 此功能是否在代码审查中,如果bool参数是未初始化的值,实际上没有办法告诉它崩溃吗? // Zero-filled global buffer of 16 characters char destBuffer[16]; void Serialize(bool boolValue) { // Determine which string to print based on boolValue const char* whichString = boolValue ? "true" : "false"; // Compute the length of the string we selected const size_t len = …

6
LLVM到底是什么?
我一直都在听有关LLVM的信息。在Perl中,然后在Haskell中,然后有人以其他某种语言使用它?它是什么?
464 llvm 

9
使用CMake在GCC和Clang / LLVM之间切换
我有许多使用CMake构建的项目,我希望能够在使用GCC或Clang / LLVM进行编译之间轻松切换。我相信(如果我弄错了,请纠正我!)要使用Clang,我需要设置以下内容: SET (CMAKE_C_COMPILER "/usr/bin/clang") SET (CMAKE_C_FLAGS "-Wall -std=c99") SET (CMAKE_C_FLAGS_DEBUG "-g") SET (CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG") SET (CMAKE_C_FLAGS_RELEASE "-O4 -DNDEBUG") SET (CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g") SET (CMAKE_CXX_COMPILER "/usr/bin/clang++") SET (CMAKE_CXX_FLAGS "-Wall") SET (CMAKE_CXX_FLAGS_DEBUG "-g") SET (CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG") SET (CMAKE_CXX_FLAGS_RELEASE "-O4 -DNDEBUG") SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g") SET (CMAKE_AR "/usr/bin/llvm-ar") SET …
269 cmake  llvm  clang 

1
如何影响Android / ARM目标的Delphi XEx代码生成?
更新2017-05-17。我不再为产生此问题的公司工作,也无法访问Delphi XEx。在我在那里的时候,通过迁移到混合FPC + GCC(Pascal + C)来解决问题,对于某些例程,NEON内在函数有所作为。(强烈建议使用FPC + GCC,因为它可以使用标准工具,尤其是Valgrind。)如果有人可以通过可靠的示例演示他们实际上如何从Delphi XEx生成优化的ARM代码,我很乐意接受答案。 Embarcadero的Delphi编译器使用LLVM后端为Android设备生成本机ARM代码。我有大量Pascal代码,需要将这些代码编译到Android应用程序中,并且我想知道如何使Delphi生成更有效的代码。现在,我什至没有在谈论诸如自动SIMD优化之类的高级功能,而只是在生成合理的代码。当然必须有一种方法可以将参数传递给LLVM端,否则会影响结果?通常,任何编译器都会有很多选择来影响代码的编译和优化,但是Delphi的ARM目标似乎仅仅是“优化开/关”,仅此而已。 LLVM应该能够生成合理的紧致和明智的代码,但是Delphi似乎在以奇怪的方式使用其功能。Delphi希望非常大量地使用堆栈,并且通常只将处理器的寄存器r0-r3用作临时变量。也许最疯狂的是,它似乎正在将正常的32位整数作为四个1字节的加载操作进行加载。如何使Delphi产生更好的ARM代码,而又没有它为Android带来的逐字节麻烦呢? 起初,我认为逐字节加载是为了交换big-endian的字节顺序,但事实并非如此,它实际上只是加载具有4个单字节加载的32位数字。*可能是加载完整的32位,而不会产生未对齐的字大小的存储器负载。(是否应该避免那是另一回事,这暗示整个事情都是编译器错误)* 让我们看一下这个简单的函数: function ReadInteger(APInteger : PInteger) : Integer; begin Result := APInteger^; end; 即使启用了优化,带有更新包1的Delphi XE7以及XE6也会为该功能生成以下ARM汇编代码: Disassembly of section .text._ZN16Uarmcodetestform11ReadIntegerEPi: 00000000 <_ZN16Uarmcodetestform11ReadIntegerEPi>: 0: b580 push {r7, lr} 2: 466f mov r7, sp 4: b083 sub sp, #12 6: 9002 str …

5
如何使clang编译为llvm IR
我希望clang将我的C/C++代码编译为LLVM字节码,而不是二进制可执行文件。我该如何实现?如果我得到了LLVM字节码,该如何将其进一步编译为二进制可执行文件。 基本上,我想LLVM在编译为二进制可执行文件之前将自己的代码添加到字节码中。
150 c  llvm  clang 

3
LLVM与OS X上的clang
我对OS X上的llvm,clang和gcc有疑问。 llvm-gcc 4.2,llvm 2.0和clang有什么区别?我知道它们都基于llvm构建,但是它们有何不同? 除了更快的编译速度之外,llvm与gcc相比还有什么优势?
133 c++  c  gcc  llvm  clang 

4
哪些语言可以编译为WebAssembly(Wasm)?
哪些语言可以编译为WebAssembly(Wasm)? 我相信,现在可以使用llvm编译器后端将C,C ++和Rust(实验性)编译为WebAssembly,并且目前不支持Java,Swift和C#等语言,但可以作为将来开发的候选语言。 我不认为JavaScript可以编译为Wasm。 https://github.com/WebAssembly/design/issues/219

2
使用clang更快地完成代码
我正在研究使用clang的代码完成机制时潜在的代码完成加速。下面描述的流程是我在Anders Bakken的rtags中找到的。 守护程序监视文件分析转换单元的更改。这是通过调用clang_parseTranslationUnit和相关函数(reparse*,dispose*)完成的。当用户请求源文件中给定行和列的完成时,守护程序会将源文件的最后保存版本和当前源文件的缓存翻译单元传递给clang_codeCompleteAt。(Clang CodeComplete docs)。 传递给clang_parseTranslationUnit(从CompletionThread :: process,第271行的)标志是CXTranslationUnit_PrecompiledPreamble|CXTranslationUnit_CacheCompletionResults|CXTranslationUnit_SkipFunctionBodes。传递给clang_codeCompleteAt(从CompletionThread :: process,行305)的标志是CXCodeComplete_IncludeMacros|CXCodeComplete_IncludeCodePatterns。 调用clang_codeCompleteAt非常慢-即使完成位置是合法的成员访问代码(的文档中提到的预期用例的子集),也要花费3-5秒才能获得完成clang_codeCompleteAt。根据IDE代码完成标准,这似乎太慢了。有加速的方法吗?

8
clang:如何列出支持的目标架构?
目前,我对ARM感兴趣,尤其是对iphone / android目标感兴趣。但我只想了解更多有关c的知识,因为它在未来几年中将发挥重要作用。 我试过了 clang -cc1 --help|grep -i list clang -cc1 --help|grep arch|grep -v search clang -cc1 --help|grep target -triple <value> Specify target triple (e.g. i686-apple-darwin9) 我知道clang具有-triplet参数,但是如何列出所有可能的值?我发现clang与gcc在交叉编译方面有很大不同,在GCC世界中,您应该为所有内容使用单独的二进制文件,例如PLATFORM_make或PLATFORM_ld(i * 86-pc-cygwin i * 86-*-linux-gnu等。http ://git.savannah.gnu.org/cgit/libtool.git/tree/doc/PLATFORMS) 在clang世界中,它只是一个二进制文件(正如我在某些论坛上所读到的)。但是,如何获得受支持目标的列表?如果我的发行版(linux / windows / macos / whatever)不支持我的目标,我该如何获得支持更多平台的目标呢? 如果我是这样的SVN最新的clang: svn co http://llvm.org/svn/llvm-project/cfe/trunk clang 我将获得大部分平台吗?看起来Clang并不是马上就考虑到交叉编译而构建的,但是由于它是基于llvm的,因此在理论上应该是非常交叉友好的?谢谢!
94 clang  llvm 

13
适用于Windows的LLVM C ++ IDE
是否有一些适用于Windows的C / C ++ IDE ,就像现代Xcode一样,该IDE 与LLVM编译器(和Clang C / C ++分析器)集成在一起。 我有Dev-Cpp(它使用了过时的GCC)和Code :: Blocks(带有一些GCC)。但是GCC给了我非常神秘的错误信息。我想从Clang前端获得一些更加用户友好的错误消息。 是的,Clang不能与复杂的C ++代码一起使用,但是Clang干线已经可以编译LLVM本身。所以我想知道是否有任何LLVM IDE正在开发中或处于beta版本中。 是的,我可以将Clang用作具有GCC兼容IDE的其他编译器。但是,有没有与Clang 集成的 IDE ?Clang具有不同的输出格式,因此IDE必须对其进行解析。Clang可以提供源代码的IDE解析。Clang具有分析选项,IDE必须支持该选项。看一下,例如http://iosdevelopertips.com/xcode/static-code-analysis-clang-and-xcode-3-2.html Clang最想要的功能是智能自动完成功能,因此IDE只能建议语法正确的变体,例如,仅列出此struct,class的字段。 结果:(与答案合并): 带有CDT> = 8并带有https://code.google.com/archive/p/llvm4eclipsecdt/插件的Eclipse(来自Petri Tuononen)(没有自动完成功能) LLVM项目中的带vimrc的Vim(仅智能完成吗?)https://llvm.org/viewvc/llvm-project/llvm/trunk/utils/vim/ 具有(仅智能完成功能的)Emacs https://llvm.org/svn/llvm-project/cfe/trunk/utils/clang-completion-mode.el Qt创建者:https : //blog.qt.io/blog/2011/10/19/qt-creator-and-clang/ CodeLite:http://www.codelite.org/LiteEditor/ClangIntegration35
92 c++  windows  ide  llvm  clang 

4
令人困惑的模板错误
我一直在玩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>(); } }; c发出的错误消息: tpl.cpp:6:13: error: use 'template' keyword to treat 'f0' as a dependent template name t->f0<U>(); …
91 c++  templates  llvm  clang 

2
PHI指令的确切作用以及如何在LLVM中使用它
LLVM有phi指令,带有相当奇怪的解释: “ phi”指令用于在表示功能的SSA图中实现φ节点。 通常,它用于实现分支。如果我理解正确,则需要使依赖关系分析成为可能,并且在某些情况下,可以帮助避免不必要的加载。但是,仍然很难理解它的确切作用。 万花筒的例子很好地解释了这种if情况。但是,还不清楚如何实现类似&&和的逻辑操作||。如果我将以下内容输入到在线llvm编译器中: void main1(bool r, bool y) { bool l = y || r; } 最后几行完全让我感到困惑: ; <label>:10 ; preds = %7, %0 %11 = phi i1 [ true, %0 ], [ %9, %7 ] %12 = zext i1 %11 to i8 看起来phi节点产生了可以使用的结果。我印象深刻的是,phi节点只是定义了来自哪个路径的值。 有人可以解释什么是Phi节点,以及如何实现||它吗?
87 llvm 



2
如何在LLDB调试器中调用方法或执行代码?
我知道print someFloatVariable在设置断点或时可以键入po [self someIvarHoldingAnObject],但是我不能做一些有用的事情,例如: [self setAlpha:1]; 然后它吐出: 错误:“ [self”不是有效命令。 奇怪的是我可以打电话给我po [self someIvarHoldingAnObject],它会打印出它的描述。 我相信我一年前看过一个视频,其中有人演示了如何在运行时通过控制台执行代码,如果我没有记错的话,这个人还提供了参数并为指针分配了对象。怎么做?
70 xcode  llvm  lldb 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.