volatile.go raw

   1  package compiler
   2  
   3  import "go/types"
   4  
   5  // This file implements volatile loads/stores in runtime/volatile.LoadT and
   6  // runtime/volatile.StoreT as compiler builtins.
   7  
   8  // createVolatileLoad is the implementation of the intrinsic function
   9  // runtime/volatile.LoadT().
  10  func (b *builder) createVolatileLoad() {
  11  	b.createFunctionStart(true)
  12  	addr := b.getValue(b.fn.Params[0], getPos(b.fn))
  13  	b.createNilCheck(b.fn.Params[0], addr, "deref")
  14  	valType := b.getLLVMType(b.fn.Params[0].Type().(*types.Pointer).Elem())
  15  	val := b.CreateLoad(valType, addr, "")
  16  	val.SetVolatile(true)
  17  	b.CreateRet(val)
  18  }
  19  
  20  // createVolatileStore is the implementation of the intrinsic function
  21  // runtime/volatile.StoreT().
  22  func (b *builder) createVolatileStore() {
  23  	b.createFunctionStart(true)
  24  	addr := b.getValue(b.fn.Params[0], getPos(b.fn))
  25  	val := b.getValue(b.fn.Params[1], getPos(b.fn))
  26  	b.createNilCheck(b.fn.Params[0], addr, "deref")
  27  	store := b.CreateStore(val, addr)
  28  	store.SetVolatile(true)
  29  	b.CreateRetVoid()
  30  }
  31