aboutsummaryrefslogtreecommitdiff
path: root/src/analyzer.js
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2012-01-05 13:52:45 -0800
committerAlon Zakai <alonzakai@gmail.com>2012-01-05 13:52:45 -0800
commitbbc060ffc87fab16b089f15ce04c520bad8194fe (patch)
tree2da4466c31d6eeafe4be8eabd99de757639b4334 /src/analyzer.js
parent5ad5df53ba7dc0ce890acabed3388c6c2ca6077d (diff)
handle various possible namings for an implicitly named entry
Diffstat (limited to 'src/analyzer.js')
-rw-r--r--src/analyzer.js15
1 files changed, 14 insertions, 1 deletions
diff --git a/src/analyzer.js b/src/analyzer.js
index 3feaff92..3f4df5ba 100644
--- a/src/analyzer.js
+++ b/src/analyzer.js
@@ -8,6 +8,8 @@ var VAR_NATIVE = 'native';
var VAR_NATIVIZED = 'nativized';
var VAR_EMULATED = 'emulated';
+var ENTRY_IDENT = toNiceIdent('%0');
+
function cleanFunc(func) {
func.lines = func.lines.filter(function(line) { return line.intertype !== null });
func.labels.forEach(function(label) {
@@ -72,7 +74,7 @@ function analyzer(data, sidePass) {
if (item.items[i+1].intertype !== 'label') {
item.items.splice(i+1, 0, {
intertype: 'label',
- ident: toNiceIdent('%1'),
+ ident: ENTRY_IDENT,
lineNum: subItem.lineNum + '.5'
});
}
@@ -706,6 +708,8 @@ function analyzer(data, sidePass) {
// MICRO_OPTS == 1: Properly implement phis, by pushing them back into the branch
// that leads to here. We will only have the |var| definition in this location.
+ var unknownEntry = null;
+
// First, push phis back
func.labels.forEach(function(label) {
label.lines.forEach(function(line) {
@@ -715,6 +719,15 @@ function analyzer(data, sidePass) {
var param = phi.params[i];
var sourceLabelId = param.label;
var sourceLabel = func.labelsDict[sourceLabelId];
+ if (!sourceLabel) {
+ // The entry might not have an explicit label, and there is no consistent naming convention for it.
+ // So we need to handle that in a special way here.
+ assert(!unknownEntry, 'More than one unknown label in phi, so both cannot be an unlabelled entry, in ' + func.ident);
+ unknownEntry = sourceLabelId;
+ sourceLabelId = ENTRY_IDENT;
+ sourceLabel = func.labelsDict[sourceLabelId];
+ assert(sourceLabel, 'Cannot find entry label when looking for it after seeing an unknown label in a phi');
+ }
var lastLine = sourceLabel.lines.slice(-1)[0];
if (lastLine.intertype == 'assign') lastLine = lastLine.value;
assert(lastLine.intertype in LLVM.PHI_REACHERS, 'Only some can lead to labels with phis:' + [func.ident, label.ident, lastLine.intertype]);