Clang 在C代码中使用memcpy并使用wasm目标编译时发生llvm链接错误

Clang 在C代码中使用memcpy并使用wasm目标编译时发生llvm链接错误,clang,llvm,webassembly,Clang,Llvm,Webassembly,我正试图通过clang将两个*.c文件编译成LLVM位代码,使用LLVM link将它们链接在一起,并从中生成一个*.wasm文件。我通过提供的Makefile在我的机器上构建了LLVM 在我在C代码中使用memcpy之前,这一切都很正常。然后,llvm链接因错误而停止: Intrinsic has incorrect argument type! void (i8*, i8*, i32, i1)* @llvm.memcpy.p0i8.p0i8.i32 以下是重现该问题的一个简单示例: 一、c

我正试图通过
clang
将两个*.c文件编译成LLVM位代码,使用
LLVM link
将它们链接在一起,并从中生成一个*.wasm文件。我通过提供的Makefile在我的机器上构建了LLVM

在我在C代码中使用
memcpy
之前,这一切都很正常。然后,
llvm链接
因错误而停止:

Intrinsic has incorrect argument type!
void (i8*, i8*, i32, i1)* @llvm.memcpy.p0i8.p0i8.i32
以下是重现该问题的一个简单示例:

一、c

执行以下命令:

$ clang --target=wasm32-unknown-unknown-wasm --sysroot=../wasmception/sysroot -S -emit-llvm -nostartfiles -fvisibility=hidden one.c -o one.bc
[...]
$ clang --target=wasm32-unknown-unknown-wasm --sysroot=../wasmception/sysroot -S -emit-llvm -nostartfiles -fvisibility=hidden two.c -o two.bc
[...]
请注意,没有进行优化,因为这将消除不必要的
memcpy
调用。正如我所说,这是一个显示错误的最小上下文示例

$ llvm-link one.bc two.bc -o res.bc -v
Loading 'one.bc'
Linking in 'one.bc'
Loading 'two.bc'
Linking in 'two.bc'
Intrinsic has incorrect argument type!
void (i8*, i8*, i32, i1)* @llvm.memcpy.p0i8.p0i8.i32
llvm-link: error: linked module is broken!
当我注释掉示例文件中的
memcpy
调用时,错误消失了。当然,在我工作的实际项目中,这不是一个选项


我做错什么了吗?通常在WebAssembly上下文中使用
memcpy
是个坏主意吗?这可能是LLVM/Clang中的错误吗?

阅读这些github问题,WASM后端目前似乎不支持
memcpy
内部版本:



作为一种解决方法,您可以指示clang使用
-fno-builtin
禁用内部扩展,以便生成的代码将调用实际的
memcpy
函数。

作为一种解决方法,您可以尝试使用
-fno-builtin
读取此()来禁用memcpy内部扩展,也许memcpy的内在功能还不受支持,但我不知道是不是sureWoah dude。成功了
-fno builtin
使错误消失。多谢各位@valiano如果你把它作为一个答案发布,我会接受并投票。谢谢@Steve Beer,很高兴这对我有帮助!虽然该变通方法确实使我的示例能够工作,但它并没有消除我正在处理的实际项目中的所有内在函数调用。我会再调查一点,也许会发布另一个问题。现在,这个答案对我来说仍然是一个很好的答案,b/c它解决了给定示例的问题。非常感谢!当我只想使用标准C库进行C到WASM编译时,这对我很有帮助;在某些情况下,当我从未添加memcpy时,它会尝试使用库函数(如memcpy)进行优化,因此编译会失败(至少,我认为这就是发生的情况)。
$ clang --target=wasm32-unknown-unknown-wasm --sysroot=../wasmception/sysroot -S -emit-llvm -nostartfiles -fvisibility=hidden one.c -o one.bc
[...]
$ clang --target=wasm32-unknown-unknown-wasm --sysroot=../wasmception/sysroot -S -emit-llvm -nostartfiles -fvisibility=hidden two.c -o two.bc
[...]
$ llvm-link one.bc two.bc -o res.bc -v
Loading 'one.bc'
Linking in 'one.bc'
Loading 'two.bc'
Linking in 'two.bc'
Intrinsic has incorrect argument type!
void (i8*, i8*, i32, i1)* @llvm.memcpy.p0i8.p0i8.i32
llvm-link: error: linked module is broken!