From f967c6919ad165c9ebd412d00b04a02208a17151 Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Wed, 10 Apr 2019 16:42:44 +0200 Subject: [PATCH] interp: fix segmentation fault in some builds A call to .IsConstant() also returns true for constant globals, not just constant expressions. Do an extra check that we're really operating on a constant expression. --- interp/frame.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interp/frame.go b/interp/frame.go index 6e8958ef..f587589a 100644 --- a/interp/frame.go +++ b/interp/frame.go @@ -95,7 +95,7 @@ func (fr *frame) evalBasicBlock(bb, incoming llvm.BasicBlock, indent string) (re case !inst.IsALoadInst().IsNil(): operand := fr.getLocal(inst.Operand(0)).(*LocalValue) var value llvm.Value - if !operand.IsConstant() || inst.IsVolatile() || operand.Underlying.Opcode() == llvm.BitCast { + if !operand.IsConstant() || inst.IsVolatile() || (!operand.Underlying.IsAConstantExpr().IsNil() && operand.Underlying.Opcode() == llvm.BitCast) { value = fr.builder.CreateLoad(operand.Value(), inst.Name()) } else { value = operand.Load()