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