aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/intertyper.js18
-rw-r--r--src/jsifier.js2
-rw-r--r--src/parseTools.js15
-rw-r--r--tests/runner.py4
4 files changed, 23 insertions, 16 deletions
diff --git a/src/intertyper.js b/src/intertyper.js
index f9182db4..0d19b3b9 100644
--- a/src/intertyper.js
+++ b/src/intertyper.js
@@ -165,7 +165,8 @@ function intertyper(data) {
if (item.indent === 2 && item.tokens && item.tokens.length >= 3 && findTokenText(item, '=') >= 0 &&
!item.intertype)
return 'Assign';
- if (!item.intertype && item.indent === -1 && item.tokens && item.tokens.length >= 3 && item.tokens[0].text == 'load')
+ 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 && item.tokens.length >= 3 && item.tokens[0].text == 'bitcast')
return 'Bitcast';
@@ -182,8 +183,8 @@ function intertyper(data) {
if (item.indent === -1 && item.tokens && item.tokens.length >= 3 &&
['add', 'sub', 'sdiv', 'mul', 'icmp', 'zext', 'urem', 'srem', 'fadd', 'fsub', 'fmul', 'fdiv', 'fcmp', 'uitofp', 'sitofp', 'fpext', 'fptrunc', 'fptoui', 'fptosi', 'trunc', 'sext', 'select', 'shl', 'shr', 'ashl', 'ashr', 'lshr', 'lshl', 'xor', 'or', 'and', 'ptrtoint', 'inttoptr'].indexOf(item.tokens[0].text) != -1 && !item.intertype)
return 'Mathops';
- if (item.indent === 2 && item.tokens && item.tokens.length >= 5 && item.tokens[0].text == 'store' &&
- !item.intertype)
+ if (item.indent === 2 && item.tokens && item.tokens.length >= 5 &&
+ (item.tokens[0].text == 'store' || item.tokens[1].text == 'store'))
return 'Store';
if (item.indent === 2 && item.tokens && item.tokens.length >= 3 && item.tokens[0].text == 'br' &&
!item.intertype)
@@ -334,13 +335,14 @@ function intertyper(data) {
// 'load'
substrate.addZyme('Load', {
processItem: function(item) {
+ if (item.tokens[0].text == 'volatile') item.tokens.shift(0);
item.pointerType = item.tokens[1];
item.type = { text: removePointing(item.pointerType.text) };
if (item.tokens[2].text == 'getelementptr') {
var last = getTokenIndexByText(item.tokens, ';');
var gepTokens = item.tokens.slice(1, last); // without 'load'
var segment = [ gepTokens[2], gepTokens[0], null ].concat(gepTokens.slice(3));
- var data = parseGetElementPtr(segment);
+ var data = parseFunctionCall(segment);
item.intertype = 'fastgetelementptrload';
item.type = data.type;
item.params = data.params;
@@ -375,10 +377,10 @@ function intertyper(data) {
var first = 0;
while (!isType(item.tokens[first].text)) first++;
var last = getTokenIndexByText(item.tokens, ';');
- var segment = [ item.tokens[first], { text: null }, null, { item: [ {
+ var segment = [ item.tokens[first], { text: 'getelementptr' }, null, { item: [ {
tokens: item.tokens.slice(first, last)
} ] } ];
- var data = parseGetElementPtr(segment);
+ var data = parseFunctionCall(segment);
item.intertype = 'getelementptr';
item.type = data.type;
item.params = data.params;
@@ -489,8 +491,8 @@ function intertyper(data) {
// 'store'
substrate.addZyme('Store', {
processItem: function(item) {
+ if (item.tokens[0].text == 'volatile') item.tokens.shift(0);
if (item.tokens[3].text != ',') {
- assertEq(item.tokens[2].text, 'getelementptr');
// complex input - likely getelementptr
var commaIndex = 4;
while (item.tokens[commaIndex].text != ',') commaIndex ++;
@@ -498,7 +500,7 @@ function intertyper(data) {
__result__: true,
intertype: 'store',
valueType: item.tokens[1],
- value: parseGetElementPtr(item.tokens.slice(1, commaIndex)),
+ value: parseFunctionCall(item.tokens.slice(1, commaIndex)),
pointerType: item.tokens[commaIndex+1],
pointer: item.tokens[commaIndex+2],
ident: item.tokens[commaIndex+2].text,
diff --git a/src/jsifier.js b/src/jsifier.js
index 2501d1e6..f3e1d54e 100644
--- a/src/jsifier.js
+++ b/src/jsifier.js
@@ -114,7 +114,7 @@ function JSify(data) {
} else if (segment[1].text == 'zeroinitializer') {
return JSON.stringify(makeEmptyStruct(segment[0].text));
} else if (segment[1].text == 'getelementptr') {
- return finalizeGetElementPtr(parseGetElementPtr(segment));
+ return finalizeGetElementPtr(parseFunctionCall(segment));
} else if (segment[1].text in searchable('bitcast', 'inttoptr', 'ptrtoint')) {
var type = segment[2].item[0].tokens.slice(-1)[0].text; // TODO: Use this?
return handleSegment(segment[2].item[0].tokens.slice(0, -2));
diff --git a/src/parseTools.js b/src/parseTools.js
index 8cbf0166..a2bb56ac 100644
--- a/src/parseTools.js
+++ b/src/parseTools.js
@@ -242,7 +242,7 @@ function parseParamTokens(params) {
});
}
} else if (segment[1].text === 'getelementptr') {
- ret.push(parseGetElementPtr(segment));
+ ret.push(parseFunctionCall(segment));
} else if (segment[1].text === 'bitcast') {
ret.push(parseBitcast(segment));
} else {
@@ -275,16 +275,17 @@ function cleanSegment(segment) {
return segment;
}
-// Expects one of the several LVM getelementptr formats:
-// a qualifier, a type, a null, then an () item with tokens
-function parseGetElementPtr(segment) {
-//print("Parse GTP: " + dump(segment));
+// Parses a function call of form
+// TYPE functionname MODIFIERS (...)
+// e.g.
+// i32* getelementptr inbounds (...)
+function parseFunctionCall(segment) {
+//print("Parse functioncall: " + dump(segment));
segment = segment.slice(0);
segment = cleanSegment(segment);
assertTrue(['inreg', 'byval'].indexOf(segment[1].text) == -1);
- //dprint('// zz: ' + dump(segment) + '\n\n\n');
var ret = {
- intertype: 'getelementptr',
+ intertype: segment[1].text,
type: segment[0],
params: parseParamTokens(segment[3].item[0].tokens),
};
diff --git a/tests/runner.py b/tests/runner.py
index 1e45e7c7..49b390fd 100644
--- a/tests/runner.py
+++ b/tests/runner.py
@@ -750,6 +750,10 @@ class T(unittest.TestCase):
output = open(path_from_root(['tests', 'raytrace.ppm']), 'r').read()
self.do_test(src, output, ['1'])
+ def zzztest_dlmalloc(self):
+ src = open(path_from_root(['tests', 'dlmalloc.c']), 'r').read()
+ self.do_test(src, 'malloced', ['1'])
+
def test_fasta(self):
results = [ (1,'''GG*ctt**tgagc*'''), (20,'''GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTT*cttBtatcatatgctaKggNcataaaSatgtaaaDcDRtBggDtctttataattcBgtcg**tacgtgtagcctagtgtttgtgttgcgttatagtctatttgtggacacagtatggtcaaa**tgacgtcttttgatctgacggcgttaacaaagatactctg*'''),
(50,'''GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGA*TCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACAT*cttBtatcatatgctaKggNcataaaSatgtaaaDcDRtBggDtctttataattcBgtcg**tactDtDagcctatttSVHtHttKtgtHMaSattgWaHKHttttagacatWatgtRgaaa**NtactMcSMtYtcMgRtacttctWBacgaa**agatactctgggcaacacacatacttctctcatgttgtttcttcggacctttcataacct**ttcctggcacatggttagctgcacatcacaggattgtaagggtctagtggttcagtgagc**ggaatatcattcgtcggtggtgttaatctatctcggtgtagcttataaatgcatccgtaa**gaatattatgtttatttgtcggtacgttcatggtagtggtgtcgccgatttagacgtaaa**ggcatgtatg*''') ]