aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2011-05-24 15:07:49 -0700
committerAlon Zakai <alonzakai@gmail.com>2011-05-24 15:07:49 -0700
commitbcdfcfbfed3d6946a1811b17a1f77e0fb8d0fc25 (patch)
tree380a661fae739a3374d976da5d14c83fe3ed0624 /src
parent77cacaa2fd27bcc1265f2f7255b18c3461e0ddff (diff)
remove obsolete fastops; generalize load with parseLLVM/finalizeLLVM; fix issue 14
Diffstat (limited to 'src')
-rw-r--r--src/analyzer.js7
-rw-r--r--src/intertyper.js26
-rw-r--r--src/jsifier.js17
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