标签: llvm-clang

po对象导致错误:找不到'$ __ lldb_objc_class'的接口声明

我在调试控制台中有这个奇怪的功能.

说你有以下代码:

anIssue.issueID=[issueDictionary objectForKey:@"uniqueId"];
Run Code Online (Sandbox Code Playgroud)

issueDictionary函数的po正确:

{Title ="2012年12月"; coverUrl ="htt://toeete.com/CoverURL/77111a51-32d8-4c39-912e-a889bad250e6.png"; downloadUrl ="htt://oetoeto.com/pdfFile/TR 2012年12月Single.pdf"; "end_date"="12/31/2013"​​; images =(); "release_date"="02/26/2013"​​; summary ="2012年12月号"; uniqueId ="2012年12月1日"; 更新="02/11/2013"​​; }

但每当我尝试打印"anIssue.issueID"或"[issueDictionary objectForKey:@"uniqueId"]的对象时,"它失败了:错误:无法找到'$ __ lldb_objc_class'的接口声明

说像:

po [anIssue issueID]

要么

po [issueDictionary objectForKey:@"uniqueId"]

两个都失败了,错误...虽然如果我

po anIssue

它成功!!!!!!!!

:ID = 12月2012_1标题= 2012年12月发布= 2013-02-25 22:00:00 +0000免费=是描述= 2012年12月号

任何的想法

iphone xcode llvm-clang ios lldb

11
推荐指数
1
解决办法
1600
查看次数

如何为 clang 格式的外部标题创建类别?

我想配置 clang-format 以在 C++ 中对包含的标头进行排序,如下所示:

  • 主标头(与当前 cpp 文件关联),
  • 通过“”包含本地标头,
  • 通过 <> 包含的其他标头,
  • 来自特定外部库的头文件(例如 boost、catch2),
  • 系统/标准标头。

我在 macOS 上使用 clang-format 8.0.0。我当前的配置(仅与包含相关的片段)如下:

SortIncludes: true
IncludeBlocks: Regroup
IncludeCategories:
  # Headers in <> without extension.
  - Regex:           '<([A-Za-z0-9\/-_])+>'
    Priority:        4
  # Headers in <> from specific external libraries.
  - Regex:           '<((\bboost\b)|(\bcatch2\b))\/([A-Za-z0-9.\/-_])+>'
    Priority:        3
  # Headers in <> with extension.
  - Regex:           '<([A-Za-z0-9.\/-_])+>'
    Priority:        2
  # Headers in "" with extension.
  - Regex:           '"([A-Za-z0-9.\/-_])+"'
    Priority:        1
Run Code Online (Sandbox Code Playgroud)

在此配置中,我假设系统/标准标头没有扩展名。它不适用于 UNIX/POSIX 标头。主标头会自动检测并分配优先级 0。到目前为止,除了外部库的类别之外,一切似乎都按预期工作。看起来 clang-format 正在将其分配给优先级 2。

预期结果:

#include …
Run Code Online (Sandbox Code Playgroud)

c++ regex clang llvm-clang clang-format

11
推荐指数
2
解决办法
4031
查看次数

如何告诉clang不要将寄存器保存到堆栈中?

目标

我目前正在尝试avr-llvm(支持AVR作为目标的llvm).我的主要目标是使用它希望更好的优化器(与gcc相比)来实现更小的二进制文件.如果你对AVR了解一点,你知道你只有很少的记忆.

我目前使用的是一个ATTiny45,4KB闪存和256字节(只是字节而不是KB!)的SRAM.

问题

我正在尝试编译一个简单的C程序(见下文),以检查生成的汇编代码以及机器代码大小的开发方式.我使用"clang -Oz -S test.c"来生成组件输出并优化它以实现最小尺寸.我的问题是不必要的保存寄存器值,知道这种方法永远不会返回.

我的问题......

我怎么能告诉llvm它可以破坏任何寄存器,如果需要而不保存/恢复它的内容?任何想法如何更优化它(例如更高效的堆栈设置)?

细节/示例

这是我的测试程序.如上所述,它是使用"clang -Oz -S test.c"编译的.

#include <stdint.h>

void __attribute__ ((noreturn)) main()  {
     volatile uint8_t res = 1;
     while (1) {}
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,它只有一个类型为uint8_t的"volatile"变量(如果我没有将它设置为volatile,那么所有内容都会被优化掉).此变量设置为1.最后有一个无限循环.现在让我们看一下程序集输出:

.file   "test.c"
    .text
    .globl  main
    .align  2
    .type   main,@function
main:
    push    r28
    push    r29
    in  r28, 61
    in  r29, 62
    sbiw    r29:r28, 1
    in  r0, 63
    cli
    out 62, r29
    out 63, r0
    out 61, r28
    ldi r24, 1
    std Y+1, r24
.BB0_1:
    rjmp    .BB0_1
.tmp0:
    .size   main, …
Run Code Online (Sandbox Code Playgroud)

optimization avr llvm clang llvm-clang

10
推荐指数
1
解决办法
2673
查看次数

将自动化软件构建到LLVM bitcode

我想使用autotools构建系统将软件编译为LLVM bitcode; 也就是说,我希望最后获得的可执行文件是LLVM bitcode,而不是实际的机器代码.

(目标是能够在整个程序上运行LLVM bitcode分析工具.)

我已经尝试过CC="clang -emit-llvm -use-gold-plugins"configure脚本指定和变种,但无济于事.总会出现问题(例如,包构建.a静态库,链接器拒绝这些库).

在我看来,正确的方法是LLVM bitcode应该是一个交叉编译目标.要设置--host=,但没有这样的标准目标(即使Knuth的MMIX有目标).

到目前为止,我已经使用过kludges,例如手动编译CC="clang -emit-llvm -use-gold-plugins"和运行链接线(使用llvm-ldllvm-link).这适用于简单的包,例如grep.

我想要一个健壮的方法,并且适用于大多数(如果不是全部)配置脚本,包括存在中间.a文件或中间目标时.

autotools llvm llvm-clang

10
推荐指数
1
解决办法
1073
查看次数

在clang命令行上提供LLVM ModulePass

我有一个使用opt工具的ModulePass,但是我无法弄清楚如何在命令行中使用它.我目前使用my pass的工作流程是:

  1. clang -c -emit-llvm [c-source code files]
  2. llvm-link [llvm bitcode文件]
  3. opt -load [PassName] .so - [pass-name] [链接llvm文件]
  4. llc [结果bitcode文件]
  5. gcc [生成的汇编程序文件] -o [target]

我希望将我的pass与clang命令行集成,以便可以作为现有软件(例如c ++标准库)构建的一部分调用它,而不必为我编译的每个东西重新构建整个构建系统.我已经看到了关于如何做到这一点的提示,但我无法将各个部分组合到一个正常工作的设置中.

使用Clang自动运行LLVM Pass会自动描述我想要的内容,但LLVM 3.4中似乎不推荐使用该方法(PassManagerBuilder已移至旧版命名空间).

LLVM - 使用clang自动运行自己的通行证似乎解决了基本问题,但我希望我能做到这一点,而不必修改clang(这似乎是那里的建议).

使用LLVM 3.4从clang获得新传递的最佳方法是什么?

llvm clang llvm-clang llvm-ir llvm-c++-api

10
推荐指数
1
解决办法
1155
查看次数

如何在Xcode 6中获得10.8 SDK和5.1编译器

从标题开始,我需要在Mavericks中使用10.8 SDK和5.1(或5.0)LLVM编译器和Xcode 6.使用之前的Xcode,可以同时拥有两个SDK,但现在我只看到了10.9.如何在Xcode 6中安装以前的SDK和编译器?

xcode llvm-clang osx-mavericks xcode6

10
推荐指数
1
解决办法
6679
查看次数

C++编译器是否对lambda闭包执行编译时优化?

假设我们有以下(无意义)代码:

const int a = 0;
int c = 0;
for(int b = 0; b < 10000000; b++)
{
    if(a) c++;
    c += 7;
}
Run Code Online (Sandbox Code Playgroud)

变量'a'等于零,因此编译器可以在编译时推断出指令'if(a)c ++;' 将永远不会被执行,并将优化它.

我的问题:lambda闭包会发生同样的情况吗?

查看另一段代码:

const int a = 0;
function<int()> lambda = [a]()
{
    int c = 0;
    for(int b = 0; b < 10000000; b++)
    {
        if(a) c++;
        c += 7;
    }
    return c;
}
Run Code Online (Sandbox Code Playgroud)

编译器是否会知道'a'是0并且它会优化lambda吗?

更复杂的例子:

function<int()> generate_lambda(const int a)
{
    return [a]()
    {
        int c = 0;
        for(int b = …
Run Code Online (Sandbox Code Playgroud)

c++ optimization lambda gcc llvm-clang

10
推荐指数
1
解决办法
1025
查看次数

为什么空函数不会作为LLVM IR中的死代码删除?

从这个简单的C程序开始:

void nothing(void) {}
int main() {
  int i;
  for (i = 0; i < 10; ++i) {
    nothing();
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的传递输出如下:
注意:IR语句为绿色.

; Function Attrs: nounwind readnone ssp uwtable
define void @nothing() #0 {
entry:
  ret void
}

; Function Attrs: nounwind readnone ssp uwtable
define i32 @main() #0 {
entry:
  ret i32 0
}
Run Code Online (Sandbox Code Playgroud)

IR

问:使用O3其认为是最高级别的优化,为什么没有nothing功能尚未消除的死代码?

c clang llvm-clang llvm-ir llvm-codegen

10
推荐指数
1
解决办法
579
查看次数

使用Apple的LLVM编译器编译-O时的C++代码段错误,而不是g ++ -7.2.0

更新:我创造了更多M,但仍然是CVE再现崩溃.摘要:删除了类中所有Bool* bools_字段的使用Base(但仍然必须定义或不发生崩溃).还删除Base::Initialize()Rule来自Base及其后代的虚方法.附加了新的MCVE.

我已经设法为此代码创建了一个MCVE并在下面发布了它.

一些描述性细节:代码使用虚拟基类和派生类,并且实例化的某些派生类具有构造函数,这些构造函数调用从"基础"类继承的非虚方法(实际上是派生类,但在继承层次结构中高于我称之为"派生"类来初始化"基础"类数据.该方法调用在派生类中重写的虚方法.我意识到这是一件危险的事情,但是从我(可能是有限的)对C++的理解来看,它似乎应该有效,因为派生类构造函数的主体在设置"基"类虚拟表之前不会执行.在任何情况下,在调用"base"类的初始化方法期间不会发生段错误.

段错误发生在"base"类构造函数中,并且仅在构造函数的主体为空时发生.如果我向构造函数添加一个调试行,以便在到达该点时打印出来,则打印出调试行并且代码正常运行.我的猜测是,由于某种原因,编译器正在优化在"base"类的构造函数的主体执行之前应该发生的初始化,包括设置vtable.

正如主题所说,这个代码在没有使用Apple的g ++或g ++ 7.2.0进行优化编译时运行良好,并且在使用g ++ 7.2.0编译甚至-O3时运行正常.它只在编译时-O2-O3使用Apple的LLVM实现g ++时出现段错误.该g++ --version编译器的输出是:

% /usr/bin/g++ --version

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 9.0.0 (clang-900.0.39.2)
Target: x86_64-apple-darwin17.3.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Content
Run Code Online (Sandbox Code Playgroud)

MCVE如下.

#include <iostream>

using namespace std;

class OriginalBaseClass {
public:
  OriginalBaseClass(long double data1 = 1, long int data2 = 1) : data1_(data1), data2_(data2) { cout << "In OriginalBaseClass constructor\n"; }
private:
  long …
Run Code Online (Sandbox Code Playgroud)

c++ clang virtual-inheritance llvm-clang

10
推荐指数
1
解决办法
529
查看次数

没有 Emscripten,如何用标准库将 C++ 编译成 WebAssembly

我在构建独立的 webassembly 时遇到了问题,我想要完全控制内存和布局。我不想使用 emscripten 因为,正如下面的帖子所说,它没有给我我想要的所有编译时选项(例如堆栈大小控制,能够选择在独立模式下导入内存等。 ) 我一直在关注以下页面:如何使用 emscripten 生成独立的 webassembly 此外,emscripten 是矫枉过正。

到目前为止我所做的:我有一个通过自制软件下载的完全可用的 llvm 9 工具链(我在 macos 10.14 上。)我正在关注https://aransentin.github.io/cwasm/https:// depth-first.com/articles/2019/10/16/compiling-c-to-webassembly-and-running-it-without-emscripten/ 我使用 wasi 来获取 C 标准库。使用链接器标志,就像-Wl,-z,stack-size=$[1024 * 1024]我可以控制堆栈大小一样。编译成功。伟大的!

但是,我需要使用 C++ 标准库来支持我自己的一些和其他第三方库。据我所知,似乎没有任何简单的方法可以获得 libc++ 和 libc++abi。

我尝试了一个“hack”,我下载了 Emscripten 并让它构建了自己的 libc++ 和 libc++abi 文件。然后我尝试将这些文件和标题复制到正确的位置。然后我收到了关于缺少线程 API 的错误消息,这显然是由于没有使用 EMSCRIPTEN 编译造成的。所以我定义了EMSCRIPTEN宏并且这样工作。然后我想也许我可以删除 wasi 依赖项并使用 emscripten 的 libc 版本来保持一致,但随后也存在冲突/缺少标头。

简而言之,我想我已经接近我需要去的地方了,但事情变得非常混乱。我怀疑我采用了最简单的非脚本方法。

有没有人成功地为独立的 webassembly 创建了一个构建系统,让您可以使用 c 和 c++ 标准库?

编辑:

这是我现在拥有的超级 hacky 构建脚本(它是我在网上找到的东西的大量修改版本):

DEPS = 
OBJ = library.o
STDLIBC_OBJ = $(patsubst %.cpp,%.o,$(wildcard stdlibc/*.cpp)) …
Run Code Online (Sandbox Code Playgroud)

c++ compilation llvm-clang webassembly

10
推荐指数
1
解决办法
1955
查看次数