diff options
-rw-r--r-- | src/jsifier.js | 32 | ||||
-rw-r--r-- | src/parseTools.js | 8 |
2 files changed, 33 insertions, 7 deletions
diff --git a/src/jsifier.js b/src/jsifier.js index d2d782c7..cb5ed81c 100644 --- a/src/jsifier.js +++ b/src/jsifier.js @@ -255,10 +255,13 @@ function JSify(data, functionsOnly, givenFunctions, givenGlobalVariables) { item.intertype = 'GlobalVariableStub'; var ret = [item]; item.JS = 'var ' + item.ident + ';'; - // Set the actual value in a postset, since it may be a global variable. TODO: handle alias of alias (needs ordering) + // Set the actual value in a postset, since it may be a global variable. We also order by dependencies there + var value = finalizeLLVMParameter(item.value, true); // do *not* indexize functions here ret.push({ intertype: 'GlobalVariablePostSet', - JS: item.ident + ' = ' + finalizeLLVMParameter(item.value, true) + ';' // do *not* indexize functions here + ident: item.ident, + dependencies: set([value]), + JS: item.ident + ' = ' + value + ';'; }); return ret; } @@ -845,11 +848,34 @@ function JSify(data, functionsOnly, givenFunctions, givenGlobalVariables) { var itemsDict = { type: [], GlobalVariableStub: [], functionStub: [], function: [], GlobalVariable: [], GlobalVariablePostSet: [] }; items.forEach(function(item) { item.lines = null; - var small = { intertype: item.intertype, JS: item.JS }; // Release memory + var small = { intertype: item.intertype, JS: item.JS, ident: item.ident, dependencies: item.dependencies }; // Release memory itemsDict[small.intertype].push(small); }); items = null; + var splitPostSets = splitter(itemsDict.GlobalVariablePostSet, function(x) { return x.ident && x.dependencies }); + itemsDict.GlobalVariablePostSet = splitPostSets.leftIn; + var orderedPostSets = splitPostSets.splitOut; + + var limit = orderedPostSets.length * orderedPostSets.length; + for (var i = 0; i < orderedPostSets.length; i++) { + for (var j = i+1; j < orderedPostSets.length; j++) { + if (orderedPostSets[j].ident in orderedPostSets[i].dependencies) { + var temp = orderedPostSets[i]; + orderedPostSets[i] = orderedPostSets[j]; + orderedPostSets[j] = temp; + i--; + limit--; + assert(limit > 0, 'Could not sort postsets!'); + break; + } + } + } + + itemsDict.GlobalVariablePostSet = itemsDict.GlobalVariablePostSet.concat(orderedPostSets); + + // + var generated = []; if (mainPass) { generated = generated.concat(itemsDict.type).concat(itemsDict.GlobalVariableStub).concat(itemsDict.functionStub); diff --git a/src/parseTools.js b/src/parseTools.js index 70071d04..0e30aa5e 100644 --- a/src/parseTools.js +++ b/src/parseTools.js @@ -979,14 +979,14 @@ function makeGetSlabs(ptr, type, allowMultiple, unsigned) { return []; } -function finalizeLLVMFunctionCall(item) { +function finalizeLLVMFunctionCall(item, noIndexizeFunctions) { switch(item.intertype) { case 'getelementptr': // TODO finalizeLLVMParameter on the ident and the indexes? return makePointer(makeGetSlabs(item.ident, item.type)[0], getGetElementPtrIndexes(item), null, item.type); case 'bitcast': case 'inttoptr': case 'ptrtoint': - return finalizeLLVMParameter(item.params[0]); + return finalizeLLVMParameter(item.params[0], noIndexizeFunctions); case 'icmp': case 'mul': case 'zext': case 'add': case 'sub': case 'div': var temp = { op: item.intertype, @@ -1085,11 +1085,11 @@ function finalizeLLVMParameter(param, noIndexizeFunctions) { } else if (typeof param === 'string') { return toNiceIdentCarefully(param); } else if (param.intertype in PARSABLE_LLVM_FUNCTIONS) { - ret = finalizeLLVMFunctionCall(param); + ret = finalizeLLVMFunctionCall(param, noIndexizeFunctions); } else if (param.intertype == 'value') { ret = parseNumerical(param.ident); } else if (param.intertype == 'structvalue') { - ret = param.values.map(finalizeLLVMParameter); + ret = param.values.map(function(value) { return finalizeLLVMParameter(value, noIndexizeFunctions) }); } else if (param.intertype === 'blockaddress') { return finalizeBlockAddress(param); } else if (param.intertype === 'type') { |