小编alt*_*ler的帖子

调试 LLVM pass seg 错误

我正在根据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)

c++ llvm

5
推荐指数
0
解决办法
2028
查看次数

LLVM中的部分应用

我正在尝试创建一个函数“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)

compiler-construction llvm compiler-development llvm-ir

5
推荐指数
1
解决办法
602
查看次数

Angular 2(cli)量角器jasmine期望不能解决承诺

我正在使用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项目,这可以按预期工作.我已经完成了所有的配置,但找不到任何差异.

jasmine protractor angular

3
推荐指数
1
解决办法
375
查看次数

Angular 2 Renderer2 prependChild-like行为

如何使用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

angular

2
推荐指数
1
解决办法
3238
查看次数

在NSNotification中将int作为"对象"传递

我正在尝试发送一个int(在枚举中定义)作为对象NSNotification.

我不能这样做,因为EXC_BAD_ACCESS在尝试访问notify:观察者方法中的对象时会抛出一个错误,因为int它不是类型id(我认为?).

我目前的解决方案是将int转换为NSNumber(通过使用numberWithInt:).虽然这样做但感觉不对或干净.

所以问题是:将一个int作为NSNotification的"对象"传递的正确方法是什么?

我猜这实际上与这个具体情况无关,但一般来说是Cocoa的东西:-)

cocoa objective-c

0
推荐指数
1
解决办法
2305
查看次数

llvm通过错误

我正在使用本指南: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?

frontend bytecode llvm clang

0
推荐指数
1
解决办法
1188
查看次数