Skip to content

Commit bcdfcfb

Browse files
committed
remove obsolete fastops; generalize load with parseLLVM/finalizeLLVM; fix issue 14
1 parent 77cacaa commit bcdfcfb

File tree

4 files changed

+42
-39
lines changed

4 files changed

+42
-39
lines changed

src/analyzer.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -258,12 +258,12 @@ function analyzer(data) {
258258

259259
// Normal variables
260260
func.lines.forEach(function(item) {
261-
if (item.intertype in set('assign', 'fastgetelementptrload')) {
261+
if (item.intertype === 'assign') {
262262
if (!item.value.tokens.slice(-1)[0].item) throw 'Did you run llvm-dis with -show-annotations?';
263263
func.variables[item.ident] = {
264264
ident: item.ident,
265265
type: item.value.type,
266-
origin: item.intertype === 'assign' ? item.value.intertype : 'fastgetelementptrload',
266+
origin: item.value.intertype,
267267
lineNum: item.lineNum,
268268
uses: parseInt(item.value.tokens.slice(-1)[0].item.tokens[0].text.split('=')[1])
269269
};
@@ -314,8 +314,7 @@ function analyzer(data) {
314314
//print(dump(line))
315315
if (line.intertype == 'store' && line.ident == vname) {
316316
variable.stores ++;
317-
} else if ((line.intertype == 'assign' && line.value.intertype == 'load' && line.value.ident == vname) ||
318-
(line.intertype == 'fastgetelementptrload' && line.ident == vname)) {
317+
} else if (line.intertype == 'assign' && line.value.intertype == 'load' && line.value.ident == vname) {
319318
variable.loads ++;
320319
}
321320
});

src/intertyper.js

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -494,38 +494,20 @@ function intertyper(data, parseFunctions, baseLineNum) {
494494
});
495495

496496
substrate.addActor('Reintegrator', makeReintegrator(function(parent, child) {
497-
// Special re-integration behaviors
498-
if (child.intertype == 'fastgetelementptrload') {
499-
parent.intertype = 'fastgetelementptrload';
500-
}
501497
this.forwardItem(parent, '/dev/stdout');
502498
}));
503499

504500
// 'load'
505501
substrate.addActor('Load', {
506502
processItem: function(item) {
503+
item.intertype = 'load';
507504
if (item.tokens[0].text == 'volatile') item.tokens.shift(0);
508505
item.pointerType = item.tokens[1].text;
509506
item.valueType = item.type = removePointing(item.pointerType);
510507
Types.needAnalysis[item.type] = 0;
511-
if (item.tokens[2].text == 'getelementptr') {
512-
var last = getTokenIndexByText(item.tokens, ';');
513-
var data = parseLLVMFunctionCall(item.tokens.slice(1, last));
514-
item.intertype = 'fastgetelementptrload';
515-
item.type = data.type;
516-
item.params = data.params;
517-
item.pointer = data.ident;
518-
item.value = data.value;
519-
} else {
520-
item.intertype = 'load';
521-
if (item.tokens[2].text == 'bitcast') {
522-
item.pointer = item.tokens[3].item.tokens[1].text;
523-
item.originalType = item.tokens[3].item.tokens[0].text;
524-
} else {
525-
item.pointer = item.tokens[2].text;
526-
}
527-
}
528-
item.ident = toNiceIdent(item.pointer);
508+
var last = getTokenIndexByText(item.tokens, ';');
509+
item.pointer = parseLLVMSegment(item.tokens.slice(1, last)); // TODO: Use this everywhere else too
510+
item.ident = item.pointer.ident || null;
529511
this.forwardItem(item, 'Reintegrator');
530512
}
531513
});

src/jsifier.js

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -632,13 +632,13 @@ function JSify(data, functionsOnly, givenFunctions, givenGlobalVariables) {
632632
return ret;
633633
});
634634
makeFuncLineActor('load', function(item) {
635-
var ident = toNiceIdent(item.ident);
636-
var impl = getVarImpl(item.funcData, item.ident);
635+
var value = finalizeLLVMParameter(item.pointer);
636+
var impl = item.ident ? getVarImpl(item.funcData, item.ident) : VAR_EMULATED;
637637
switch (impl) {
638638
case VAR_NATIVIZED: {
639-
return ident; // We have the actual value here
639+
return value; // We have the actual value here
640640
}
641-
case VAR_EMULATED: return makeGetValue(ident, null, item.type);
641+
case VAR_EMULATED: return makeGetValue(value, null, item.type);
642642
default: throw "unknown [load] impl: " + impl;
643643
}
644644
});
@@ -722,15 +722,6 @@ function JSify(data, functionsOnly, givenFunctions, givenGlobalVariables) {
722722
return makeFunctionCall(item.ident, item.params, item.funcData) + (item.standalone ? ';' : '');
723723
});
724724

725-
// Optimized intertypes
726-
727-
makeFuncLineActor('fastgetelementptrload', function(item) {
728-
return 'var ' + item.ident + '=' + makeGetValue(parseNumerical(item.value.ident), getGetElementPtrIndexes(item.value), item.value.valueType, true) + ';';
729-
});
730-
makeFuncLineActor('fastgetelementptrstore', function(item) {
731-
return makeSetValue(item.value.ident, getGetElementPtrIndexes(item.value), parseNumerical(item.ident), item.type, true) + ';';
732-
});
733-
734725
makeFuncLineActor('unreachable', function(item) { return 'throw "Reached an unreachable! Original .ll line: ' + item.lineNum + '";' });
735726

736727
// Final combiner

tests/cases/loadbitcastgep.ll

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
; ModuleID = '/dev/shm/tmp/src.cpp.o'
2+
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-f128:128:128-n8:16:32"
3+
target triple = "i386-pc-linux-gnu"
4+
5+
%struct.CPU_Regs = type { [8 x %union.GenReg32] }
6+
%union.GenReg32 = type { [1 x i32] }
7+
8+
@cpu_regs = unnamed_addr global %struct.CPU_Regs zeroinitializer, align 32 ; [#uses=2]
9+
@.str = private unnamed_addr constant [14 x i8] c"hello, world!\00", align 1 ; [#uses=1]
10+
11+
; [#uses=0]
12+
define i32 @main() {
13+
entry:
14+
%retval = alloca i32 ; [#uses=2]
15+
%0 = alloca i32 ; [#uses=2]
16+
%"alloca point" = bitcast i32 0 to i32 ; [#uses=0]
17+
%1 = load i16* bitcast (i32* getelementptr inbounds (%struct.CPU_Regs* @cpu_regs, i32 0, i32 0, i32 1, i32 0, i32 0) to i16*), align 2 ; [#uses=1]
18+
store i16 %1, i16* bitcast (%struct.CPU_Regs* @cpu_regs to i16*), align 2
19+
%2 = call i32 @puts(i8* getelementptr inbounds ([14 x i8]* @.str, i32 0, i32 0)) ; [#uses=0]
20+
store i32 0, i32* %0, align 4
21+
%3 = load i32* %0, align 4 ; [#uses=1]
22+
store i32 %3, i32* %retval, align 4
23+
br label %return
24+
25+
return: ; preds = %entry
26+
%retval1 = load i32* %retval ; [#uses=1]
27+
ret i32 %retval1
28+
}
29+
30+
; [#uses=1]
31+
declare i32 @puts(i8*)

0 commit comments

Comments
 (0)