我正在根据LLVM 站点上的教程编写一个玩具编译器,但我现在在代码生成过程中遇到错误(我相信)。程序因方法中的段错误而崩溃llvm::TypeFinder::incorporateValue,我无法弄清楚发生了什么。
这是崩溃发生时 LLDB 的输出。
* thread #1: tid = 0x2dfc, 0x0000000000a2a2d0 wtf`llvm::TypeFinder::incorporateValue(llvm::Value const*) + 16, stop reason = invalid address
frame #0: 0x0000000000a2a2d0 wtf`llvm::TypeFinder::incorporateValue(llvm::Value const*) + 16
wtf`llvm::TypeFinder::incorporateValue(llvm::Value const*) + 16:
-> 0xa2a2d0: movb 8(%r14), %al
0xa2a2d4: cmpb $17, %al
0xa2a2d6: jne 0xa2a332 ; llvm::TypeFinder::incorporateValue(llvm::Value const*) + 114
0xa2a2d8: movq %r14, (%rsp)
Run Code Online (Sandbox Code Playgroud)
当我尝试转储函数的 IR 代码、在verifyFunction其上运行或FunctionPassManager尝试优化它时,就会发生这种情况。当 FPM 运行时,它失败并显示
Stack dump:
0. Running pass 'Module Verifier' on function '@foo'
[1] 11485 segmentation fault …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个函数“add”,它可以应用于单个参数,然后是另一个。我不知道如何用 LLVM IR 表示这一点,因为我不明白如何使用单个值调用函数,然后将该值保存在内存中的某处并返回另一个应用于该 val 的函数。我需要在 LLVM 中使用某种关闭机制。
我已经在 C 中搜索了这个实现,以便我可以通过 clang 查看发出的 LLVM,但是我发现的解决方案非常复杂,所以我想我可以直接调查 LLVM。
这将是未经处理的版本
define i8 @add(i8 %a, i8 %b) {
entry:
%res = add i8 %a, %b
ret i8 %res
}
Run Code Online (Sandbox Code Playgroud)
不知何故,我想add(1)返回一个i8 (i8)类型。我想我必须以某种方式拆分该功能。
附:我正在研究这个,因为我正在研究一个小型函数式语言的编译器,所以我正在寻找任何关于编译器设计中部分应用程序/柯里化的实现的建议。
更新:我现在有以下代码工作,但它非常复杂,我认为自动生成并不容易
declare i32 @printf(i8* noalias nocapture, ...)
define { i8, i8 (i8, i8) * } @add1(i8 %a) {
; allocate the struct containing the supplied argument
; and a function ptr to the actual function
%nextPtr = alloca { …Run Code Online (Sandbox Code Playgroud) 我正在使用Jasmine用Protractor和Angular 2编写E2E测试.
我试图对getText()量角器返回的元素做一个简单的期望.
it('should display correct hero title', () => {
expect(element(by.css('Hero-title')).getText()).toEqual('Foobar');
});
Run Code Online (Sandbox Code Playgroud)
这会导致类型错误:
Argument of type '"Foobar"' is not assignable to parameter of type 'Expected<Promise<string>>'. [2345]
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用,.then但我不想这样做,因为我会有很多这些类型的期望.
使用新的Angular CLI项目,这可以按预期工作.我已经完成了所有的配置,但找不到任何差异.
如何使用Angular 2'Renderer2将新子项作为父项的第一个子项插入?
鉴于<div> <span>Foobar</span> </div>我想在span它之前插入一个元素,所以它变成了<div> <span>New element</span> <span>Foobar</span> </div>.
问题是,我只能访问包含div,我无法弄清楚如何可以"前面加上"新元素(如jQuery的可/将做到这一点),或寻父的第一个子元素,这样我可以使用insertBefore从渲染器.
我尝试使用ContentChild获取第一个元素,但它给出了null,我猜它是因为这一切都在指令中进行,我不知道本机元素的内容.
用法是这样的; 将图标标记添加为元素的第一个子元素的指令,例如<button myIconDirective>Foobar</button>应该成为<button myIconDirective><i class="icon-classes"></i>Foobar</button>.
这里有一个修补者,+目前在文本的错误一边:) http://plnkr.co/edit/mknH3yeTnFpepaIwmHUN
我正在尝试发送一个int(在枚举中定义)作为对象NSNotification.
我不能这样做,因为EXC_BAD_ACCESS在尝试访问notify:观察者方法中的对象时会抛出一个错误,因为int它不是类型id(我认为?).
我目前的解决方案是将int转换为NSNumber(通过使用numberWithInt:).虽然这样做但感觉不对或干净.
所以问题是:将一个int作为NSNotification的"对象"传递的正确方法是什么?
我猜这实际上与这个具体情况无关,但一般来说是Cocoa的东西:-)
我正在使用本指南:http : //llvm.org/releases/3.0/docs/WritingAnLLVMPass.html用于创建llvm传递,但是使用时出现以下错误
opt -load ../../../Debug+Asserts/lib/Hello.so -hello < hello.bc > /dev/null
Error opening '../../../Release/lib/Hello.so': ../../../Release/lib/Hello.so: undefined symbol: _ZN4llvm12PassRegistry12registerPassERKNS_8PassInfoEb
-load request ignored.
opt: Unknown command line argument '-hello'. Try: 'opt -help'
Run Code Online (Sandbox Code Playgroud)
请注意,我没有文件夹“ Debug + Asserts”,而是“ Release”
有人知道这是什么问题吗?
也许是因为创建Hello.bc文件时,我使用llvm-clang而不是llvm-gcc?(本指南说使用llvm-gcc,但它不起作用:http ://llvm.org/releases/3.0/docs/GettingStarted.html#tutorial ),或者可能是因为我在使用llvm时选择了2.8版-3.0?