WebAssembly无法编译简单的类?

时间:2017-04-19 19:43:25

标签: webassembly

我一直在玩WebAssembly资源管理器只是为了习惯一般概念而且我相信输错了:

C ++代码:

class Rectangle {
  void draw(int fooBar) {};
};

webassembly的输出:

(module
  (table 0 anyfunc)
  (memory $0 1)
  (export "memory" (memory $0))
)

老实说,这看起来不对。为什么它没有显示功能?我实际上期望探测器导出一个看起来像这样的函数:

  (export "_Z4drawi" (func $_Z4drawi))
  (func $_Z4drawi (param $0 i32)

相反,它假装对象是空的......为什么会这样?

1 个答案:

答案 0 :(得分:3)

LLVM正在消除您的功能,因为它未被使用。

尝试使用它并使其成为非内联(以防止它也被消除):

class Rectangle {
  public:
  Rectangle() {}
  __attribute__((noinline)) void draw(int fooBar) {}
};

int main() {
  Rectangle r;
  r.draw(42);
}

你得到:

(module
  (table 0 anyfunc)
  (memory $0 1)
  (export "memory" (memory $0))
  (export "main" (func $main))
  (func $main (result i32)
    (local $0 i32)
    (i32.store offset=4
      (i32.const 0)
      (tee_local $0
        (i32.sub
          (i32.load offset=4
            (i32.const 0)
          )
          (i32.const 16)
        )
      )
    )
    (call $_ZN9Rectangle4drawEi
      (i32.add
        (get_local $0)
        (i32.const 8)
      )
      (i32.const 42)
    )
    (i32.store offset=4
      (i32.const 0)
      (i32.add
        (get_local $0)
        (i32.const 16)
      )
    )
    (i32.const 0)
  )
  (func $_ZN9Rectangle4drawEi (param $0 i32) (param $1 i32)
  )
)

使用no-inline是一个琐碎的代码得到优化的黑客攻击。您也可以将其标记为已使用:

class Rectangle {
  public:
  Rectangle() {}
  __attribute__((used)) void draw(int fooBar) {}
};

然后你得到:

(module
  (table 0 anyfunc)
  (memory $0 1)
  (export "memory" (memory $0))
  (func $_ZN9Rectangle4drawEi (param $0 i32) (param $1 i32)
  )
)