<html>
    <head>
      <base href="https://bugs.llvm.org/">
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - wasm-validate: type mismatch in function, expected [] but got [i32]"
   href="https://bugs.llvm.org/show_bug.cgi?id=44381">44381</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>wasm-validate: type mismatch in function, expected [] but got [i32]
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>lld
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>unspecified
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>PC
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>Windows NT
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>NEW
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>normal
          </td>
        </tr>

        <tr>
          <th>Priority</th>
          <td>P
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>wasm
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>unassignedbugs@nondot.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>scott.waye@hubse.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>llvm-bugs@lists.llvm.org, sbc@chromium.org
          </td>
        </tr></table>
      <p>
        <div>
        <pre>I'm getting this error from wasm-validate, after wasm-ld.  Running

E:/GitHub/emsdk/upstream/bin\wasm-ld.exe -o
c:\users\scottw~1\appdata\local\temp\emscripten_temp\HelloWasm.wasm
--allow-undefined --lto-O0
E:\GitHub\corert\tests\src\Simple\HelloWasm\obj\Debug\wasm\native\HelloWasm.bc
E:\GitHub\corert\tests\\..\bin\WebAssembly.wasm.Debug/sdk/libPortableRuntime.a
E:\GitHub\corert\tests\\..\bin\WebAssembly.wasm.Debug/sdk/libbootstrappercpp.a
E:\GitHub\corert\tests\\..\bin\WebAssembly.wasm.Debug/sdk/libSystem.Private.CoreLib.Native.a
-LE:\GitHub\emsdk\upstream\emscripten\system\local\lib
-LE:\GitHub\emsdk\upstream\emscripten\system\lib
-LC:\Users\ScottWaye\.emscripten_cache\wasm-obj
C:\Users\ScottWaye\.emscripten_cache\wasm-obj\libc.a
C:\Users\ScottWaye\.emscripten_cache\wasm-obj\libcompiler_rt.a
C:\Users\ScottWaye\.emscripten_cache\wasm-obj\libc-wasm.a
C:\Users\ScottWaye\.emscripten_cache\wasm-obj\libc++-noexcept.a
C:\Users\ScottWaye\.emscripten_cache\wasm-obj\libc++abi-noexcept.a
C:\Users\ScottWaye\.emscripten_cache\wasm-obj\libdlmalloc-debug.a
C:\Users\ScottWaye\.emscripten_cache\wasm-obj\libpthread_stub.a
C:\Users\ScottWaye\.emscripten_cache\wasm-obj\libc_rt_wasm.a --import-memory
--import-table -mllvm -combiner-global-alias-analysis=false -mllvm
-enable-emscripten-sjlj -mllvm -disable-lsr --export __wasm_call_ctors --export
__data_end --export main --export malloc --export free --export setThrew
--export __errno_location --export fflush --export emscripten_builtin_memalign
--export memalign --export emscripten_builtin_free --export
_ZSt18uncaught_exceptionv --export _get_environ -z stack-size=5242880
--initial-memory=16777216 --no-entry --global-base=1024

Where the input files are at
<a href="https://hubsoftwareengineering-my.sharepoint.com/:u:/g/personal/scott_waye_hubse_com/EXx2lfO3PppIr-d5LevShOgBHVY_k944rFkN1TCnRMJJ7Q?e=Lh9dVl">https://hubsoftwareengineering-my.sharepoint.com/:u:/g/personal/scott_waye_hubse_com/EXx2lfO3PppIr-d5LevShOgBHVY_k944rFkN1TCnRMJJ7Q?e=Lh9dVl</a>
(too big for here).

wasm-ld is version LLD 10.0.0
(Cswircachegitchromium.googlesource.com-external-github.com-llvm-llvm--project
b5f295ffcec2fa7402e39eb1262acbd55a7d39f5)

This produces a wasm, which can passed to wasm-validate with the output:

c:/users/scottw~1/appdata/local/temp/emscripten_temp/HelloWasm.wasm:01b75a7:
error: type mismatch in function, expected [] but got [i32]

wasm-dis does not complain and produces an output ok.

If I run wasm-validate --verbose, then the message appears between these
functions:

      OnFunctionName(index: 26584, name:
"Internal_CompilerGenerated__Module___InvokeRetVIII<Double__Int32__Int32>")
 c:/users/scottw~1/appdata/local/temp/emscripten_temp/HelloWasm.wasm:01b75a7:
error: type mismatch in function, expected [] but got [i32]
     OnFunctionName(index: 26585, name:
"Internal_CompilerGenerated__Module___InvokeRetVIIII<S_P_CoreLib_System_Action_1<Object>__Object__Int16__Int32>")

Not sure if it refers to the function before, after, or neither.

I'm using emscripten and when I run the build from emscripten, the error is
different

[wasm-validator error in function
$S_P_CoreLib_System_Runtime_RuntimeImports__memset] unexpected true: if block
is not returning a value, final element should not flow out a value, on

This function does end in a local.get which I'm not sure is right as the LLVM
is void:

define void @S_P_CoreLib_System_Runtime_RuntimeImports__memset(i8*, i8*, i32,
i32) {
Prolog:
  %Argument0_ = getelementptr i8, i8* %0, i32 0
  %CastPtr = bitcast i8* %Argument0_ to i8**
  store i8* %1, i8** %CastPtr
  %Argument1_ = getelementptr i8, i8* %0, i32 4
  %CastPtr1 = bitcast i8* %Argument1_ to i32*
  store i32 %2, i32* %CastPtr1
  %Argument2_ = getelementptr i8, i8* %0, i32 8
  %CastPtr2 = bitcast i8* %Argument2_ to i32*
  store i32 %3, i32* %CastPtr2
  br label %Block0

Block0:                                           ; preds = %Prolog
  %Argument0_3 = getelementptr i8, i8* %0, i32 0
  %Argument1_4 = getelementptr i8, i8* %0, i32 4
  %Argument2_5 = getelementptr i8, i8* %0, i32 8
  %CastPtr6 = bitcast i8* %Argument0_3 to i8**
  %Loadarg0_ = load i8*, i8** %CastPtr6
  %CastPtr7 = bitcast i8* %Argument1_4 to i32*
  %Loadarg1_ = load i32, i32* %CastPtr7
  %CastPtr8 = bitcast i8* %Argument2_5 to i32*
  %Loadarg2_ = load i32, i32* %CastPtr8
  %shadowStackTop = getelementptr i8, i8* %0, i32 12
  store i8* %shadowStackTop, i8** @t_pShadowStackTop
  %PInvokeTransitionFrame = alloca { i8*, i8*, i8* }
  call void @RhpPInvoke2({ i8*, i8*, i8* }* %PInvokeTransitionFrame)
  call void @memset(i8* %Loadarg0_, i32 %Loadarg1_, i32 %Loadarg2_)
  call void @RhpPInvokeReturn2({ i8*, i8*, i8* }* %PInvokeTransitionFrame)
  call void @"S_P_CoreLib_System_Runtime_RuntimeImports__memset$FinallyD"(i8*
%0)
  br label %BlockE

BlockE:                                           ; preds = %Block0
  ret void
}

The value pushed to the stack, $5, is the result (if I read the wasm
correctly), of the memset call.  The LLVM for that call is 

call void @memset(i8* %Loadarg0_, i32 %Loadarg1_, i32 %Loadarg2_)

so there is no return, I have memset externed (in c#):

        internal static extern unsafe void memset(byte* mem, int value, nuint
size);

And this does differ from the c++ definition where it is void*.  I changed this
extern to byte* and that does clear the error.  So not sure if there's really a
problem here or not.  The wasm does push a value to the stack when the LLVM
does not, but then again there is a mismatch in memset definitions.

Feel free to close if you think its fine.</pre>
        </div>
      </p>


      <hr>
      <span>You are receiving this mail because:</span>

      <ul>
          <li>You are on the CC list for the bug.</li>
      </ul>
    </body>
</html>