1

First, check my knowledge

  1. c/c++ code >> compile(emscripten [emcc]) >> asm.js code
    I can get c/c++ code to asm.js code, is it right?

  2. asm.js code >> compile(binaryen [asm2wasm]) >> wasm code
    I can get asm.js code to wasm code, is it right?

Second, my main question, how can i get simple asm.js code?

I'm try to follow step, but I can't get simple asm.js code... I'm get always complex asm.js code(5000 line more...) when using emcc compile...

my try step

A. make simple C api code // my_add.c

#include <stdio.h>
#include <emscripten.h>

EMSCRIPTEN_KEEPALIVE
double my_add(double num1, double num2) {
    return num1 + num2;
}

B. compile my_add.c code to asm.js code (using emcc)
I'm try many emcc options...

emcc my_add.c

emcc my_add.c -s WASM=1

etc...

My expected... simple asm.js code (something like follow code...)

function my_add(num1, num2) {
    "use asm";
    num1 = num1|0;
    num2 = num2|0;
    retrurn (num1 + num2)|0;
}

But emcc complied result is complex asm.js code

  1 // The Module object: Our interface to the outside world. We import
   2 // and export values on it, and do the work to get that through
   3 // closure compiler if necessary. There are various ways Module can be used:
   4 // 1. Not defined. We create it here
   5 // 2. A function parameter, function(Module) { ..generated code.. }
   6 // 3. pre-run appended it, var Module = {}; ..generated code..
   7 // 4. External script tag defines var Module.
   8 // We need to do an eval in order to handle the closure compiler
   9 // case, where this code here is minified but Module was defined
  10 // elsewhere (e.g. case 4 above). We also need to check if Module
  11 // already exists (e.g. case 3 above).
  12 // Note that if you want to run closure, and also to use Module
  13 // after the generated code, you will need to define   var Module = {};
  14 // before the code. Then that object will be used in the code, and you
  15 // can continue to use Module afterwards as well.
  16 var Module;
  17 if (!Module) Module = (typeof Module !== 'undefined' ? Module : null) || {};
  18 
  19 // Sometimes an existing Module object exists with properties
  20 // meant to overwrite the default module functionality. Here
  21 // we collect those properties and reapply _after_ we configure
  22 // the current environment's defaults to avoid having to be so
  23 // defensive during initialization.
  24 var moduleOverrides = {};
  25 for (var key in Module) {
  26   if (Module.hasOwnProperty(key)) {
  27     moduleOverrides[key] = Module[key];
  28   }
  29 }
  30 
  31 // The environment setup code below is customized to use Module.
  32 // *** Environment setup code ***
  33 var ENVIRONMENT_IS_WEB = false;
  34 var ENVIRONMENT_IS_WORKER = false;
  35 var ENVIRONMENT_IS_NODE = false;
  36 var ENVIRONMENT_IS_SHELL = false;
  37 

  ......
  
  
  2038 function _my_add($num1,$num2) {
2039  $num1 = +$num1;
2040  $num2 = +$num2;
2041  var $0 = 0.0, $1 = 0.0, $2 = 0.0, $3 = 0.0, $4 = 0.0, label = 0, sp = 0;
2042  sp = STACKTOP;
2043  STACKTOP = STACKTOP + 16|0; if ((STACKTOP|0) >= (STACK_MAX|0)) abort();
2044  $0 = $num1;
2045  $1 = $num2;
2046  $2 = $0;
2047  $3 = $1;
2048  $4 = $2 + $3;
2049  STACKTOP = sp;return (+$4);
2050 }

 .......

My C/C++ code is 5~6 line.. but complied asm.js code is 5000~10000 line...
I'm just want simple 'asm.js' code at compile result...
Is It possible?
And... How can I do that?

2 Answers 2

3

I have found a solution!

Using the ONLY_MY_CODE and --separate-asm options,

emcc my_add.c -O2 -profiling -s ONLY_MY_CODE=1 -g2 --separate-asm -o abc.js

the abc.asm.js file is created:

Module["asm"] = (function(global, env, buffer) {
 "use asm";

 function _my_add(d1, d2) {
  d1 = +d1;
  d2 = +d2;
  return +(d1 + d2);
 }
 return {
  _my_add: _my_add
 };
});

Sign up to request clarification or add additional context in comments.

3 Comments

Please consider marking this answer as accepted using the green tick button (underneath the voting buttons). That way, if anybody else wants to find the answer to this question they can easily see that "this one works".
Thank you for your comment~
using emscripten 1.38.31, I have an error: shared:WARNING: --separate-asm works best when compiling to HTML. Otherwise, you must yourself load the '.asm.js' file that is emitted separately, and must do so before loading the main '.js' file. [-Wseparate-asm] shared:ERROR: Attempt to set a non-existent setting: 'ONLY_MY_CODE' - did you mean one of DOUBLE_MODE? - perhaps a typo in emcc's -s X=Y notation? - (see src/settings.js for valid values)
0

IRC ch. #emscripten
'pdox' answer to me..

pdox: emcc -O2 -profiling

3601 function _my_add(d1, d2) {
3602  d1 = +d1;
3603  d2 = +d2;
3604  return +(d1 + d2);
3605 }

emcc -O2 -profiling

command make simple function.. but.. But it still produces a long code.(3000 line...) (complie result file 'a.out.js' is 3000 lines....)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.