diff options
author | Alon Zakai <alonzakai@gmail.com> | 2011-05-24 15:07:49 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2011-05-24 15:07:49 -0700 |
commit | bcdfcfbfed3d6946a1811b17a1f77e0fb8d0fc25 (patch) | |
tree | 380a661fae739a3374d976da5d14c83fe3ed0624 /src | |
parent | 77cacaa2fd27bcc1265f2f7255b18c3461e0ddff (diff) |
remove obsolete fastops; generalize load with parseLLVM/finalizeLLVM; fix issue 14
Diffstat (limited to 'src')
-rw-r--r-- | src/analyzer.js | 7 | ||||
-rw-r--r-- | src/intertyper.js | 26 | ||||
-rw-r--r-- | src/jsifier.js | 17 |
3 files changed, 11 insertions, 39 deletions
diff --git a/src/analyzer.js b/src/analyzer.js index 74d4e402..e48395c6 100644 --- a/src/analyzer.js +++ b/src/analyzer.js @@ -258,12 +258,12 @@ function analyzer(data) { // Normal variables func.lines.forEach(function(item) { - if (item.intertype in set('assign', 'fastgetelementptrload')) { + if (item.intertype === 'assign') { if (!item.value.tokens.slice(-1)[0].item) throw 'Did you run llvm-dis with -show-annotations?'; func.variables[item.ident] = { ident: item.ident, type: item.value.type, - origin: item.intertype === 'assign' ? item.value.intertype : 'fastgetelementptrload', + origin: item.value.intertype, lineNum: item.lineNum, uses: parseInt(item.value.tokens.slice(-1)[0].item.tokens[0].text.split('=')[1]) }; @@ -314,8 +314,7 @@ function analyzer(data) { //print(dump(line)) if (line.intertype == 'store' && line.ident == vname) { variable.stores ++; - } else if ((line.intertype == 'assign' && line.value.intertype == 'load' && line.value.ident == vname) || - (line.intertype == 'fastgetelementptrload' && line.ident == vname)) { + } else if (line.intertype == 'assign' && line.value.intertype == 'load' && line.value.ident == vname) { variable.loads ++; } }); diff --git a/src/intertyper.js b/src/intertyper.js index c76c3637..0058eec2 100644 --- a/src/intertyper.js +++ b/src/intertyper.js @@ -494,38 +494,20 @@ function intertyper(data, parseFunctions, baseLineNum) { }); substrate.addActor('Reintegrator', makeReintegrator(function(parent, child) { - // Special re-integration behaviors - if (child.intertype == 'fastgetelementptrload') { - parent.intertype = 'fastgetelementptrload'; - } this.forwardItem(parent, '/dev/stdout'); })); // 'load' substrate.addActor('Load', { processItem: function(item) { + item.intertype = 'load'; if (item.tokens[0].text == 'volatile') item.tokens.shift(0); item.pointerType = item.tokens[1].text; item.valueType = item.type = removePointing(item.pointerType); Types.needAnalysis[item.type] = 0; - if (item.tokens[2].text == 'getelementptr') { - var last = getTokenIndexByText(item.tokens, ';'); - var data = parseLLVMFunctionCall(item.tokens.slice(1, last)); - item.intertype = 'fastgetelementptrload'; - item.type = data.type; - item.params = data.params; - item.pointer = data.ident; - item.value = data.value; - } else { - item.intertype = 'load'; - if (item.tokens[2].text == 'bitcast') { - item.pointer = item.tokens[3].item.tokens[1].text; - item.originalType = item.tokens[3].item.tokens[0].text; - } else { - item.pointer = item.tokens[2].text; - } - } - item.ident = toNiceIdent(item.pointer); + var last = getTokenIndexByText(item.tokens, ';'); + item.pointer = parseLLVMSegment(item.tokens.slice(1, last)); // TODO: Use this everywhere else too + item.ident = item.pointer.ident || null; this.forwardItem(item, 'Reintegrator'); } }); diff --git a/src/jsifier.js b/src/jsifier.js index 6c27f653..d1e608a1 100644 --- a/src/jsifier.js +++ b/src/jsifier.js @@ -632,13 +632,13 @@ function JSify(data, functionsOnly, givenFunctions, givenGlobalVariables) { return ret; }); makeFuncLineActor('load', function(item) { - var ident = toNiceIdent(item.ident); - var impl = getVarImpl(item.funcData, item.ident); + var value = finalizeLLVMParameter(item.pointer); + var impl = item.ident ? getVarImpl(item.funcData, item.ident) : VAR_EMULATED; switch (impl) { case VAR_NATIVIZED: { - return ident; // We have the actual value here + return value; // We have the actual value here } - case VAR_EMULATED: return makeGetValue(ident, null, item.type); + case VAR_EMULATED: return makeGetValue(value, null, item.type); default: throw "unknown [load] impl: " + impl; } }); @@ -722,15 +722,6 @@ function JSify(data, functionsOnly, givenFunctions, givenGlobalVariables) { return makeFunctionCall(item.ident, item.params, item.funcData) + (item.standalone ? ';' : ''); }); - // Optimized intertypes - - makeFuncLineActor('fastgetelementptrload', function(item) { - return 'var ' + item.ident + '=' + makeGetValue(parseNumerical(item.value.ident), getGetElementPtrIndexes(item.value), item.value.valueType, true) + ';'; - }); - makeFuncLineActor('fastgetelementptrstore', function(item) { - return makeSetValue(item.value.ident, getGetElementPtrIndexes(item.value), parseNumerical(item.ident), item.type, true) + ';'; - }); - makeFuncLineActor('unreachable', function(item) { return 'throw "Reached an unreachable! Original .ll line: ' + item.lineNum + '";' }); // Final combiner |