From 888ca4ab0cf200069b5457f08549bd580703dd1c Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Fri, 24 Jul 2020 13:10:31 +0200 Subject: [PATCH] interp: fix sync/atomic.Value load/store methods These methods do some unsafe pointer casting but can be assumed to not have significant side effects. Simply call these functions at runtime instead of compile time. This is a partial fix for importing image/png. --- interp/scan.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/interp/scan.go b/interp/scan.go index d8c764d8..da06169a 100644 --- a/interp/scan.go +++ b/interp/scan.go @@ -62,6 +62,10 @@ func (e *evalPackage) hasSideEffects(fn llvm.Value) (*sideEffectResult, *Error) return &sideEffectResult{severity: sideEffectNone}, nil case name == "llvm.dbg.value": return &sideEffectResult{severity: sideEffectNone}, nil + case name == "(*sync/atomic.Value).Load" || name == "(*sync/atomic.Value).Store": + // These functions do some unsafe pointer loading/storing but are + // otherwise safe. + return &sideEffectResult{severity: sideEffectLimited}, nil case strings.HasPrefix(name, "llvm.lifetime."): return &sideEffectResult{severity: sideEffectNone}, nil }