From a41321a5f59cf04367e83c22911353f8d3bdf77f Mon Sep 17 00:00:00 2001 From: Thomas Haas Date: Sat, 5 Aug 2023 11:04:08 +0200 Subject: [PATCH] Moved "inlineAsm" rule in LLVM grammar from value to call. Updated VisitorLlvm to skip all inline assembly calls. --- dartagnan/src/main/antlr4/LLVMIR.g4 | 7 ++----- .../parsers/program/visitors/VisitorLlvm.java | 20 ++++++++++--------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/dartagnan/src/main/antlr4/LLVMIR.g4 b/dartagnan/src/main/antlr4/LLVMIR.g4 index e1b90f4b96..43718fa1e8 100644 --- a/dartagnan/src/main/antlr4/LLVMIR.g4 +++ b/dartagnan/src/main/antlr4/LLVMIR.g4 @@ -304,10 +304,7 @@ typeValue: firstClassType value; value: constant // %42 %foo - | LocalIdent - // TODO: Move InlineAsm from Value to Callee and Invokee? Inline assembler expressions may only - // be used as the callee operand of a call or an invoke instruction. - | inlineAsm; + | LocalIdent; inlineAsm: 'asm' sideEffect = 'sideeffect'? alignStackTok = 'alignstack'? intelDialect = 'inteldialect'? unwind = 'unwind'? StringLit ',' StringLit; @@ -705,7 +702,7 @@ selectInst: freezeInst: 'freeze' typeValue; callInst: tail = ('musttail' | 'notail' | 'tail')? 'call' fastMathFlag* callingConv? returnAttribute* - addrSpace? type value '(' args ')' funcAttribute* ( + addrSpace? type (inlineAsm | value) '(' args ')' funcAttribute* ( '[' operandBundle (',' operandBundle)* ']' )? (',' metadataAttachment)*; vaargInst: diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java index c4938aa716..553729ca28 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java @@ -7,12 +7,7 @@ import com.dat3m.dartagnan.expression.IConst; import com.dat3m.dartagnan.expression.INonDet; import com.dat3m.dartagnan.expression.op.IOpBin; -import com.dat3m.dartagnan.expression.type.AggregateType; -import com.dat3m.dartagnan.expression.type.FunctionType; -import com.dat3m.dartagnan.expression.type.IntegerType; -import com.dat3m.dartagnan.expression.type.Type; -import com.dat3m.dartagnan.expression.type.TypeFactory; -import com.dat3m.dartagnan.expression.type.VoidType; +import com.dat3m.dartagnan.expression.type.*; import com.dat3m.dartagnan.parsers.LLVMIRBaseVisitor; import com.dat3m.dartagnan.parsers.LLVMIRParser.*; import com.dat3m.dartagnan.parsers.program.utils.ProgramBuilder; @@ -20,7 +15,8 @@ import com.dat3m.dartagnan.program.Program; import com.dat3m.dartagnan.program.Register; import com.dat3m.dartagnan.program.event.Tag; -import com.dat3m.dartagnan.program.event.core.*; +import com.dat3m.dartagnan.program.event.core.Event; +import com.dat3m.dartagnan.program.event.core.Label; import com.dat3m.dartagnan.program.memory.Memory; import com.dat3m.dartagnan.program.memory.MemoryObject; import com.dat3m.dartagnan.program.processing.GEPToAddition; @@ -28,7 +24,10 @@ import org.antlr.v4.runtime.tree.TerminalNode; import java.math.BigInteger; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import static com.dat3m.dartagnan.program.event.EventFactory.*; import static com.dat3m.dartagnan.program.event.EventFactory.Llvm.newCompareExchange; @@ -271,6 +270,10 @@ public Expression visitCondBrTerm(CondBrTermContext ctx) { @Override public Expression visitCallInst(CallInstContext ctx) { final Type returnType = parseType(ctx.type()); + if (ctx.inlineAsm() != null) { + // FIXME: We ignore all inline assembly. + return null; + } final Expression callTarget = checkPointerExpression(ctx.value()); if (callTarget == null) { //FIXME ignores metadata functions, but also undeclared functions @@ -694,7 +697,6 @@ public Expression visitValue(ValueContext ctx) { if (ctx.constant() != null) { return visitConstant(ctx.constant()); } - checkSupport(ctx.inlineAsm() == null, "Assembly values in %s.", ctx); assert expectedType != null : "No expected type."; final String id = localIdent(ctx.LocalIdent()); return getOrNewRegister(id, expectedType);