aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoralon@honor <none@none>2010-10-08 20:12:01 -0700
committeralon@honor <none@none>2010-10-08 20:12:01 -0700
commit7ae56ec8ee8e7c1166afaa7c7305fd73996c483f (patch)
tree285196ff1d78bf1d1be5dbe57788c0d3249a589f /src
parent8e37aa593df856af80c4186633084a2d01fc995a (diff)
initial support for |extractvalue|
Diffstat (limited to 'src')
-rw-r--r--src/intertyper.js13
-rw-r--r--src/jsifier.js6
-rw-r--r--src/library.js7
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() {