[Git][ghc/ghc][wip/generate-addr-ops] Generate Addr# access ops programmatically
Matthew Craven (@clyring)
gitlab at gitlab.haskell.org
Sun May 28 23:42:28 UTC 2023
Matthew Craven pushed to branch wip/generate-addr-ops at Glasgow Haskell Compiler / GHC
Commits:
ccd16843 by Matthew Craven at 2023-05-28T19:42:00-04:00
Generate Addr# access ops programmatically
The existing utils/genprimopcode/gen_bytearray_ops.py was
relocated and extended for this purpose. Additionally, hadrian
now knows about this script and uses it when generating primops.txt
- - - - -
5 changed files:
- − compiler/GHC/Builtin/bytearray-ops.txt.pp
- utils/genprimopcode/gen_bytearray_ops.py → compiler/GHC/Builtin/gen_bytearray_addr_access_ops.py
- compiler/GHC/Builtin/primops.txt.pp
- hadrian/src/Rules/Generate.hs
- rts/gen_event_types.py
Changes:
=====================================
compiler/GHC/Builtin/bytearray-ops.txt.pp deleted
=====================================
@@ -1,551 +0,0 @@
-
-------------------------------------
--- ByteArray# operations
-------------------------------------
-
-
--- Do not edit. This file is generated by utils/genprimopcode/gen_bytearray_ops.py.
--- To regenerate run,
---
--- python3 utils/genprimops/gen_bytearray_ops.py > compiler/GHC/Builtin/bytearray-ops.txt.pp
-
-
-------------------------------------
--- aligned index operations
-------------------------------------
-
-primop IndexByteArrayOp_Char "indexCharArray#" GenPrimOp
- ByteArray# -> Int# -> Char#
- {Read a 8-bit character; offset in bytes.}
- with can_fail = True
-
-primop IndexByteArrayOp_WideChar "indexWideCharArray#" GenPrimOp
- ByteArray# -> Int# -> Char#
- {Read a 32-bit character; offset in 4-byte words.}
- with can_fail = True
-
-primop IndexByteArrayOp_Int "indexIntArray#" GenPrimOp
- ByteArray# -> Int# -> Int#
- {Read a word-sized integer; offset in machine words.}
- with can_fail = True
-
-primop IndexByteArrayOp_Word "indexWordArray#" GenPrimOp
- ByteArray# -> Int# -> Word#
- {Read a word-sized unsigned integer; offset in machine words.}
- with can_fail = True
-
-primop IndexByteArrayOp_Addr "indexAddrArray#" GenPrimOp
- ByteArray# -> Int# -> Addr#
- {Read a machine address; offset in machine words.}
- with can_fail = True
-
-primop IndexByteArrayOp_Float "indexFloatArray#" GenPrimOp
- ByteArray# -> Int# -> Float#
- {Read a single-precision floating-point value; offset in 4-byte words.}
- with can_fail = True
-
-primop IndexByteArrayOp_Double "indexDoubleArray#" GenPrimOp
- ByteArray# -> Int# -> Double#
- {Read a double-precision floating-point value; offset in 8-byte words.}
- with can_fail = True
-
-primop IndexByteArrayOp_StablePtr "indexStablePtrArray#" GenPrimOp
- ByteArray# -> Int# -> StablePtr# a
- {Read a 'StablePtr#' value; offset in machine words.}
- with can_fail = True
-
-primop IndexByteArrayOp_Int8 "indexInt8Array#" GenPrimOp
- ByteArray# -> Int# -> Int8#
- {Read a 8-bit signed integer; offset in bytes.}
- with can_fail = True
-
-primop IndexByteArrayOp_Int16 "indexInt16Array#" GenPrimOp
- ByteArray# -> Int# -> Int16#
- {Read a 16-bit signed integer; offset in 2-byte words.}
- with can_fail = True
-
-primop IndexByteArrayOp_Int32 "indexInt32Array#" GenPrimOp
- ByteArray# -> Int# -> Int32#
- {Read a 32-bit signed integer; offset in 4-byte words.}
- with can_fail = True
-
-primop IndexByteArrayOp_Int64 "indexInt64Array#" GenPrimOp
- ByteArray# -> Int# -> Int64#
- {Read a 64-bit signed integer; offset in 8-byte words.}
- with can_fail = True
-
-primop IndexByteArrayOp_Word8 "indexWord8Array#" GenPrimOp
- ByteArray# -> Int# -> Word8#
- {Read a 8-bit unsigned integer; offset in bytes.}
- with can_fail = True
-
-primop IndexByteArrayOp_Word16 "indexWord16Array#" GenPrimOp
- ByteArray# -> Int# -> Word16#
- {Read a 16-bit unsigned integer; offset in 2-byte words.}
- with can_fail = True
-
-primop IndexByteArrayOp_Word32 "indexWord32Array#" GenPrimOp
- ByteArray# -> Int# -> Word32#
- {Read a 32-bit unsigned integer; offset in 4-byte words.}
- with can_fail = True
-
-primop IndexByteArrayOp_Word64 "indexWord64Array#" GenPrimOp
- ByteArray# -> Int# -> Word64#
- {Read a 64-bit unsigned integer; offset in 8-byte words.}
- with can_fail = True
-
-
-------------------------------------
--- unaligned index operations
-------------------------------------
-
-primop IndexByteArrayOp_Word8AsChar "indexWord8ArrayAsChar#" GenPrimOp
- ByteArray# -> Int# -> Char#
- {Read a 8-bit character; offset in bytes.}
- with can_fail = True
-
-primop IndexByteArrayOp_Word8AsWideChar "indexWord8ArrayAsWideChar#" GenPrimOp
- ByteArray# -> Int# -> Char#
- {Read a 32-bit character; offset in bytes.}
- with can_fail = True
-
-primop IndexByteArrayOp_Word8AsInt "indexWord8ArrayAsInt#" GenPrimOp
- ByteArray# -> Int# -> Int#
- {Read a word-sized integer; offset in bytes.}
- with can_fail = True
-
-primop IndexByteArrayOp_Word8AsWord "indexWord8ArrayAsWord#" GenPrimOp
- ByteArray# -> Int# -> Word#
- {Read a word-sized unsigned integer; offset in bytes.}
- with can_fail = True
-
-primop IndexByteArrayOp_Word8AsAddr "indexWord8ArrayAsAddr#" GenPrimOp
- ByteArray# -> Int# -> Addr#
- {Read a machine address; offset in bytes.}
- with can_fail = True
-
-primop IndexByteArrayOp_Word8AsFloat "indexWord8ArrayAsFloat#" GenPrimOp
- ByteArray# -> Int# -> Float#
- {Read a single-precision floating-point value; offset in bytes.}
- with can_fail = True
-
-primop IndexByteArrayOp_Word8AsDouble "indexWord8ArrayAsDouble#" GenPrimOp
- ByteArray# -> Int# -> Double#
- {Read a double-precision floating-point value; offset in bytes.}
- with can_fail = True
-
-primop IndexByteArrayOp_Word8AsStablePtr "indexWord8ArrayAsStablePtr#" GenPrimOp
- ByteArray# -> Int# -> StablePtr# a
- {Read a 'StablePtr#' value; offset in bytes.}
- with can_fail = True
-
-primop IndexByteArrayOp_Word8AsInt16 "indexWord8ArrayAsInt16#" GenPrimOp
- ByteArray# -> Int# -> Int16#
- {Read a 16-bit signed integer; offset in bytes.}
- with can_fail = True
-
-primop IndexByteArrayOp_Word8AsInt32 "indexWord8ArrayAsInt32#" GenPrimOp
- ByteArray# -> Int# -> Int32#
- {Read a 32-bit signed integer; offset in bytes.}
- with can_fail = True
-
-primop IndexByteArrayOp_Word8AsInt64 "indexWord8ArrayAsInt64#" GenPrimOp
- ByteArray# -> Int# -> Int64#
- {Read a 64-bit signed integer; offset in bytes.}
- with can_fail = True
-
-primop IndexByteArrayOp_Word8AsWord16 "indexWord8ArrayAsWord16#" GenPrimOp
- ByteArray# -> Int# -> Word16#
- {Read a 16-bit unsigned integer; offset in bytes.}
- with can_fail = True
-
-primop IndexByteArrayOp_Word8AsWord32 "indexWord8ArrayAsWord32#" GenPrimOp
- ByteArray# -> Int# -> Word32#
- {Read a 32-bit unsigned integer; offset in bytes.}
- with can_fail = True
-
-primop IndexByteArrayOp_Word8AsWord64 "indexWord8ArrayAsWord64#" GenPrimOp
- ByteArray# -> Int# -> Word64#
- {Read a 64-bit unsigned integer; offset in bytes.}
- with can_fail = True
-
-
-------------------------------------
--- aligned read operations
-------------------------------------
-
-primop ReadByteArrayOp_Char "readCharArray#" GenPrimOp
- MutableByteArray# s -> Int# -> State# s -> (# State# s, Char# #)
- {Read a 8-bit character; offset in bytes.}
- with has_side_effects = True
- can_fail = True
-
-primop ReadByteArrayOp_WideChar "readWideCharArray#" GenPrimOp
- MutableByteArray# s -> Int# -> State# s -> (# State# s, Char# #)
- {Read a 32-bit character; offset in 4-byte words.}
- with has_side_effects = True
- can_fail = True
-
-primop ReadByteArrayOp_Int "readIntArray#" GenPrimOp
- MutableByteArray# s -> Int# -> State# s -> (# State# s, Int# #)
- {Read a word-sized integer; offset in machine words.}
- with has_side_effects = True
- can_fail = True
-
-primop ReadByteArrayOp_Word "readWordArray#" GenPrimOp
- MutableByteArray# s -> Int# -> State# s -> (# State# s, Word# #)
- {Read a word-sized unsigned integer; offset in machine words.}
- with has_side_effects = True
- can_fail = True
-
-primop ReadByteArrayOp_Addr "readAddrArray#" GenPrimOp
- MutableByteArray# s -> Int# -> State# s -> (# State# s, Addr# #)
- {Read a machine address; offset in machine words.}
- with has_side_effects = True
- can_fail = True
-
-primop ReadByteArrayOp_Float "readFloatArray#" GenPrimOp
- MutableByteArray# s -> Int# -> State# s -> (# State# s, Float# #)
- {Read a single-precision floating-point value; offset in 4-byte words.}
- with has_side_effects = True
- can_fail = True
-
-primop ReadByteArrayOp_Double "readDoubleArray#" GenPrimOp
- MutableByteArray# s -> Int# -> State# s -> (# State# s, Double# #)
- {Read a double-precision floating-point value; offset in 8-byte words.}
- with has_side_effects = True
- can_fail = True
-
-primop ReadByteArrayOp_StablePtr "readStablePtrArray#" GenPrimOp
- MutableByteArray# s -> Int# -> State# s -> (# State# s, StablePtr# a #)
- {Read a 'StablePtr#' value; offset in machine words.}
- with has_side_effects = True
- can_fail = True
-
-primop ReadByteArrayOp_Int8 "readInt8Array#" GenPrimOp
- MutableByteArray# s -> Int# -> State# s -> (# State# s, Int8# #)
- {Read a 8-bit signed integer; offset in bytes.}
- with has_side_effects = True
- can_fail = True
-
-primop ReadByteArrayOp_Int16 "readInt16Array#" GenPrimOp
- MutableByteArray# s -> Int# -> State# s -> (# State# s, Int16# #)
- {Read a 16-bit signed integer; offset in 2-byte words.}
- with has_side_effects = True
- can_fail = True
-
-primop ReadByteArrayOp_Int32 "readInt32Array#" GenPrimOp
- MutableByteArray# s -> Int# -> State# s -> (# State# s, Int32# #)
- {Read a 32-bit signed integer; offset in 4-byte words.}
- with has_side_effects = True
- can_fail = True
-
-primop ReadByteArrayOp_Int64 "readInt64Array#" GenPrimOp
- MutableByteArray# s -> Int# -> State# s -> (# State# s, Int64# #)
- {Read a 64-bit signed integer; offset in 8-byte words.}
- with has_side_effects = True
- can_fail = True
-
-primop ReadByteArrayOp_Word8 "readWord8Array#" GenPrimOp
- MutableByteArray# s -> Int# -> State# s -> (# State# s, Word8# #)
- {Read a 8-bit unsigned integer; offset in bytes.}
- with has_side_effects = True
- can_fail = True
-
-primop ReadByteArrayOp_Word16 "readWord16Array#" GenPrimOp
- MutableByteArray# s -> Int# -> State# s -> (# State# s, Word16# #)
- {Read a 16-bit unsigned integer; offset in 2-byte words.}
- with has_side_effects = True
- can_fail = True
-
-primop ReadByteArrayOp_Word32 "readWord32Array#" GenPrimOp
- MutableByteArray# s -> Int# -> State# s -> (# State# s, Word32# #)
- {Read a 32-bit unsigned integer; offset in 4-byte words.}
- with has_side_effects = True
- can_fail = True
-
-primop ReadByteArrayOp_Word64 "readWord64Array#" GenPrimOp
- MutableByteArray# s -> Int# -> State# s -> (# State# s, Word64# #)
- {Read a 64-bit unsigned integer; offset in 8-byte words.}
- with has_side_effects = True
- can_fail = True
-
-
-------------------------------------
--- unaligned read operations
-------------------------------------
-
-primop ReadByteArrayOp_Word8AsChar "readWord8ArrayAsChar#" GenPrimOp
- MutableByteArray# s -> Int# -> State# s -> (# State# s, Char# #)
- {Read a 8-bit character; offset in bytes.}
- with has_side_effects = True
- can_fail = True
-
-primop ReadByteArrayOp_Word8AsWideChar "readWord8ArrayAsWideChar#" GenPrimOp
- MutableByteArray# s -> Int# -> State# s -> (# State# s, Char# #)
- {Read a 32-bit character; offset in bytes.}
- with has_side_effects = True
- can_fail = True
-
-primop ReadByteArrayOp_Word8AsInt "readWord8ArrayAsInt#" GenPrimOp
- MutableByteArray# s -> Int# -> State# s -> (# State# s, Int# #)
- {Read a word-sized integer; offset in bytes.}
- with has_side_effects = True
- can_fail = True
-
-primop ReadByteArrayOp_Word8AsWord "readWord8ArrayAsWord#" GenPrimOp
- MutableByteArray# s -> Int# -> State# s -> (# State# s, Word# #)
- {Read a word-sized unsigned integer; offset in bytes.}
- with has_side_effects = True
- can_fail = True
-
-primop ReadByteArrayOp_Word8AsAddr "readWord8ArrayAsAddr#" GenPrimOp
- MutableByteArray# s -> Int# -> State# s -> (# State# s, Addr# #)
- {Read a machine address; offset in bytes.}
- with has_side_effects = True
- can_fail = True
-
-primop ReadByteArrayOp_Word8AsFloat "readWord8ArrayAsFloat#" GenPrimOp
- MutableByteArray# s -> Int# -> State# s -> (# State# s, Float# #)
- {Read a single-precision floating-point value; offset in bytes.}
- with has_side_effects = True
- can_fail = True
-
-primop ReadByteArrayOp_Word8AsDouble "readWord8ArrayAsDouble#" GenPrimOp
- MutableByteArray# s -> Int# -> State# s -> (# State# s, Double# #)
- {Read a double-precision floating-point value; offset in bytes.}
- with has_side_effects = True
- can_fail = True
-
-primop ReadByteArrayOp_Word8AsStablePtr "readWord8ArrayAsStablePtr#" GenPrimOp
- MutableByteArray# s -> Int# -> State# s -> (# State# s, StablePtr# a #)
- {Read a 'StablePtr#' value; offset in bytes.}
- with has_side_effects = True
- can_fail = True
-
-primop ReadByteArrayOp_Word8AsInt16 "readWord8ArrayAsInt16#" GenPrimOp
- MutableByteArray# s -> Int# -> State# s -> (# State# s, Int16# #)
- {Read a 16-bit signed integer; offset in bytes.}
- with has_side_effects = True
- can_fail = True
-
-primop ReadByteArrayOp_Word8AsInt32 "readWord8ArrayAsInt32#" GenPrimOp
- MutableByteArray# s -> Int# -> State# s -> (# State# s, Int32# #)
- {Read a 32-bit signed integer; offset in bytes.}
- with has_side_effects = True
- can_fail = True
-
-primop ReadByteArrayOp_Word8AsInt64 "readWord8ArrayAsInt64#" GenPrimOp
- MutableByteArray# s -> Int# -> State# s -> (# State# s, Int64# #)
- {Read a 64-bit signed integer; offset in bytes.}
- with has_side_effects = True
- can_fail = True
-
-primop ReadByteArrayOp_Word8AsWord16 "readWord8ArrayAsWord16#" GenPrimOp
- MutableByteArray# s -> Int# -> State# s -> (# State# s, Word16# #)
- {Read a 16-bit unsigned integer; offset in bytes.}
- with has_side_effects = True
- can_fail = True
-
-primop ReadByteArrayOp_Word8AsWord32 "readWord8ArrayAsWord32#" GenPrimOp
- MutableByteArray# s -> Int# -> State# s -> (# State# s, Word32# #)
- {Read a 32-bit unsigned integer; offset in bytes.}
- with has_side_effects = True
- can_fail = True
-
-primop ReadByteArrayOp_Word8AsWord64 "readWord8ArrayAsWord64#" GenPrimOp
- MutableByteArray# s -> Int# -> State# s -> (# State# s, Word64# #)
- {Read a 64-bit unsigned integer; offset in bytes.}
- with has_side_effects = True
- can_fail = True
-
-
-------------------------------------
--- aligned write operations
-------------------------------------
-
-primop WriteByteArrayOp_Char "writeCharArray#" GenPrimOp
- MutableByteArray# s -> Int# -> Char# -> State# s -> State# s
- {Write a 8-bit character; offset in bytes.}
- with has_side_effects = True
- can_fail = True
-
-primop WriteByteArrayOp_WideChar "writeWideCharArray#" GenPrimOp
- MutableByteArray# s -> Int# -> Char# -> State# s -> State# s
- {Write a 32-bit character; offset in 4-byte words.}
- with has_side_effects = True
- can_fail = True
-
-primop WriteByteArrayOp_Int "writeIntArray#" GenPrimOp
- MutableByteArray# s -> Int# -> Int# -> State# s -> State# s
- {Write a word-sized integer; offset in machine words.}
- with has_side_effects = True
- can_fail = True
-
-primop WriteByteArrayOp_Word "writeWordArray#" GenPrimOp
- MutableByteArray# s -> Int# -> Word# -> State# s -> State# s
- {Write a word-sized unsigned integer; offset in machine words.}
- with has_side_effects = True
- can_fail = True
-
-primop WriteByteArrayOp_Addr "writeAddrArray#" GenPrimOp
- MutableByteArray# s -> Int# -> Addr# -> State# s -> State# s
- {Write a machine address; offset in machine words.}
- with has_side_effects = True
- can_fail = True
-
-primop WriteByteArrayOp_Float "writeFloatArray#" GenPrimOp
- MutableByteArray# s -> Int# -> Float# -> State# s -> State# s
- {Write a single-precision floating-point value; offset in 4-byte words.}
- with has_side_effects = True
- can_fail = True
-
-primop WriteByteArrayOp_Double "writeDoubleArray#" GenPrimOp
- MutableByteArray# s -> Int# -> Double# -> State# s -> State# s
- {Write a double-precision floating-point value; offset in 8-byte words.}
- with has_side_effects = True
- can_fail = True
-
-primop WriteByteArrayOp_StablePtr "writeStablePtrArray#" GenPrimOp
- MutableByteArray# s -> Int# -> StablePtr# a -> State# s -> State# s
- {Write a 'StablePtr#' value; offset in machine words.}
- with has_side_effects = True
- can_fail = True
-
-primop WriteByteArrayOp_Int8 "writeInt8Array#" GenPrimOp
- MutableByteArray# s -> Int# -> Int8# -> State# s -> State# s
- {Write a 8-bit signed integer; offset in bytes.}
- with has_side_effects = True
- can_fail = True
-
-primop WriteByteArrayOp_Int16 "writeInt16Array#" GenPrimOp
- MutableByteArray# s -> Int# -> Int16# -> State# s -> State# s
- {Write a 16-bit signed integer; offset in 2-byte words.}
- with has_side_effects = True
- can_fail = True
-
-primop WriteByteArrayOp_Int32 "writeInt32Array#" GenPrimOp
- MutableByteArray# s -> Int# -> Int32# -> State# s -> State# s
- {Write a 32-bit signed integer; offset in 4-byte words.}
- with has_side_effects = True
- can_fail = True
-
-primop WriteByteArrayOp_Int64 "writeInt64Array#" GenPrimOp
- MutableByteArray# s -> Int# -> Int64# -> State# s -> State# s
- {Write a 64-bit signed integer; offset in 8-byte words.}
- with has_side_effects = True
- can_fail = True
-
-primop WriteByteArrayOp_Word8 "writeWord8Array#" GenPrimOp
- MutableByteArray# s -> Int# -> Word8# -> State# s -> State# s
- {Write a 8-bit unsigned integer; offset in bytes.}
- with has_side_effects = True
- can_fail = True
-
-primop WriteByteArrayOp_Word16 "writeWord16Array#" GenPrimOp
- MutableByteArray# s -> Int# -> Word16# -> State# s -> State# s
- {Write a 16-bit unsigned integer; offset in 2-byte words.}
- with has_side_effects = True
- can_fail = True
-
-primop WriteByteArrayOp_Word32 "writeWord32Array#" GenPrimOp
- MutableByteArray# s -> Int# -> Word32# -> State# s -> State# s
- {Write a 32-bit unsigned integer; offset in 4-byte words.}
- with has_side_effects = True
- can_fail = True
-
-primop WriteByteArrayOp_Word64 "writeWord64Array#" GenPrimOp
- MutableByteArray# s -> Int# -> Word64# -> State# s -> State# s
- {Write a 64-bit unsigned integer; offset in 8-byte words.}
- with has_side_effects = True
- can_fail = True
-
-
-------------------------------------
--- unaligned write operations
-------------------------------------
-
-primop WriteByteArrayOp_Word8AsChar "writeWord8ArrayAsChar#" GenPrimOp
- MutableByteArray# s -> Int# -> Char# -> State# s -> State# s
- {Write a 8-bit character; offset in bytes.}
- with has_side_effects = True
- can_fail = True
-
-primop WriteByteArrayOp_Word8AsWideChar "writeWord8ArrayAsWideChar#" GenPrimOp
- MutableByteArray# s -> Int# -> Char# -> State# s -> State# s
- {Write a 32-bit character; offset in bytes.}
- with has_side_effects = True
- can_fail = True
-
-primop WriteByteArrayOp_Word8AsInt "writeWord8ArrayAsInt#" GenPrimOp
- MutableByteArray# s -> Int# -> Int# -> State# s -> State# s
- {Write a word-sized integer; offset in bytes.}
- with has_side_effects = True
- can_fail = True
-
-primop WriteByteArrayOp_Word8AsWord "writeWord8ArrayAsWord#" GenPrimOp
- MutableByteArray# s -> Int# -> Word# -> State# s -> State# s
- {Write a word-sized unsigned integer; offset in bytes.}
- with has_side_effects = True
- can_fail = True
-
-primop WriteByteArrayOp_Word8AsAddr "writeWord8ArrayAsAddr#" GenPrimOp
- MutableByteArray# s -> Int# -> Addr# -> State# s -> State# s
- {Write a machine address; offset in bytes.}
- with has_side_effects = True
- can_fail = True
-
-primop WriteByteArrayOp_Word8AsFloat "writeWord8ArrayAsFloat#" GenPrimOp
- MutableByteArray# s -> Int# -> Float# -> State# s -> State# s
- {Write a single-precision floating-point value; offset in bytes.}
- with has_side_effects = True
- can_fail = True
-
-primop WriteByteArrayOp_Word8AsDouble "writeWord8ArrayAsDouble#" GenPrimOp
- MutableByteArray# s -> Int# -> Double# -> State# s -> State# s
- {Write a double-precision floating-point value; offset in bytes.}
- with has_side_effects = True
- can_fail = True
-
-primop WriteByteArrayOp_Word8AsStablePtr "writeWord8ArrayAsStablePtr#" GenPrimOp
- MutableByteArray# s -> Int# -> StablePtr# a -> State# s -> State# s
- {Write a 'StablePtr#' value; offset in bytes.}
- with has_side_effects = True
- can_fail = True
-
-primop WriteByteArrayOp_Word8AsInt16 "writeWord8ArrayAsInt16#" GenPrimOp
- MutableByteArray# s -> Int# -> Int16# -> State# s -> State# s
- {Write a 16-bit signed integer; offset in bytes.}
- with has_side_effects = True
- can_fail = True
-
-primop WriteByteArrayOp_Word8AsInt32 "writeWord8ArrayAsInt32#" GenPrimOp
- MutableByteArray# s -> Int# -> Int32# -> State# s -> State# s
- {Write a 32-bit signed integer; offset in bytes.}
- with has_side_effects = True
- can_fail = True
-
-primop WriteByteArrayOp_Word8AsInt64 "writeWord8ArrayAsInt64#" GenPrimOp
- MutableByteArray# s -> Int# -> Int64# -> State# s -> State# s
- {Write a 64-bit signed integer; offset in bytes.}
- with has_side_effects = True
- can_fail = True
-
-primop WriteByteArrayOp_Word8AsWord16 "writeWord8ArrayAsWord16#" GenPrimOp
- MutableByteArray# s -> Int# -> Word16# -> State# s -> State# s
- {Write a 16-bit unsigned integer; offset in bytes.}
- with has_side_effects = True
- can_fail = True
-
-primop WriteByteArrayOp_Word8AsWord32 "writeWord8ArrayAsWord32#" GenPrimOp
- MutableByteArray# s -> Int# -> Word32# -> State# s -> State# s
- {Write a 32-bit unsigned integer; offset in bytes.}
- with has_side_effects = True
- can_fail = True
-
-primop WriteByteArrayOp_Word8AsWord64 "writeWord8ArrayAsWord64#" GenPrimOp
- MutableByteArray# s -> Int# -> Word64# -> State# s -> State# s
- {Write a 64-bit unsigned integer; offset in bytes.}
- with has_side_effects = True
- can_fail = True
-
=====================================
utils/genprimopcode/gen_bytearray_ops.py → compiler/GHC/Builtin/gen_bytearray_addr_access_ops.py
=====================================
@@ -1,8 +1,34 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
+# This script generates the primop descriptions for many similar ByteArray#
+# and Addr# access operations. Its output is #include-d into primops.txt.pp.
+
from typing import Optional, NamedTuple
import textwrap
+import argparse
+
+msgs = []
+
+arg_parser = argparse.ArgumentParser()
+arg_parser.add_argument('addr_or_bytearray',
+ choices = ["addr-access-ops", "bytearray-access-ops"],
+ )
+arg_parser.add_argument('output_file',
+ type=argparse.FileType('w'),
+ metavar='FILE',
+ )
+args = arg_parser.parse_args()
+write = args.output_file.write
+
+
+
+write('''
+-- Do not edit.
+-- This file is generated by compiler/Builtin/gen_bytearray_addr_access_ops.py.
+-- (The build system should take care of this for you.)
+
+''')
class ElementType(NamedTuple):
name: str
@@ -28,26 +54,13 @@ element_types = [
ElementType("StablePtr", "StablePtr# a", "'StablePtr#' value", MACH_WORD),
]
-# TODO: Eventually when the sized integer primops use proper unboxed types we
-# should rather do:
-#
-#for n in [8,16,32,64]:
-# element_types += [ ElementType(f"Int{n}", f"Int{n}#", f"{n}-bit signed integer", n // 8) ]
-#
-#for n in [8,16,32,64]:
-# element_types += [ ElementType(f"Word{n}", f"Word{n}#", f"{n}-bit unsigned integer", n // 8) ]
-
-element_types += [
- ElementType("Int8", "Int8#", "8-bit signed integer", 1),
- ElementType("Int16", "Int16#", "16-bit signed integer", 2),
- ElementType("Int32", "Int32#", "32-bit signed integer", 4),
- ElementType("Int64", "Int64#", "64-bit signed integer", 8),
-
- ElementType("Word8", "Word8#", "8-bit unsigned integer", 1),
- ElementType("Word16", "Word16#", "16-bit unsigned integer", 2),
- ElementType("Word32", "Word32#", "32-bit unsigned integer", 4),
- ElementType("Word64", "Word64#", "64-bit unsigned integer", 8),
-]
+for n in [8,16,32,64]:
+ element_types += [
+ ElementType(f"Int{n}", f"Int{n}#",
+ f"{n}-bit signed integer", n // 8),
+ ElementType(f"Word{n}", f"Word{n}#",
+ f"{n}-bit unsigned integer", n // 8)
+ ]
def pretty_offset(n: Optional[int]) -> str:
if n == MACH_WORD:
@@ -57,87 +70,134 @@ def pretty_offset(n: Optional[int]) -> str:
else:
return f'{n}-byte words'
+def get_align_warn(n: ElementType) -> str:
+ if n.width == 1:
+ return ''
+ return '''
+ On some platforms, the access may fail
+ for an insufficiently aligned @Addr#@.
+ '''
+
def print_block(template: str, **kwargs) -> None:
- print(textwrap.dedent(template.format(**kwargs)).lstrip())
+ write(textwrap.dedent(template.format(**kwargs)).lstrip())
+ write('\n')
def header(s: str):
- print('')
+ write('\n')
print_block('''
------------------------------------
-- {s}
------------------------------------
''', s=s)
+if args.addr_or_bytearray == "bytearray-access-ops":
+ header("ByteArray# operations")
-header("ByteArray# operations")
-
-print('''
--- Do not edit. This file is generated by utils/genprimopcode/gen_bytearray_ops.py.
--- To regenerate run,
---
--- python3 utils/genprimops/gen_bytearray_ops.py > compiler/GHC/Builtin/bytearray-ops.txt.pp
-''')
-
-header('aligned index operations')
-for t in element_types:
- offset = pretty_offset(t.width)
- print_block('''
+ header('aligned index operations')
+ for t in element_types:
+ offset = pretty_offset(t.width)
+ print_block('''
primop IndexByteArrayOp_{name} "index{name}Array#" GenPrimOp
ByteArray# -> Int# -> {rep_ty}
{{Read a {desc}; offset in {offset}.}}
with can_fail = True
- ''', offset = offset, **t._asdict())
+ ''', offset = offset, **t._asdict())
-header('unaligned index operations')
-for t in element_types:
- if t.name in ['Int8', 'Word8']: continue
- print_block('''
+ header('unaligned index operations')
+ for t in element_types:
+ if t.name in ['Int8', 'Word8']: continue
+ print_block('''
primop IndexByteArrayOp_Word8As{name} "indexWord8ArrayAs{name}#" GenPrimOp
ByteArray# -> Int# -> {rep_ty}
{{Read a {desc}; offset in bytes.}}
with can_fail = True
- ''', **t._asdict())
+ ''', **t._asdict())
-header('aligned read operations')
-for t in element_types:
- offset = pretty_offset(t.width)
- print_block('''
+ header('aligned read operations')
+ for t in element_types:
+ offset = pretty_offset(t.width)
+ print_block('''
primop ReadByteArrayOp_{name} "read{name}Array#" GenPrimOp
MutableByteArray# s -> Int# -> State# s -> (# State# s, {rep_ty} #)
{{Read a {desc}; offset in {offset}.}}
with has_side_effects = True
can_fail = True
- ''', offset = offset, **t._asdict())
+ ''', offset = offset, **t._asdict())
-header('unaligned read operations')
-for t in element_types:
- if t.name in ['Int8', 'Word8']: continue
- print_block('''
+ header('unaligned read operations')
+ for t in element_types:
+ if t.name in ['Int8', 'Word8']: continue
+ print_block('''
primop ReadByteArrayOp_Word8As{name} "readWord8ArrayAs{name}#" GenPrimOp
MutableByteArray# s -> Int# -> State# s -> (# State# s, {rep_ty} #)
{{Read a {desc}; offset in bytes.}}
with has_side_effects = True
can_fail = True
- ''', **t._asdict())
+ ''', **t._asdict())
-header('aligned write operations')
-for t in element_types:
- offset = pretty_offset(t.width)
- print_block('''
+ header('aligned write operations')
+ for t in element_types:
+ offset = pretty_offset(t.width)
+ print_block('''
primop WriteByteArrayOp_{name} "write{name}Array#" GenPrimOp
MutableByteArray# s -> Int# -> {rep_ty} -> State# s -> State# s
{{Write a {desc}; offset in {offset}.}}
with has_side_effects = True
can_fail = True
- ''', offset = offset, **t._asdict())
+ ''', offset = offset, **t._asdict())
-header('unaligned write operations')
-for t in element_types:
- if t.name in ['Int8', 'Word8']: continue
- print_block('''
+ header('unaligned write operations')
+ for t in element_types:
+ if t.name in ['Int8', 'Word8']: continue
+ print_block('''
primop WriteByteArrayOp_Word8As{name} "writeWord8ArrayAs{name}#" GenPrimOp
MutableByteArray# s -> Int# -> {rep_ty} -> State# s -> State# s
{{Write a {desc}; offset in bytes.}}
with has_side_effects = True
can_fail = True
- ''', **t._asdict())
+ ''', **t._asdict())
+
+
+else: # addr_or_bytearray == "addr-access-ops":
+ header("Addr# access operations")
+
+ header('aligned index operations')
+ for t in element_types:
+ offset = pretty_offset(t.width)
+ align_warn = get_align_warn(t)
+ print_block('''
+ primop IndexOffAddrOp_{name} "index{name}OffAddr#" GenPrimOp
+ Addr# -> Int# -> {rep_ty}
+ {{ Read a {desc}; offset in {offset}.
+ {align_warn}
+ }}
+ with can_fail = True
+ ''', offset = offset, align_warn = align_warn, **t._asdict())
+
+ header('aligned read operations')
+ for t in element_types:
+ offset = pretty_offset(t.width)
+ align_warn = get_align_warn(t)
+ print_block('''
+ primop ReadOffAddrOp_{name} "read{name}OffAddr#" GenPrimOp
+ Addr# -> Int# -> State# s -> (# State# s, {rep_ty} #)
+ {{ Read a {desc}; offset in {offset}.
+ {align_warn}
+ }}
+ with has_side_effects = True
+ can_fail = True
+ ''', offset = offset, align_warn = align_warn, **t._asdict())
+
+ header('aligned write operations')
+ for t in element_types:
+ offset = pretty_offset(t.width)
+ align_warn = get_align_warn(t)
+ print_block('''
+ primop WriteOffAddrOp_{name} "write{name}OffAddr#" GenPrimOp
+ Addr# -> Int# -> {rep_ty} -> State# s -> State# s
+ {{ Write a {desc}; offset in {offset}.
+ {align_warn}
+ }}
+ with has_side_effects = True
+ can_fail = True
+ ''', offset = offset, align_warn = align_warn, **t._asdict())
=====================================
compiler/GHC/Builtin/primops.txt.pp
=====================================
@@ -1941,7 +1941,7 @@ primop GetSizeofMutableByteArrayOp "getSizeofMutableByteArray#" GenPrimOp
@since 0.5.0.0}
-#include "bytearray-ops.txt.pp"
+#include "bytearray-access-ops.txt.pp"
primop CompareByteArraysOp "compareByteArrays#" GenPrimOp
ByteArray# -> Int# -> ByteArray# -> Int# -> Int# -> Int#
@@ -2242,233 +2242,7 @@ primop AddrNeOp "neAddr#" Compare Addr# -> Addr# -> Int#
primop AddrLtOp "ltAddr#" Compare Addr# -> Addr# -> Int#
primop AddrLeOp "leAddr#" Compare Addr# -> Addr# -> Int#
-primop IndexOffAddrOp_Char "indexCharOffAddr#" GenPrimOp
- Addr# -> Int# -> Char#
- {Reads 8-bit character; offset in bytes.}
- with can_fail = True
-
-primop IndexOffAddrOp_WideChar "indexWideCharOffAddr#" GenPrimOp
- Addr# -> Int# -> Char#
- {Reads 31-bit character; offset in 4-byte words.}
- with can_fail = True
-
-primop IndexOffAddrOp_Int "indexIntOffAddr#" GenPrimOp
- Addr# -> Int# -> Int#
- with can_fail = True
-
-primop IndexOffAddrOp_Word "indexWordOffAddr#" GenPrimOp
- Addr# -> Int# -> Word#
- with can_fail = True
-
-primop IndexOffAddrOp_Addr "indexAddrOffAddr#" GenPrimOp
- Addr# -> Int# -> Addr#
- with can_fail = True
-
-primop IndexOffAddrOp_Float "indexFloatOffAddr#" GenPrimOp
- Addr# -> Int# -> Float#
- with can_fail = True
-
-primop IndexOffAddrOp_Double "indexDoubleOffAddr#" GenPrimOp
- Addr# -> Int# -> Double#
- with can_fail = True
-
-primop IndexOffAddrOp_StablePtr "indexStablePtrOffAddr#" GenPrimOp
- Addr# -> Int# -> StablePtr# a
- with can_fail = True
-
-primop IndexOffAddrOp_Int8 "indexInt8OffAddr#" GenPrimOp
- Addr# -> Int# -> Int8#
- with can_fail = True
-
-primop IndexOffAddrOp_Int16 "indexInt16OffAddr#" GenPrimOp
- Addr# -> Int# -> Int16#
- with can_fail = True
-
-primop IndexOffAddrOp_Int32 "indexInt32OffAddr#" GenPrimOp
- Addr# -> Int# -> Int32#
- with can_fail = True
-
-primop IndexOffAddrOp_Int64 "indexInt64OffAddr#" GenPrimOp
- Addr# -> Int# -> Int64#
- with can_fail = True
-
-primop IndexOffAddrOp_Word8 "indexWord8OffAddr#" GenPrimOp
- Addr# -> Int# -> Word8#
- with can_fail = True
-
-primop IndexOffAddrOp_Word16 "indexWord16OffAddr#" GenPrimOp
- Addr# -> Int# -> Word16#
- with can_fail = True
-
-primop IndexOffAddrOp_Word32 "indexWord32OffAddr#" GenPrimOp
- Addr# -> Int# -> Word32#
- with can_fail = True
-
-primop IndexOffAddrOp_Word64 "indexWord64OffAddr#" GenPrimOp
- Addr# -> Int# -> Word64#
- with can_fail = True
-
-primop ReadOffAddrOp_Char "readCharOffAddr#" GenPrimOp
- Addr# -> Int# -> State# s -> (# State# s, Char# #)
- {Reads 8-bit character; offset in bytes.}
- with has_side_effects = True
- can_fail = True
-
-primop ReadOffAddrOp_WideChar "readWideCharOffAddr#" GenPrimOp
- Addr# -> Int# -> State# s -> (# State# s, Char# #)
- {Reads 31-bit character; offset in 4-byte words.}
- with has_side_effects = True
- can_fail = True
-
-primop ReadOffAddrOp_Int "readIntOffAddr#" GenPrimOp
- Addr# -> Int# -> State# s -> (# State# s, Int# #)
- with has_side_effects = True
- can_fail = True
-
-primop ReadOffAddrOp_Word "readWordOffAddr#" GenPrimOp
- Addr# -> Int# -> State# s -> (# State# s, Word# #)
- with has_side_effects = True
- can_fail = True
-
-primop ReadOffAddrOp_Addr "readAddrOffAddr#" GenPrimOp
- Addr# -> Int# -> State# s -> (# State# s, Addr# #)
- with has_side_effects = True
- can_fail = True
-
-primop ReadOffAddrOp_Float "readFloatOffAddr#" GenPrimOp
- Addr# -> Int# -> State# s -> (# State# s, Float# #)
- with has_side_effects = True
- can_fail = True
-
-primop ReadOffAddrOp_Double "readDoubleOffAddr#" GenPrimOp
- Addr# -> Int# -> State# s -> (# State# s, Double# #)
- with has_side_effects = True
- can_fail = True
-
-primop ReadOffAddrOp_StablePtr "readStablePtrOffAddr#" GenPrimOp
- Addr# -> Int# -> State# s -> (# State# s, StablePtr# a #)
- with has_side_effects = True
- can_fail = True
-
-primop ReadOffAddrOp_Int8 "readInt8OffAddr#" GenPrimOp
- Addr# -> Int# -> State# s -> (# State# s, Int8# #)
- with has_side_effects = True
- can_fail = True
-
-primop ReadOffAddrOp_Int16 "readInt16OffAddr#" GenPrimOp
- Addr# -> Int# -> State# s -> (# State# s, Int16# #)
- with has_side_effects = True
- can_fail = True
-
-primop ReadOffAddrOp_Int32 "readInt32OffAddr#" GenPrimOp
- Addr# -> Int# -> State# s -> (# State# s, Int32# #)
- with has_side_effects = True
- can_fail = True
-
-primop ReadOffAddrOp_Int64 "readInt64OffAddr#" GenPrimOp
- Addr# -> Int# -> State# s -> (# State# s, Int64# #)
- with has_side_effects = True
- can_fail = True
-
-primop ReadOffAddrOp_Word8 "readWord8OffAddr#" GenPrimOp
- Addr# -> Int# -> State# s -> (# State# s, Word8# #)
- with has_side_effects = True
- can_fail = True
-
-primop ReadOffAddrOp_Word16 "readWord16OffAddr#" GenPrimOp
- Addr# -> Int# -> State# s -> (# State# s, Word16# #)
- with has_side_effects = True
- can_fail = True
-
-primop ReadOffAddrOp_Word32 "readWord32OffAddr#" GenPrimOp
- Addr# -> Int# -> State# s -> (# State# s, Word32# #)
- with has_side_effects = True
- can_fail = True
-
-primop ReadOffAddrOp_Word64 "readWord64OffAddr#" GenPrimOp
- Addr# -> Int# -> State# s -> (# State# s, Word64# #)
- with has_side_effects = True
- can_fail = True
-
-primop WriteOffAddrOp_Char "writeCharOffAddr#" GenPrimOp
- Addr# -> Int# -> Char# -> State# s -> State# s
- with has_side_effects = True
- can_fail = True
-
-primop WriteOffAddrOp_WideChar "writeWideCharOffAddr#" GenPrimOp
- Addr# -> Int# -> Char# -> State# s -> State# s
- with has_side_effects = True
- can_fail = True
-
-primop WriteOffAddrOp_Int "writeIntOffAddr#" GenPrimOp
- Addr# -> Int# -> Int# -> State# s -> State# s
- with has_side_effects = True
- can_fail = True
-
-primop WriteOffAddrOp_Word "writeWordOffAddr#" GenPrimOp
- Addr# -> Int# -> Word# -> State# s -> State# s
- with has_side_effects = True
- can_fail = True
-
-primop WriteOffAddrOp_Addr "writeAddrOffAddr#" GenPrimOp
- Addr# -> Int# -> Addr# -> State# s -> State# s
- with has_side_effects = True
- can_fail = True
-
-primop WriteOffAddrOp_Float "writeFloatOffAddr#" GenPrimOp
- Addr# -> Int# -> Float# -> State# s -> State# s
- with has_side_effects = True
- can_fail = True
-
-primop WriteOffAddrOp_Double "writeDoubleOffAddr#" GenPrimOp
- Addr# -> Int# -> Double# -> State# s -> State# s
- with has_side_effects = True
- can_fail = True
-
-primop WriteOffAddrOp_StablePtr "writeStablePtrOffAddr#" GenPrimOp
- Addr# -> Int# -> StablePtr# a -> State# s -> State# s
- with has_side_effects = True
- can_fail = True
-
-primop WriteOffAddrOp_Int8 "writeInt8OffAddr#" GenPrimOp
- Addr# -> Int# -> Int8# -> State# s -> State# s
- with has_side_effects = True
- can_fail = True
-
-primop WriteOffAddrOp_Int16 "writeInt16OffAddr#" GenPrimOp
- Addr# -> Int# -> Int16# -> State# s -> State# s
- with has_side_effects = True
- can_fail = True
-
-primop WriteOffAddrOp_Int32 "writeInt32OffAddr#" GenPrimOp
- Addr# -> Int# -> Int32# -> State# s -> State# s
- with has_side_effects = True
- can_fail = True
-
-primop WriteOffAddrOp_Int64 "writeInt64OffAddr#" GenPrimOp
- Addr# -> Int# -> Int64# -> State# s -> State# s
- with has_side_effects = True
- can_fail = True
-
-primop WriteOffAddrOp_Word8 "writeWord8OffAddr#" GenPrimOp
- Addr# -> Int# -> Word8# -> State# s -> State# s
- with has_side_effects = True
- can_fail = True
-
-primop WriteOffAddrOp_Word16 "writeWord16OffAddr#" GenPrimOp
- Addr# -> Int# -> Word16# -> State# s -> State# s
- with has_side_effects = True
- can_fail = True
-
-primop WriteOffAddrOp_Word32 "writeWord32OffAddr#" GenPrimOp
- Addr# -> Int# -> Word32# -> State# s -> State# s
- with has_side_effects = True
- can_fail = True
-
-primop WriteOffAddrOp_Word64 "writeWord64OffAddr#" GenPrimOp
- Addr# -> Int# -> Word64# -> State# s -> State# s
- with has_side_effects = True
- can_fail = True
+#include "addr-access-ops.txt.pp"
primop InterlockedExchange_Addr "atomicExchangeAddrAddr#" GenPrimOp
Addr# -> Addr# -> State# s -> (# State# s, Addr# #)
=====================================
hadrian/src/Rules/Generate.hs
=====================================
@@ -32,6 +32,17 @@ primopsSource = "compiler/GHC/Builtin/primops.txt.pp"
primopsTxt :: Stage -> FilePath
primopsTxt stage = buildDir (vanillaContext stage compiler) -/- "primops.txt"
+accessOpsSource :: FilePath
+accessOpsSource = "compiler/GHC/Builtin/gen_bytearray_addr_access_ops.py"
+
+byteArrayAccessOpsTxt :: Stage -> FilePath
+byteArrayAccessOpsTxt stage
+ = buildDir (vanillaContext stage compiler) -/- "bytearray-access-ops.txt.pp"
+
+addrAccessOpsTxt :: Stage -> FilePath
+addrAccessOpsTxt stage
+ = buildDir (vanillaContext stage compiler) -/- "addr-access-ops.txt.pp"
+
isGeneratedCmmFile :: FilePath -> Bool
isGeneratedCmmFile file = takeBaseName file == "AutoApply"
@@ -142,8 +153,21 @@ generatePackageCode context@(Context stage pkg _ _) = do
root -/- "**" -/- dir -/- "GHC/Platform/Host.hs" %> go generatePlatformHostHs
when (pkg == compiler) $ do
+ let ba_ops_txt = root -/- byteArrayAccessOpsTxt stage
+ let addr_ops_txt = root -/- addrAccessOpsTxt stage
+ ba_ops_txt %> \file -> do
+ need [accessOpsSource]
+ runBuilder Python
+ [accessOpsSource, "bytearray-access-ops", file]
+ [] []
+ addr_ops_txt %> \file -> do
+ need [accessOpsSource]
+ runBuilder Python
+ [accessOpsSource, "addr-access-ops", file]
+ [] []
root -/- primopsTxt stage %> \file -> do
- need $ [primopsSource]
+ need $ [primopsSource, ba_ops_txt, addr_ops_txt]
+ -- ba_ops_txt and addr_ops_txt get #include-d
build $ target context HsCpp [primopsSource] [file]
when (pkg == rts) $ do
=====================================
rts/gen_event_types.py
=====================================
@@ -157,7 +157,7 @@ def generate_event_types_array() -> str:
pr = lambda s: x.append(s)
pr('/*')
- pr(' * Do not edit: This file is generated by event_types.py')
+ pr(' * Do not edit: This file is generated by gen_event_types.py')
pr(' */')
pr('')
pr('EventType eventTypes[] = {')
@@ -184,7 +184,7 @@ def generate_event_types_defines() -> str:
pr = lambda s: x.append(s)
pr('/*')
- pr(' * Do not edit: This file is generated by event_types.py')
+ pr(' * Do not edit: This file is generated by gen_event_types.py')
pr(' */')
pr('')
pr('#pragma once')
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/ccd168439df6c49549ab429c082656438fe3b8ed
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/ccd168439df6c49549ab429c082656438fe3b8ed
You're receiving this email because of your account on gitlab.haskell.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-commits/attachments/20230528/f15485e5/attachment-0001.html>
More information about the ghc-commits
mailing list