// Copyright 2013 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package pointer

// This package defines the treatment of intrinsics, i.e. library
// functions requiring special analytical treatment.
//
// Most of these are C or assembly functions, but even some Go
// functions require may special treatment if the analysis completely
// replaces the implementation of an API such as reflection.

// TODO(adonovan): support a means of writing analytic summaries in
// the target code, so that users can summarise the effects of their
// own C functions using a snippet of Go.

import (
	"fmt"
	"go/types"

	"golang.org/x/tools/go/ssa"
)

// Instances of 'intrinsic' generate analysis constraints for calls to
// intrinsic functions.
// Implementations may exploit information from the calling site
// via cgn.callersite; for shared contours this is nil.
type intrinsic func(a *analysis, cgn *cgnode)

// Initialized in explicit init() to defeat (spurious) initialization
// cycle error.
var intrinsicsByName = make(map[string]intrinsic)

func init() {
	// Key strings are from Function.String().
	// That little dot ۰ is an Arabic zero numeral (U+06F0),
	// categories [Nd].
	for name, fn := range map[string]intrinsic{
		// Other packages.
		"bytes.Equal":                  ext۰NoEffect,
		"bytes.IndexByte":              ext۰NoEffect,
		"crypto/aes.decryptBlockAsm":   ext۰NoEffect,
		"crypto/aes.encryptBlockAsm":   ext۰NoEffect,
		"crypto/aes.expandKeyAsm":      ext۰NoEffect,
		"crypto/aes.hasAsm":            ext۰NoEffect,
		"crypto/md5.block":             ext۰NoEffect,
		"crypto/rc4.xorKeyStream":      ext۰NoEffect,
		"crypto/sha1.block":            ext۰NoEffect,
		"crypto/sha256.block":          ext۰NoEffect,
		"hash/crc32.castagnoliSSE42":   ext۰NoEffect,
		"hash/crc32.haveSSE42":         ext۰NoEffect,
		"math.Abs":                     ext۰NoEffect,
		"math.Acos":                    ext۰NoEffect,
		"math.Asin":                    ext۰NoEffect,
		"math.Atan":                    ext۰NoEffect,
		"math.Atan2":                   ext۰NoEffect,
		"math.Ceil":                    ext۰NoEffect,
		"math.Cos":                     ext۰NoEffect,
		"math.Dim":                     ext۰NoEffect,
		"math.Exp":                     ext۰NoEffect,
		"math.Exp2":                    ext۰NoEffect,
		"math.Expm1":                   ext۰NoEffect,
		"math.Float32bits":             ext۰NoEffect,
		"math.Float32frombits":         ext۰NoEffect,
		"math.Float64bits":             ext۰NoEffect,
		"math.Float64frombits":         ext۰NoEffect,
		"math.Floor":                   ext۰NoEffect,
		"math.Frexp":                   ext۰NoEffect,
		"math.Hypot":                   ext۰NoEffect,
		"math.Ldexp":                   ext۰NoEffect,
		"math.Log":                     ext۰NoEffect,
		"math.Log10":                   ext۰NoEffect,
		"math.Log1p":                   ext۰NoEffect,
		"math.Log2":                    ext۰NoEffect,
		"math.Max":                     ext۰NoEffect,
		"math.Min":                     ext۰NoEffect,
		"math.Mod":                     ext۰NoEffect,
		"math.Modf":                    ext۰NoEffect,
		"math.Remainder":               ext۰NoEffect,
		"math.Sin":                     ext۰NoEffect,
		"math.Sincos":                  ext۰NoEffect,
		"math.Sqrt":                    ext۰NoEffect,
		"math.Tan":                     ext۰NoEffect,
		"math.Trunc":                   ext۰NoEffect,
		"math/big.addMulVVW":           ext۰NoEffect,
		"math/big.addVV":               ext۰NoEffect,
		"math/big.addVW":               ext۰NoEffect,
		"math/big.bitLen":              ext۰NoEffect,
		"math/big.divWVW":              ext۰NoEffect,
		"math/big.divWW":               ext۰NoEffect,
		"math/big.mulAddVWW":           ext۰NoEffect,
		"math/big.mulWW":               ext۰NoEffect,
		"math/big.shlVU":               ext۰NoEffect,
		"math/big.shrVU":               ext۰NoEffect,
		"math/big.subVV":               ext۰NoEffect,
		"math/big.subVW":               ext۰NoEffect,
		"net.runtime_Semacquire":       ext۰NoEffect,
		"net.runtime_Semrelease":       ext۰NoEffect,
		"net.runtime_pollClose":        ext۰NoEffect,
		"net.runtime_pollOpen":         ext۰NoEffect,
		"net.runtime_pollReset":        ext۰NoEffect,
		"net.runtime_pollServerInit":   ext۰NoEffect,
		"net.runtime_pollSetDeadline":  ext۰NoEffect,
		"net.runtime_pollUnblock":      ext۰NoEffect,
		"net.runtime_pollWait":         ext۰NoEffect,
		"net.runtime_pollWaitCanceled": ext۰NoEffect,
		"os.epipecheck":                ext۰NoEffect,
		// All other runtime functions are treated as NoEffect.
		"runtime.SetFinalizer":              ext۰runtime۰SetFinalizer,
		"strings.IndexByte":                 ext۰NoEffect,
		"sync.runtime_Semacquire":           ext۰NoEffect,
		"sync.runtime_Semrelease":           ext۰NoEffect,
		"sync.runtime_Syncsemacquire":       ext۰NoEffect,
		"sync.runtime_Syncsemcheck":         ext۰NoEffect,
		"sync.runtime_Syncsemrelease":       ext۰NoEffect,
		"sync.runtime_procPin":              ext۰NoEffect,
		"sync.runtime_procUnpin":            ext۰NoEffect,
		"sync.runtime_registerPool":         ext۰NoEffect,
		"sync/atomic.AddInt32":              ext۰NoEffect,
		"sync/atomic.AddInt64":              ext۰NoEffect,
		"sync/atomic.AddUint32":             ext۰NoEffect,
		"sync/atomic.AddUint64":             ext۰NoEffect,
		"sync/atomic.AddUintptr":            ext۰NoEffect,
		"sync/atomic.CompareAndSwapInt32":   ext۰NoEffect,
		"sync/atomic.CompareAndSwapUint32":  ext۰NoEffect,
		"sync/atomic.CompareAndSwapUint64":  ext۰NoEffect,
		"sync/atomic.CompareAndSwapUintptr": ext۰NoEffect,
		"sync/atomic.LoadInt32":             ext۰NoEffect,
		"sync/atomic.LoadInt64":             ext۰NoEffect,
		"sync/atomic.LoadPointer":           ext۰NoEffect, // ignore unsafe.Pointers
		"sync/atomic.LoadUint32":            ext۰NoEffect,
		"sync/atomic.LoadUint64":            ext۰NoEffect,
		"sync/atomic.LoadUintptr":           ext۰NoEffect,
		"sync/atomic.StoreInt32":            ext۰NoEffect,
		"sync/atomic.StorePointer":          ext۰NoEffect, // ignore unsafe.Pointers
		"sync/atomic.StoreUint32":           ext۰NoEffect,
		"sync/atomic.StoreUintptr":          ext۰NoEffect,
		"syscall.Close":                     ext۰NoEffect,
		"syscall.Exit":                      ext۰NoEffect,
		"syscall.Getpid":                    ext۰NoEffect,
		"syscall.Getwd":                     ext۰NoEffect,
		"syscall.Kill":                      ext۰NoEffect,
		"syscall.RawSyscall":                ext۰NoEffect,
		"syscall.RawSyscall6":               ext۰NoEffect,
		"syscall.Syscall":                   ext۰NoEffect,
		"syscall.Syscall6":                  ext۰NoEffect,
		"syscall.runtime_AfterFork":         ext۰NoEffect,
		"syscall.runtime_BeforeFork":        ext۰NoEffect,
		"syscall.setenv_c":                  ext۰NoEffect,
		"time.Sleep":                        ext۰NoEffect,
		"time.now":                          ext۰NoEffect,
		"time.startTimer":                   ext۰time۰startTimer,
		"time.stopTimer":                    ext۰NoEffect,
	} {
		intrinsicsByName[name] = fn
	}
}

// findIntrinsic returns the constraint generation function for an
// intrinsic function fn, or nil if the function should be handled normally.
//
func (a *analysis) findIntrinsic(fn *ssa.Function) intrinsic {
	// Consult the *Function-keyed cache.
	// A cached nil indicates a normal non-intrinsic function.
	impl, ok := a.intrinsics[fn]
	if !ok {
		impl = intrinsicsByName[fn.String()] // may be nil

		if a.isReflect(fn) {
			if !a.config.Reflection {
				impl = ext۰NoEffect // reflection disabled
			} else if impl == nil {
				// Ensure all "reflect" code is treated intrinsically.
				impl = ext۰NotYetImplemented
			}
		} else if impl == nil && fn.Pkg != nil && fn.Pkg.Pkg.Path() == "runtime" {
			// Ignore "runtime" (except SetFinalizer):
			// it has few interesting effects on aliasing
			// and is full of unsafe code we can't analyze.
			impl = ext۰NoEffect
		}

		a.intrinsics[fn] = impl
	}
	return impl
}

// isReflect reports whether fn belongs to the "reflect" package.
func (a *analysis) isReflect(fn *ssa.Function) bool {
	if a.reflectValueObj == nil {
		return false // "reflect" package not loaded
	}
	reflectPackage := a.reflectValueObj.Pkg()
	if fn.Pkg != nil && fn.Pkg.Pkg == reflectPackage {
		return true
	}
	// Synthetic wrappers have a nil Pkg, so they slip through the
	// previous check.  Check the receiver package.
	// TODO(adonovan): should synthetic wrappers have a non-nil Pkg?
	if recv := fn.Signature.Recv(); recv != nil {
		if named, ok := deref(recv.Type()).(*types.Named); ok {
			if named.Obj().Pkg() == reflectPackage {
				return true // e.g. wrapper of (reflect.Value).f
			}
		}
	}
	return false
}

// A trivial intrinsic suitable for any function that does not:
// 1) induce aliases between its arguments or any global variables;
// 2) call any functions; or
// 3) create any labels.
//
// Many intrinsics (such as CompareAndSwapInt32) have a fourth kind of
// effect: loading or storing through a pointer.  Though these could
// be significant, we deliberately ignore them because they are
// generally not worth the effort.
//
// We sometimes violate condition #3 if the function creates only
// non-function labels, as the control-flow graph is still sound.
//
func ext۰NoEffect(a *analysis, cgn *cgnode) {}

func ext۰NotYetImplemented(a *analysis, cgn *cgnode) {
	fn := cgn.fn
	a.warnf(fn.Pos(), "unsound: intrinsic treatment of %s not yet implemented", fn)
}

// ---------- func runtime.SetFinalizer(x, f interface{}) ----------

// runtime.SetFinalizer(x, f)
type runtimeSetFinalizerConstraint struct {
	targets nodeid // (indirect)
	f       nodeid // (ptr)
	x       nodeid
}

func (c *runtimeSetFinalizerConstraint) ptr() nodeid { return c.f }
func (c *runtimeSetFinalizerConstraint) presolve(h *hvn) {
	h.markIndirect(onodeid(c.targets), "SetFinalizer.targets")
}
func (c *runtimeSetFinalizerConstraint) renumber(mapping []nodeid) {
	c.targets = mapping[c.targets]
	c.f = mapping[c.f]
	c.x = mapping[c.x]
}

func (c *runtimeSetFinalizerConstraint) String() string {
	return fmt.Sprintf("runtime.SetFinalizer(n%d, n%d)", c.x, c.f)
}

func (c *runtimeSetFinalizerConstraint) solve(a *analysis, delta *nodeset) {
	for _, fObj := range delta.AppendTo(a.deltaSpace) {
		tDyn, f, indirect := a.taggedValue(nodeid(fObj))
		if indirect {
			// TODO(adonovan): we'll need to implement this
			// when we start creating indirect tagged objects.
			panic("indirect tagged object")
		}

		tSig, ok := tDyn.Underlying().(*types.Signature)
		if !ok {
			continue // not a function
		}
		if tSig.Recv() != nil {
			panic(tSig)
		}
		if tSig.Params().Len() != 1 {
			continue //  not a unary function
		}

		// Extract x to tmp.
		tx := tSig.Params().At(0).Type()
		tmp := a.addNodes(tx, "SetFinalizer.tmp")
		a.typeAssert(tx, tmp, c.x, false)

		// Call f(tmp).
		a.store(f, tmp, 1, a.sizeof(tx))

		// Add dynamic call target.
		if a.onlineCopy(c.targets, f) {
			a.addWork(c.targets)
		}
	}
}

func ext۰runtime۰SetFinalizer(a *analysis, cgn *cgnode) {
	// This is the shared contour, used for dynamic calls.
	targets := a.addOneNode(tInvalid, "SetFinalizer.targets", nil)
	cgn.sites = append(cgn.sites, &callsite{targets: targets})
	params := a.funcParams(cgn.obj)
	a.addConstraint(&runtimeSetFinalizerConstraint{
		targets: targets,
		x:       params,
		f:       params + 1,
	})
}

// ---------- func time.startTimer(t *runtimeTimer) ----------

// time.StartTimer(t)
type timeStartTimerConstraint struct {
	targets nodeid // (indirect)
	t       nodeid // (ptr)
}

func (c *timeStartTimerConstraint) ptr() nodeid { return c.t }
func (c *timeStartTimerConstraint) presolve(h *hvn) {
	h.markIndirect(onodeid(c.targets), "StartTimer.targets")
}
func (c *timeStartTimerConstraint) renumber(mapping []nodeid) {
	c.targets = mapping[c.targets]
	c.t = mapping[c.t]
}

func (c *timeStartTimerConstraint) String() string {
	return fmt.Sprintf("time.startTimer(n%d)", c.t)
}

func (c *timeStartTimerConstraint) solve(a *analysis, delta *nodeset) {
	for _, tObj := range delta.AppendTo(a.deltaSpace) {
		t := nodeid(tObj)

		// We model startTimer as if it was defined thus:
		// 	func startTimer(t *runtimeTimer) { t.f(t.arg) }

		// We hard-code the field offsets of time.runtimeTimer:
		// type runtimeTimer struct {
		//  0     __identity__
		//  1    i      int32
		//  2    when   int64
		//  3    period int64
		//  4    f      func(int64, interface{})
		//  5    arg    interface{}
		// }
		f := t + 4
		arg := t + 5

		// store t.arg to t.f.params[0]
		// (offset 1 => skip identity)
		a.store(f, arg, 1, 1)

		// Add dynamic call target.
		if a.onlineCopy(c.targets, f) {
			a.addWork(c.targets)
		}
	}
}

func ext۰time۰startTimer(a *analysis, cgn *cgnode) {
	// This is the shared contour, used for dynamic calls.
	targets := a.addOneNode(tInvalid, "startTimer.targets", nil)
	cgn.sites = append(cgn.sites, &callsite{targets: targets})
	params := a.funcParams(cgn.obj)
	a.addConstraint(&timeStartTimerConstraint{
		targets: targets,
		t:       params,
	})
}
