Skip to content

Commit de90cd2

Browse files
aykevlQuLogic
authored andcommitted
interp: better support interface operations
This commit teaches the interp scanner that supported interface operations (type assertions, interface assertions) are supported. This fixes a problem with math/rand in Go 1.14.
1 parent 31bdaac commit de90cd2

File tree

3 files changed

+27
-0
lines changed

3 files changed

+27
-0
lines changed

interp/scan.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ func (e *evalPackage) hasSideEffects(fn llvm.Value) (*sideEffectResult, error) {
5151
return &sideEffectResult{severity: sideEffectNone}, nil
5252
case name == "runtime._panic":
5353
return &sideEffectResult{severity: sideEffectLimited}, nil
54+
case name == "runtime.typeAssert":
55+
return &sideEffectResult{severity: sideEffectNone}, nil
5456
case name == "runtime.interfaceImplements":
5557
return &sideEffectResult{severity: sideEffectNone}, nil
5658
case name == "runtime.sliceCopy":
@@ -118,6 +120,12 @@ func (e *evalPackage) hasSideEffects(fn llvm.Value) (*sideEffectResult, error) {
118120
if child.IsDeclaration() {
119121
// External function call. Assume only limited side effects
120122
// (no affected globals, etc.).
123+
switch child.Name() {
124+
case "runtime.typeAssert":
125+
continue // implemented in interp
126+
case "runtime.interfaceImplements":
127+
continue // implemented in interp
128+
}
121129
if e.hasLocalSideEffects(dirtyLocals, inst) {
122130
result.updateSeverity(sideEffectLimited)
123131
}

interp/scan_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ var scanTestTable = []struct {
2323
{"callFunctionPointer", sideEffectAll, []string{"functionPointer"}},
2424
{"getDirtyPointer", sideEffectLimited, nil},
2525
{"storeToPointer", sideEffectLimited, nil},
26+
{"callTypeAssert", sideEffectNone, nil},
27+
{"callInterfaceImplements", sideEffectNone, nil},
2628
}
2729

2830
func TestScan(t *testing.T) {

interp/testdata/scan.ll

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
22
target triple = "x86_64--linux"
33

4+
%runtime.typecodeID = type { %runtime.typecodeID*, i64 }
5+
6+
declare i1 @runtime.typeAssert(i64, %runtime.typecodeID*, i8*, i8*)
7+
declare i1 @runtime.interfaceImplements(i64, i8**)
8+
49
define i64 @returnsConst() {
510
ret i64 0
611
}
@@ -59,3 +64,15 @@ define i64 @callFunctionPointer() {
5964
%result = call i64 %fp()
6065
ret i64 %result
6166
}
67+
68+
define i1 @callTypeAssert() {
69+
; Note: parameters are not realistic.
70+
%ok = call i1 @runtime.typeAssert(i64 0, %runtime.typecodeID* null, i8* undef, i8* null)
71+
ret i1 %ok
72+
}
73+
74+
define i1 @callInterfaceImplements() {
75+
; Note: parameters are not realistic.
76+
%ok = call i1 @runtime.interfaceImplements(i64 0, i8** null)
77+
ret i1 %ok
78+
}

0 commit comments

Comments
 (0)