Skip to content

Commit de0138a

Browse files
committed
Parse new LLVM debug info instructions.
1 parent e36b0d9 commit de0138a

File tree

10 files changed

+329
-120
lines changed

10 files changed

+329
-120
lines changed

sulong/projects/com.oracle.truffle.llvm.parser/src/com/oracle/truffle/llvm/parser/listeners/Function.java

Lines changed: 49 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,20 @@
2929
*/
3030
package com.oracle.truffle.llvm.parser.listeners;
3131

32+
import java.util.ArrayDeque;
33+
import java.util.ArrayList;
34+
import java.util.Arrays;
35+
import java.util.List;
36+
3237
import com.oracle.truffle.llvm.parser.metadata.MDBaseNode;
38+
import com.oracle.truffle.llvm.parser.metadata.MDExpression;
3339
import com.oracle.truffle.llvm.parser.metadata.MDKind;
40+
import com.oracle.truffle.llvm.parser.metadata.MDLocalVariable;
3441
import com.oracle.truffle.llvm.parser.metadata.MDLocation;
3542
import com.oracle.truffle.llvm.parser.metadata.MDSubprogram;
3643
import com.oracle.truffle.llvm.parser.metadata.MDValue;
3744
import com.oracle.truffle.llvm.parser.model.IRScope;
45+
import com.oracle.truffle.llvm.parser.model.SymbolImpl;
3846
import com.oracle.truffle.llvm.parser.model.attributes.AttributesCodeEntry;
3947
import com.oracle.truffle.llvm.parser.model.blocks.InstructionBlock;
4048
import com.oracle.truffle.llvm.parser.model.functions.FunctionDefinition;
@@ -51,6 +59,8 @@
5159
import com.oracle.truffle.llvm.parser.model.symbols.instructions.CompareExchangeInstruction;
5260
import com.oracle.truffle.llvm.parser.model.symbols.instructions.CompareInstruction;
5361
import com.oracle.truffle.llvm.parser.model.symbols.instructions.ConditionalBranchInstruction;
62+
import com.oracle.truffle.llvm.parser.model.symbols.instructions.DebugInstruction;
63+
import com.oracle.truffle.llvm.parser.model.symbols.instructions.DebugInstruction.DebugInstructionKind;
5464
import com.oracle.truffle.llvm.parser.model.symbols.instructions.ExtractElementInstruction;
5565
import com.oracle.truffle.llvm.parser.model.symbols.instructions.ExtractValueInstruction;
5666
import com.oracle.truffle.llvm.parser.model.symbols.instructions.FenceInstruction;
@@ -93,11 +103,6 @@
93103
import com.oracle.truffle.llvm.runtime.types.VectorType;
94104
import com.oracle.truffle.llvm.runtime.types.VoidType;
95105

96-
import java.util.ArrayDeque;
97-
import java.util.ArrayList;
98-
import java.util.Arrays;
99-
import java.util.List;
100-
101106
public final class Function implements ParserListener {
102107

103108
// See https://github.com/llvm/llvm-project/blob/main/llvm/include/llvm/Bitcode/LLVMBitCodes.h
@@ -252,12 +257,19 @@ public void record(RecordBuffer buffer) {
252257
// since we consume only bitcode after linking, it's safe to ignore
253258
return;
254259

260+
case INSTRUCTION_DEBUG_RECORD_ASSIGN:
261+
// https://llvm.org/docs/AssignmentTracking.html
262+
// not used by Sulong
263+
// parseDebugInstruction(opCode, buffer);
264+
return;
265+
255266
case INSTRUCTION_DEBUG_RECORD_VALUE:
256267
case INSTRUCTION_DEBUG_RECORD_DECLARE:
257-
case INSTRUCTION_DEBUG_RECORD_ASSIGN:
258268
case INSTRUCTION_DEBUG_RECORD_VALUE_SIMPLE:
269+
parseDebugInstruction(opCode, buffer);
270+
return;
271+
259272
case INSTRUCTION_DEBUG_RECORD_LABEL:
260-
// TODO parse debug info
261273
return;
262274

263275
default:
@@ -467,6 +479,10 @@ private void emit(VoidInstruction instruction) {
467479
scope.addInstruction(instruction);
468480
}
469481

482+
private void emitDebug(DebugInstruction instruction) {
483+
instructionBlock.addDebug(instruction);
484+
}
485+
470486
private static final int INVOKE_HASEXPLICITFUNCTIONTYPE_SHIFT = 13;
471487

472488
private void attachOperandBundle(RecordBuffer buffer) {
@@ -851,6 +867,32 @@ private void applyDebugLocation() {
851867
instructionBlock.getInstruction(lastInstructionIndex).setDebugLocation(lastLocation);
852868
}
853869

870+
private void parseDebugInstruction(int opCode, RecordBuffer buffer) {
871+
MDLocation dil = (MDLocation) scope.getMetadata().getOrNull(buffer.readInt());
872+
MDLocalVariable variable = (MDLocalVariable) scope.getMetadata().getOrNull(buffer.readInt());
873+
MDExpression expression = (MDExpression) scope.getMetadata().getOrNull(buffer.readInt());
874+
875+
MDBaseNode value;
876+
if (opCode == INSTRUCTION_DEBUG_RECORD_VALUE_SIMPLE) {
877+
// this is never forward referenced, see comment and assert in BitcodeReader.cpp:6517
878+
int index = readIndexSkipType(buffer);
879+
SymbolImpl symbol = scope.getSymbols().getOrNull(index);
880+
value = MDValue.create(symbol);
881+
} else {
882+
value = scope.getMetadata().getOrNull(buffer.readInt());
883+
}
884+
885+
switch (opCode) {
886+
case INSTRUCTION_DEBUG_RECORD_DECLARE:
887+
emitDebug(new DebugInstruction(DebugInstructionKind.DECLARE, dil, variable, expression, value));
888+
break;
889+
case INSTRUCTION_DEBUG_RECORD_VALUE:
890+
case INSTRUCTION_DEBUG_RECORD_VALUE_SIMPLE:
891+
emitDebug(new DebugInstruction(DebugInstructionKind.VALUE, dil, variable, expression, value));
892+
break;
893+
}
894+
}
895+
854896
private void createAtomicStore(RecordBuffer buffer) {
855897
int destination = readIndexSkipType(buffer);
856898
int source = readIndexSkipType(buffer);

0 commit comments

Comments
 (0)