неразрешенный символ: llvm_trap от Emscripten

Когда я пытался скомпилировать следующий фрагмент кода в двоичный файл WebAssembly, я продолжал сталкиваться с предупреждением unresolved symbol: llvm_trap, что делает код wasm неприемлемым для JS.

emcc test.c -s WASM=1 -s ONLY_MY_CODE=1 -s "EXPORTED_FUNCTIONS=['_test']" -O2 -g -o test.js

test.c (это тестовый код для воспроизведения проблемы без выполнения значимых действий.)

int test(int *buf) {
  int C = 1;
  // Assuming WebAssembly.Memory buffer has been preloaed with data. 
  // *T represents the preloaded data here. And We know *T and *buf 
  // won't overlap in memory.
  int *T = 0; 

  int index = C ^ buf[5];
  int right = T[index];
  int left = (unsigned)C >> 8;

  // warning disappears if this is commented out. But why?
  C = left ^ right; 

  return C;
}

Я не писал кода, связанного с llvm_trap. У кого-то есть идеи, что это значит?


person hackjutsu    schedule 08.11.2017    source источник
comment
Это неправильно, потому что T равно NULL. int right = T[index];.   -  person MFisherKDX    schedule 08.11.2017
comment
@MFisherKDX В WebAssembly мы можем предварительно загружать данные в буфер WebAssembly.Memory. *T здесь просто указатель на определенную позицию в буфере.   -  person hackjutsu    schedule 08.11.2017


Ответы (1)


Переменная T должна быть инициализирована. Если он представляет собой массив, который «сопоставляется» с линейной памятью WebAssembly, вы можете определить его как глобальный следующим образом:

int T[1000];

int test(int *buf) {
  int C = 1;

  int index = C ^ buf[5];
  int right = T[index];
  int left = (unsigned)C >> 8;

  // warning disappears if this is commented out. But why?
  C = left ^ right;

  return C;
}

Это компилируется без предупреждений llvm_trap.

Дополнительные сведения о том, как передавать данные в функцию WASM с помощью линейной памяти, см. в следующем вопросе:

Как получить доступ к линейной памяти WebAssembly из C/C++

person ColinE    schedule 10.11.2017