diff options
author | alon@honor <none@none> | 2010-09-27 18:01:52 -0700 |
---|---|---|
committer | alon@honor <none@none> | 2010-09-27 18:01:52 -0700 |
commit | 03c175f81ddb6aeac0295193baeddc12fc692ef8 (patch) | |
tree | 691c30561298c7880d5f3c03d1dd4399dfd7f05d /src | |
parent | f01feb071941d8bb83a9c1ca629d531a1d0ba627 (diff) |
cleanup parseGetElementPtr and ignore 'volatile'
Diffstat (limited to 'src')
-rw-r--r-- | src/intertyper.js | 18 | ||||
-rw-r--r-- | src/jsifier.js | 2 | ||||
-rw-r--r-- | src/parseTools.js | 15 |
3 files changed, 19 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), }; |