diff --git a/interp/scan.go b/interp/scan.go index a96bcb58..add2ca3b 100644 --- a/interp/scan.go +++ b/interp/scan.go @@ -57,6 +57,9 @@ func (e *Eval) hasSideEffects(fn llvm.Value) *sideEffectResult { case "llvm.dbg.value": return &sideEffectResult{severity: sideEffectNone} } + if fn.IsDeclaration() { + return &sideEffectResult{severity: sideEffectLimited} + } if e.sideEffectFuncs == nil { e.sideEffectFuncs = make(map[llvm.Value]*sideEffectResult) } diff --git a/interp/scan_test.go b/interp/scan_test.go index 226373ce..229b12ec 100644 --- a/interp/scan_test.go +++ b/interp/scan_test.go @@ -21,6 +21,7 @@ var scanTestTable = []struct { {"readCleanGlobal", sideEffectNone, []string{"cleanGlobalInt"}}, {"readDirtyGlobal", sideEffectLimited, []string{"dirtyGlobalInt"}}, {"callFunctionPointer", sideEffectAll, []string{"functionPointer"}}, + {"getDirtyPointer", sideEffectLimited, nil}, } func TestScan(t *testing.T) { diff --git a/interp/testdata/scan.ll b/interp/testdata/scan.ll index 33ae3001..35246419 100644 --- a/interp/testdata/scan.ll +++ b/interp/testdata/scan.ll @@ -45,6 +45,8 @@ define i64 @readDirtyGlobal() { ret i64 %global } +declare i64* @getDirtyPointer() + @functionPointer = global i64()* null define i64 @callFunctionPointer() { %fp = load i64()*, i64()** @functionPointer