diff options
author | alon@honor <none@none> | 2010-10-08 20:12:01 -0700 |
---|---|---|
committer | alon@honor <none@none> | 2010-10-08 20:12:01 -0700 |
commit | 7ae56ec8ee8e7c1166afaa7c7305fd73996c483f (patch) | |
tree | 285196ff1d78bf1d1be5dbe57788c0d3249a589f /src | |
parent | 8e37aa593df856af80c4186633084a2d01fc995a (diff) |
initial support for |extractvalue|
Diffstat (limited to 'src')
-rw-r--r-- | src/intertyper.js | 13 | ||||
-rw-r--r-- | src/jsifier.js | 6 | ||||
-rw-r--r-- | src/library.js | 7 |
3 files changed, 25 insertions, 1 deletions
diff --git a/src/intertyper.js b/src/intertyper.js index 2514b6b9..cdb11aef 100644 --- a/src/intertyper.js +++ b/src/intertyper.js @@ -172,6 +172,8 @@ function intertyper(data) { if (!item.intertype && item.indent === -1 && item.tokens && item.tokens.length >= 3 && (item.tokens[0].text == 'load' || item.tokens[1].text == 'load')) return 'Load'; + if (!item.intertype && item.indent === -1 && item.tokens.length >= 3 && item.tokens[0].text == 'extractvalue') + return 'ExtractValue'; if (!item.intertype && item.indent === -1 && item.tokens && item.tokens.length >= 3 && item.tokens[0].text == 'bitcast') return 'Bitcast'; if (!item.intertype && item.indent === -1 && item.tokens && item.tokens.length >= 3 && item.tokens[0].text == 'getelementptr') @@ -375,6 +377,17 @@ function intertyper(data) { this.forwardItem(item, 'Reintegrator'); }, }); + // 'extractvalue' + substrate.addZyme('ExtractValue', { + processItem: function(item) { + var last = getTokenIndexByText(item.tokens, ';'); + item.intertype = 'extractvalue'; + item.type = item.tokens[1].text; // Of the origin aggregate - not what we extract from it. For that, can only infer it later + item.ident = item.tokens[2].text; + item.indexes = splitTokenList(item.tokens.slice(4, last)); + this.forwardItem(item, 'Reintegrator'); + }, + }); // 'bitcast' substrate.addZyme('Bitcast', { processItem: function(item) { diff --git a/src/jsifier.js b/src/jsifier.js index 12017e2a..cd118644 100644 --- a/src/jsifier.js +++ b/src/jsifier.js @@ -533,7 +533,6 @@ function JSify(data) { return ret; }); makeFuncLineZyme('load', function(item) { - //print('// zz LOAD ' + dump(item) + ' :: ' + dump(item.tokens)); var ident = toNiceIdent(item.ident); var impl = getVarData(item.funcData, item.ident); switch (impl) { @@ -544,6 +543,11 @@ function JSify(data) { default: return "unknown [load] impl: " + impl; } }); + makeFuncLineZyme('extractvalue', function(item) { + assert(item.indexes.length == 1); // TODO: use getelementptr parsing stuff, for depth. For now, we assume that LLVM aggregates are flat, + // and we emulate them using simple JS objects { f1: , f2: , } etc., for speed + return item.ident + '.f' + item.indexes[0][0].text; + }); makeFuncLineZyme('alloca', function(item) { dprint('alloca', dump(item)); if (pointingLevels(item.allocatedType.text) == 0 && isStructType(item.allocatedType.text)) { diff --git a/src/library.js b/src/library.js index 7fa4b979..3d91926a 100644 --- a/src/library.js +++ b/src/library.js @@ -153,6 +153,13 @@ var Library = { __gxx_personality_v0: function() { }, + llvm_umul_with_overflow_i32: function(x, y) { + return { + f1: x*y, + f2: 0, // We never overflow... for now + }; + }, + // iostream _ZNSt8ios_base4InitC1Ev: function() { |