module LLVM.Core.Attribute (
    zeroext,
    signext,
    inreg,
    byval,
    sret,
    align,
    noalias,
    nocapture,
    nest,
    returned,
    nonnull,
    dereferenceable,
    dereferenceableOrNull,
    swiftself,
    swifterror,
    immarg,
    alignstack,
    allocsize,
    alwaysinline,
    builtin,
    cold,
    convergent,
    inaccessiblememonly,
    inaccessiblememOrArgmemonly,
    inlinehint,
    jumptable,
    minsize,
    naked,
    noJumpTables,
    nobuiltin,
    noduplicate,
    nofree,
    noimplicitfloat,
    noinline,
    nonlazybind,
    noredzone,
    indirectTlsSegRefs,
    noreturn,
    norecurse,
    willreturn,
    nosync,
    nounwind,
    nullPointerIsValid,
    optforfuzzing,
    optnone,
    optsize,
    patchableFunction,
    probeStack,
    readnone,
    readonly,
    stackProbeSize,
    noStackArgProbe,
    writeonly,
    argmemonly,
    returnsTwice,
    safestack,
    sanitizeAddress,
    sanitizeMemory,
    sanitizeThread,
    sanitizeHwaddress,
    sanitizeMemtag,
    speculativeLoadHardening,
    speculatable,
    ssp,
    sspreq,
    sspstrong,
    strictfp,
    uwtable,
    nocfCheck,
    shadowcallstack,
    ) where

import LLVM.Core.CodeGen (Attribute(Attribute))

import qualified LLVM.FFI.Core.Attribute as Attr

import Data.Word (Word64)


simple :: Attr.Name -> Attribute
simple name = Attribute name 0

withParam :: Attr.Name -> Word64 -> Attribute
withParam = Attribute

-- * Parameter attributes

zeroext :: Attribute
zeroext = simple Attr.zeroext

signext :: Attribute
signext = simple Attr.signext

inreg :: Attribute
inreg = simple Attr.inreg

byval :: Attribute
byval = simple Attr.byval

sret :: Attribute
sret = simple Attr.sret

align :: Word64 -> Attribute
align = withParam Attr.align

noalias :: Attribute
noalias = simple Attr.noalias

nocapture :: Attribute
nocapture = simple Attr.nocapture

nest :: Attribute
nest = simple Attr.nest

returned :: Attribute
returned = simple Attr.returned

nonnull :: Attribute
nonnull = simple Attr.nonnull

dereferenceable :: Word64 -> Attribute
dereferenceable = withParam Attr.dereferenceable

dereferenceableOrNull :: Word64 -> Attribute
dereferenceableOrNull = withParam Attr.dereferenceableOrNull

swiftself :: Attribute
swiftself = simple Attr.swiftself

swifterror :: Attribute
swifterror = simple Attr.swifterror

immarg :: Attribute
immarg = simple Attr.immarg


-- * Function attributes

alignstack :: Word64 -> Attribute
alignstack = withParam Attr.alignstack

allocsize :: Attribute
allocsize = simple Attr.allocsize

alwaysinline :: Attribute
alwaysinline = simple Attr.alwaysinline

builtin :: Attribute
builtin = simple Attr.builtin

cold :: Attribute
cold = simple Attr.cold

convergent :: Attribute
convergent = simple Attr.convergent

inaccessiblememonly :: Attribute
inaccessiblememonly = simple Attr.inaccessiblememonly

inaccessiblememOrArgmemonly :: Attribute
inaccessiblememOrArgmemonly = simple Attr.inaccessiblememOrArgmemonly

inlinehint :: Attribute
inlinehint = simple Attr.inlinehint

jumptable :: Attribute
jumptable = simple Attr.jumptable

minsize :: Attribute
minsize = simple Attr.minsize

naked :: Attribute
naked = simple Attr.naked

noJumpTables :: Attribute
noJumpTables = simple Attr.noJumpTables

nobuiltin :: Attribute
nobuiltin = simple Attr.nobuiltin

noduplicate :: Attribute
noduplicate = simple Attr.noduplicate

nofree :: Attribute
nofree = simple Attr.nofree

noimplicitfloat :: Attribute
noimplicitfloat = simple Attr.noimplicitfloat

noinline :: Attribute
noinline = simple Attr.noinline

nonlazybind :: Attribute
nonlazybind = simple Attr.nonlazybind

noredzone :: Attribute
noredzone = simple Attr.noredzone

indirectTlsSegRefs :: Attribute
indirectTlsSegRefs = simple Attr.indirectTlsSegRefs

noreturn :: Attribute
noreturn = simple Attr.noreturn

norecurse :: Attribute
norecurse = simple Attr.norecurse

willreturn :: Attribute
willreturn = simple Attr.willreturn

nosync :: Attribute
nosync = simple Attr.nosync

nounwind :: Attribute
nounwind = simple Attr.nounwind

nullPointerIsValid :: Attribute
nullPointerIsValid = simple Attr.nullPointerIsValid

optforfuzzing :: Attribute
optforfuzzing = simple Attr.optforfuzzing

optnone :: Attribute
optnone = simple Attr.optnone

optsize :: Attribute
optsize = simple Attr.optsize

patchableFunction :: Attribute
patchableFunction = simple Attr.patchableFunction

probeStack :: Attribute
probeStack = simple Attr.probeStack

readnone :: Attribute
readnone = simple Attr.readnone

readonly :: Attribute
readonly = simple Attr.readonly

stackProbeSize :: Attribute
stackProbeSize = simple Attr.stackProbeSize

noStackArgProbe :: Attribute
noStackArgProbe = simple Attr.noStackArgProbe

writeonly :: Attribute
writeonly = simple Attr.writeonly

argmemonly :: Attribute
argmemonly = simple Attr.argmemonly

returnsTwice :: Attribute
returnsTwice = simple Attr.returnsTwice

safestack :: Attribute
safestack = simple Attr.safestack

sanitizeAddress :: Attribute
sanitizeAddress = simple Attr.sanitizeAddress

sanitizeMemory :: Attribute
sanitizeMemory = simple Attr.sanitizeMemory

sanitizeThread :: Attribute
sanitizeThread = simple Attr.sanitizeThread

sanitizeHwaddress :: Attribute
sanitizeHwaddress = simple Attr.sanitizeHwaddress

sanitizeMemtag :: Attribute
sanitizeMemtag = simple Attr.sanitizeMemtag

speculativeLoadHardening :: Attribute
speculativeLoadHardening = simple Attr.speculativeLoadHardening

speculatable :: Attribute
speculatable = simple Attr.speculatable

ssp :: Attribute
ssp = simple Attr.ssp

sspreq :: Attribute
sspreq = simple Attr.sspreq

sspstrong :: Attribute
sspstrong = simple Attr.sspstrong

strictfp :: Attribute
strictfp = simple Attr.strictfp

uwtable :: Attribute
uwtable = simple Attr.uwtable

nocfCheck :: Attribute
nocfCheck = simple Attr.nocfCheck

shadowcallstack :: Attribute
shadowcallstack = simple Attr.shadowcallstack