我在调试控制台中有这个奇怪的功能.
说你有以下代码:
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月号
任何的想法
我想配置 clang-format 以在 C++ 中对包含的标头进行排序,如下所示:
我在 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) 我目前正在尝试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) 我想使用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-ld或llvm-link).这适用于简单的包,例如grep.
我想要一个健壮的方法,并且适用于大多数(如果不是全部)配置脚本,包括存在中间.a文件或中间目标时.
我有一个使用opt工具的ModulePass,但是我无法弄清楚如何在命令行中使用它.我目前使用my pass的工作流程是:
我希望将我的pass与clang命令行集成,以便可以作为现有软件(例如c ++标准库)构建的一部分调用它,而不必为我编译的每个东西重新构建整个构建系统.我已经看到了关于如何做到这一点的提示,但我无法将各个部分组合到一个正常工作的设置中.
使用Clang自动运行LLVM Pass会自动描述我想要的内容,但LLVM 3.4中似乎不推荐使用该方法(PassManagerBuilder已移至旧版命名空间).
LLVM - 使用clang自动运行自己的通行证似乎解决了基本问题,但我希望我能做到这一点,而不必修改clang(这似乎是那里的建议).
使用LLVM 3.4从clang获得新传递的最佳方法是什么?
从标题开始,我需要在Mavericks中使用10.8 SDK和5.1(或5.0)LLVM编译器和Xcode 6.使用之前的Xcode,可以同时拥有两个SDK,但现在我只看到了10.9.如何在Xcode 6中安装以前的SDK和编译器?
假设我们有以下(无意义)代码:
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程序开始:
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)
问:使用O3其认为是最高级别的优化,为什么没有nothing功能尚未消除的死代码?
更新:我创造了更多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) 我在构建独立的 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) llvm-clang ×10
clang ×5
c++ ×4
llvm ×3
llvm-ir ×2
optimization ×2
xcode ×2
autotools ×1
avr ×1
c ×1
clang-format ×1
compilation ×1
gcc ×1
ios ×1
iphone ×1
lambda ×1
lldb ×1
llvm-c++-api ×1
llvm-codegen ×1
regex ×1
webassembly ×1
xcode6 ×1