Some code landed recently that was related to that, can try on very latest incoming (on all 3 repos) to see if it helps. If not, the best solution is to refactor the source code to avoid using that feature.
- Alon On Fri, Nov 7, 2014 at 11:37 AM, Colin Gordon <[email protected]> wrote: > I assumed I could compile simple programs, since I had done so quite > recently, but apparently not. After some more digging I discovered that > the issue was a misconfigured emscripten install — I had multiple copies of > the portable SDK around, and was trying to use one of them with the other > activated. I can now build, and run the following: > > #include<gc.h> > #include <stdio.h> > > int main() { > GC_INIT(); > printf("Successfully init'ed GC\n"); > for (int i = 0; i < 100; i++) { > void* v = GC_malloc(1024*1024*1); > } > GC_gcollect(); > printf("Successfully alloc'ed a lot of memory, and forced > collection\n"); > return 0; > } > > With > > emcc -I $OUTPUT/lib/libgc.dylib boehm.c -s NO_EXIT_RUNTIME=1 > > But now I’m stuck on a new compiler crash for the code I’m actually > trying to compile, which uses uses variadic struct arguments, and the > workaround suggested here > <http://kripken.github.io/emscripten-site/docs/getting_started/FAQ.html#why-do-i-get-error-cannot-compile-this-aggregate-va-arg-expression-yet-and-it-says-compiler-frontend-failed-to-generate-llvm-bitcode-halting-afterwards> > yields: > > $ emcc -I $OUTPUT/include/ $OUTPUT/lib/libgc.dylib boehm.c -s > NO_EXIT_RUNTIME=1 > boehm.c:11:25: error: cannot compile this aggregate va_arg expression yet > printf("%d\n", (va_arg(ap, t)).f); > ^~~~~~~~~~~~~ > .../emsdk/emscripten/1.25.0/system/include/libc/stdarg.h:15:25: note: > expanded from macro 'va_arg' > #define va_arg(v,l) __builtin_va_arg(v,l) > ^~~~~~~~~~~~~~~~~~~~~ > 1 error generated. > ERROR root: compiler frontend failed to generate LLVM bitcode, halting > $ EMCC_LLVM_TARGET=i386-pc-linux-gnu emcc -I $OUTPUT/include/ > $OUTPUT/lib/libgc.dylib boehm.c -s NO_EXIT_RUNTIME=1 > Exception in thread Thread-3: > Traceback (most recent call last): > File > "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", > line 808, in __bootstrap_inner > self.run() > File > "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", > line 761, in run > self.__target(*self.__args, **self.__kwargs) > File > "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/pool.py", > line 376, in _handle_results > task = get() > TypeError: ('__init__() takes at least 3 arguments (1 given)', <class > 'subprocess.CalledProcessError'>, ()) > > ^\Quit: 3 > $ > > I have to use ^\ to kill it, or I just get a long stack trace from a > keyboard interrupt > > The test code to produce the error above is: > > #include<gc.h> > #include <stdio.h> > #include<stdarg.h> > > typedef struct { int f; } t; > > void many_ts(int count, ...) { > va_list ap; > int i = 0; > for (i = 0; i < count; i++) { > printf("%d\n", (va_arg(ap, t)).f); > } > } > > int main() { > GC_INIT(); > printf("Successfully init'ed GC\n"); > for (int i = 0; i < 100; i++) { > void* v = GC_malloc(1024*1024*1); > } > GC_gcollect(); > printf("Successfully alloc'ed a lot of memory, and forced > collection\n"); > return 0; > } > > I also tried without the GC code and libraries, and the same crash > occurs: > > #include <stdio.h> > #include<stdarg.h> > > typedef struct { int f; } t; > > void many_ts(int count, ...) { > va_list ap; > int i = 0; > for (i = 0; i < count; i++) { > printf("%d\n", (va_arg(ap, t)).f); > } > } > > int main() { > printf("hello\n"); > return 0; > } > > for > $ EMCC_LLVM_TARGET=i386-pc-linux-gnu emcc testhello.c -s NO_EXIT_RUNTIME=1 > > Is there another known workaround for structs as variadic arguments? Or > do I need to rewrite the code to pass non-aggregates to the variadic > functions? > > Thanks, > Colin > > > From: Alon Zakai <[email protected]> > Reply-To: "[email protected]" < > [email protected]> > Date: Thursday, November 6, 2014 at 4:49 PM > To: "[email protected]" < > [email protected]> > Subject: Re: Trouble with emscripten support in official Boehm GC? > > Is this Boehm specific? Can you build a trivial hello world? > > - Alon > > > On Thu, Nov 6, 2014 at 2:15 PM, Colin Gordon <[email protected]> > wrote: > >> Hi everyone, >> >> I’ve been trying to build the trunk version of the Boehm GC using >> emscripten, which now appears to be an officially supported platform based >> on some of the change sets from the last few months (some work was >> upstreamed from Unity). Has anyone had success in doing this? I’ve >> managed to produce a compiled library of LLVM bit code with the emscripten >> target triple, but attempting to link even a trivial program against it >> causes emcc to crash. >> >> I’ve asked about this on the Boehm GC mailing list with no luck. >> >> I modified the standard Boehm build instructions according to standard >> emscripten practice and based on the changes to the GC library itself: >> >> autoreconf -vif >> automake --add-missing >> emconfigure ./configure --prefix=$OUTPUT --without-threads >> --disable-threads __EMSCRIPTEN__=1 EMSCRIPTEN=1 >> emmake make >> make install >> >> This produces an LLVM bitcode file in $OUTPUT/lib/libgc.dylib (OS X >> 10.9.5) which, when disassembled, appears to contain the relevant symbols, >> code, and the target triple asmjs-unknown-emscripten. But linking even a >> minimal program against this cases emcc (from the portable SDK, I’ve tried >> 1.22 and 1.25) to fail. >> >> Example program: >> >> #include<gc.h> >> int main() { >> GC_INIT(); // Initialize the GC allocator >> return 0; >> } >> >> Compiled via: >> emcc –g –I $OUTPUT/include –L$(OUTPUT)/lib –lgc boehm.c >> >> Produces: >> fs.js:427 >> return binding.open(pathModule._makeLong(path), stringToFlags(flags), >> mode); >> ^ >> Error: ENOENT, no such file or directory '--' >> at Object.fs.openSync (fs.js:427:18) >> at Object.fs.readFileSync (fs.js:284:15) >> at read (.../external/emsdk/emscripten/1.22.0/src/compiler.js:57:34) >> at Object.<anonymous> >> (.../external/emsdk/emscripten/1.22.0/src/compiler.js:145:29) >> at Module._compile (module.js:456:26) >> at Object.Module._extensions..js (module.js:474:10) >> at Module.load (module.js:356:32) >> at Function.Module._load (module.js:312:12) >> at Function.Module.runMain (module.js:497:10) >> at startup (node.js:119:16) >> Traceback (most recent call last): >> File ".../external/emsdk/emscripten/1.22.0/emscripten.py", line 1490, >> in <module> >> _main(environ=os.environ) >> File ".../external/emsdk/emscripten/1.22.0/emscripten.py", line 1478, >> in _main >> temp_files.run_and_clean(lambda: main( >> File ".../external/emsdk/emscripten/1.22.0/tools/tempfiles.py", line >> 39, in run_and_clean >> return func() >> File ".../external/emsdk/emscripten/1.22.0/emscripten.py", line 1486, >> in <lambda> >> DEBUG_CACHE=DEBUG_CACHE, >> File ".../external/emsdk/emscripten/1.22.0/emscripten.py", line 1373, >> in main >> jcache=jcache, temp_files=temp_files, DEBUG=DEBUG, >> DEBUG_CACHE=DEBUG_CACHE) >> File ".../external/emsdk/emscripten/1.22.0/emscripten.py", line 861, in >> emscript_fast >> cwd=path_from_root('src'), error_limit=300) >> File ".../external/emsdk/emscripten/1.22.0/tools/jsrun.py", line 43, in >> run_js >> raise Exception('Expected the command ' + str(command) + ' to finish >> with return code ' + str(assert_returncode) + ', but it returned with code >> ' + str(proc.returncode) + ' instead! Output: ' + str(ret)[:error_limit]) >> Exception: Expected the command >> ['.../external/emsdk/node/0.10.18_64bit/bin/node', >> '.../external/emsdk/emscripten/1.22.0/src/compiler.js', '--', >> '/var/folders/nx/_cvrfktd5cs5h3ktk6v3z310qn9lg1/T/tmp6TBpfX.txt', ';', >> 'glue'] to finish with return code 0, but it returned with code 8 instead! >> Output: >> Traceback (most recent call last): >> File "external/emsdk/emscripten/1.22.0/emcc", line 1642, in <module> >> final = shared.Building.emscripten(final, append_ext=False, >> extra_args=extra_args) >> File ".../external/emsdk/emscripten/1.22.0/tools/shared.py", line 1464, >> in emscripten >> assert os.path.exists(filename + '.o.js'), 'Emscripten failed to >> generate .js' >> AssertionError: Emscripten failed to generate .js >> >> A very similar stack trace showed up in another recent mail to this >> list ( >> https://groups.google.com/forum/#!topic/emscripten-discuss/Wn6YnoHu9XQ). >> >> Has anyone had more success than this? Am I missing another >> emscripten-specific build tweak? >> >> Thanks in advance, >> Colin >> >> -- >> You received this message because you are subscribed to the Google Groups >> "emscripten-discuss" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> For more options, visit https://groups.google.com/d/optout. >> > > -- > You received this message because you are subscribed to the Google Groups > "emscripten-discuss" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. > > -- > You received this message because you are subscribed to the Google Groups > "emscripten-discuss" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "emscripten-discuss" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
