WebAssembly не может скомпилировать простые классы?

Я поигрался с WebAssembly Explorer, чтобы привыкнуть к общей концепции, и я считаю, что получаю неправильный вывод:

Код C++:

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

Выход в веб-сборку:

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

Честно говоря, это не выглядит правильно. Почему он не показывает функцию? Я действительно ожидал, что проводник экспортирует функцию, которая может выглядеть примерно так:

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

Вместо этого, однако, он делает вид, что объект был пуст... почему это так?

1 ответ

Решение

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)
  )
)
Другие вопросы по тегам