Skip to main content

rustc_codegen_llvm/llvm/
ffi.rs

1//! Bindings to the LLVM-C API (`LLVM*`), and to our own `extern "C"` wrapper
2//! functions around the unstable LLVM C++ API (`LLVMRust*`).
3//!
4//! ## Passing pointer/length strings as `*const c_uchar` (PTR_LEN_STR)
5//!
6//! Normally it's a good idea for Rust-side bindings to match the corresponding
7//! C-side function declarations as closely as possible. But when passing `&str`
8//! or `&[u8]` data as a pointer/length pair, it's more convenient to declare
9//! the Rust-side pointer as `*const c_uchar` instead of `*const c_char`.
10//! Both pointer types have the same ABI, and using `*const c_uchar` avoids
11//! the need for an extra cast from `*const u8` on the Rust side.
12
13#![allow(non_camel_case_types)]
14
15use std::fmt::{self, Debug};
16use std::marker::PhantomData;
17use std::num::NonZero;
18use std::ptr;
19
20use bitflags::bitflags;
21use libc::{c_char, c_int, c_uchar, c_uint, c_ulonglong, c_void, size_t};
22
23use super::RustString;
24use super::debuginfo::{
25    DIArray, DIBuilder, DIDerivedType, DIDescriptor, DIFile, DIFlags, DILocation, DISPFlags,
26    DIScope, DISubprogram, DITemplateTypeParameter, DIType, DebugEmissionKind, DebugNameTableKind,
27};
28use crate::llvm::MetadataKindId;
29use crate::{TryFromU32, llvm};
30
31/// In the LLVM-C API, boolean values are passed as `typedef int LLVMBool`,
32/// which has a different ABI from Rust or C++ `bool`.
33///
34/// This wrapper does not implement `PartialEq`.
35/// To test the underlying boolean value, use [`Self::is_true`].
36#[derive(#[automatically_derived]
impl ::core::clone::Clone for Bool {
    #[inline]
    fn clone(&self) -> Bool {
        let _: ::core::clone::AssertParamIsClone<c_int>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for Bool { }Copy)]
37#[repr(transparent)]
38pub(crate) struct Bool {
39    value: c_int,
40}
41
42pub(crate) const TRUE: Bool = Bool::TRUE;
43pub(crate) const FALSE: Bool = Bool::FALSE;
44
45impl Bool {
46    pub(crate) const TRUE: Self = Self { value: 1 };
47    pub(crate) const FALSE: Self = Self { value: 0 };
48
49    pub(crate) const fn from_bool(rust_bool: bool) -> Self {
50        if rust_bool { Self::TRUE } else { Self::FALSE }
51    }
52
53    /// Converts this LLVM-C boolean to a Rust `bool`
54    pub(crate) fn is_true(self) -> bool {
55        // Since we're interacting with a C API, follow the C convention of
56        // treating any nonzero value as true.
57        self.value != Self::FALSE.value
58    }
59}
60
61impl Debug for Bool {
62    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
63        match self.value {
64            0 => f.write_str("FALSE"),
65            1 => f.write_str("TRUE"),
66            // As with `Self::is_true`, treat any nonzero value as true.
67            v => f.write_fmt(format_args!("TRUE ({0})", v))write!(f, "TRUE ({v})"),
68        }
69    }
70}
71
72/// Convenience trait to convert `bool` to `llvm::Bool` with an explicit method call.
73///
74/// Being able to write `b.to_llvm_bool()` is less noisy than `llvm::Bool::from(b)`,
75/// while being more explicit and less mistake-prone than something like `b.into()`.
76pub(crate) trait ToLlvmBool: Copy {
77    fn to_llvm_bool(self) -> llvm::Bool;
78}
79
80impl ToLlvmBool for bool {
81    #[inline(always)]
82    fn to_llvm_bool(self) -> llvm::Bool {
83        llvm::Bool::from_bool(self)
84    }
85}
86
87/// Wrapper for a raw enum value returned from LLVM's C APIs.
88///
89/// For C enums returned by LLVM, it's risky to use a Rust enum as the return
90/// type, because it would be UB if a later version of LLVM adds a new enum
91/// value and returns it. Instead, return this raw wrapper, then convert to the
92/// Rust-side enum explicitly.
93#[repr(transparent)]
94pub(crate) struct RawEnum<T> {
95    value: u32,
96    /// We don't own or consume a `T`, but we can produce one.
97    _rust_side_type: PhantomData<fn() -> T>,
98}
99
100impl<T: TryFrom<u32>> RawEnum<T> {
101    #[track_caller]
102    pub(crate) fn to_rust(self) -> T
103    where
104        T::Error: Debug,
105    {
106        // If this fails, the Rust-side enum is out of sync with LLVM's enum.
107        T::try_from(self.value).expect("enum value returned by LLVM should be known")
108    }
109}
110
111#[derive(#[automatically_derived]
#[allow(dead_code)]
impl ::core::marker::Copy for LLVMRustResult { }Copy, #[automatically_derived]
#[allow(dead_code)]
impl ::core::clone::Clone for LLVMRustResult {
    #[inline]
    fn clone(&self) -> LLVMRustResult { *self }
}Clone, #[automatically_derived]
#[allow(dead_code)]
impl ::core::cmp::PartialEq for LLVMRustResult {
    #[inline]
    fn eq(&self, other: &LLVMRustResult) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq)]
112#[repr(C)]
113#[allow(dead_code)] // Variants constructed by C++.
114pub(crate) enum LLVMRustResult {
115    Success,
116    Failure,
117}
118
119/// Must match the layout of `LLVMRustModuleFlagMergeBehavior`.
120///
121/// When merging modules (e.g. during LTO), their metadata flags are combined. Conflicts are
122/// resolved according to the merge behaviors specified here. Flags differing only in merge
123/// behavior are still considered to be in conflict.
124///
125/// In order for Rust-C LTO to work, we must specify behaviors compatible with Clang. Notably,
126/// 'Error' and 'Warning' cannot be mixed for a given flag.
127///
128/// There is a stable LLVM-C version of this enum (`LLVMModuleFlagBehavior`),
129/// but as of LLVM 19 it does not support all of the enum values in the unstable
130/// C++ API.
131#[derive(#[automatically_derived]
impl ::core::marker::Copy for ModuleFlagMergeBehavior { }Copy, #[automatically_derived]
impl ::core::clone::Clone for ModuleFlagMergeBehavior {
    #[inline]
    fn clone(&self) -> ModuleFlagMergeBehavior { *self }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for ModuleFlagMergeBehavior {
    #[inline]
    fn eq(&self, other: &ModuleFlagMergeBehavior) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq)]
132#[repr(C)]
133pub(crate) enum ModuleFlagMergeBehavior {
134    Error = 1,
135    Warning = 2,
136    Require = 3,
137    Override = 4,
138    Append = 5,
139    AppendUnique = 6,
140    Max = 7,
141    Min = 8,
142}
143
144// Consts for the LLVM CallConv type, pre-cast to usize.
145
146/// Must match the layout of `LLVMTailCallKind`.
147#[derive(#[automatically_derived]
#[allow(dead_code)]
impl ::core::marker::Copy for TailCallKind { }Copy, #[automatically_derived]
#[allow(dead_code)]
impl ::core::clone::Clone for TailCallKind {
    #[inline]
    fn clone(&self) -> TailCallKind { *self }
}Clone, #[automatically_derived]
#[allow(dead_code)]
impl ::core::cmp::PartialEq for TailCallKind {
    #[inline]
    fn eq(&self, other: &TailCallKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[automatically_derived]
#[allow(dead_code)]
impl ::core::fmt::Debug for TailCallKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                TailCallKind::None => "None",
                TailCallKind::Tail => "Tail",
                TailCallKind::MustTail => "MustTail",
                TailCallKind::NoTail => "NoTail",
            })
    }
}Debug)]
148#[repr(C)]
149#[allow(dead_code)]
150pub(crate) enum TailCallKind {
151    None = 0,
152    Tail = 1,
153    MustTail = 2,
154    NoTail = 3,
155}
156
157/// LLVM CallingConv::ID. Should we wrap this?
158///
159/// See <https://github.com/llvm/llvm-project/blob/main/llvm/include/llvm/IR/CallingConv.h>
160#[derive(#[automatically_derived]
impl ::core::marker::Copy for CallConv { }Copy, #[automatically_derived]
impl ::core::clone::Clone for CallConv {
    #[inline]
    fn clone(&self) -> CallConv { *self }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for CallConv {
    #[inline]
    fn eq(&self, other: &CallConv) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[automatically_derived]
impl ::core::fmt::Debug for CallConv {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                CallConv::CCallConv => "CCallConv",
                CallConv::FastCallConv => "FastCallConv",
                CallConv::ColdCallConv => "ColdCallConv",
                CallConv::PreserveMost => "PreserveMost",
                CallConv::PreserveAll => "PreserveAll",
                CallConv::SwiftCallConv => "SwiftCallConv",
                CallConv::Tail => "Tail",
                CallConv::PreserveNone => "PreserveNone",
                CallConv::X86StdcallCallConv => "X86StdcallCallConv",
                CallConv::X86FastcallCallConv => "X86FastcallCallConv",
                CallConv::ArmAapcsCallConv => "ArmAapcsCallConv",
                CallConv::Msp430Intr => "Msp430Intr",
                CallConv::X86_ThisCall => "X86_ThisCall",
                CallConv::PtxKernel => "PtxKernel",
                CallConv::X86_64_SysV => "X86_64_SysV",
                CallConv::X86_64_Win64 => "X86_64_Win64",
                CallConv::X86_VectorCall => "X86_VectorCall",
                CallConv::X86_Intr => "X86_Intr",
                CallConv::AvrNonBlockingInterrupt =>
                    "AvrNonBlockingInterrupt",
                CallConv::AvrInterrupt => "AvrInterrupt",
                CallConv::AmdgpuKernel => "AmdgpuKernel",
            })
    }
}Debug, impl ::core::convert::TryFrom<u32> for CallConv {
    type Error = u32;
    #[allow(deprecated)]
    fn try_from(value: u32) -> ::core::result::Result<CallConv, Self::Error> {
        if value == const { CallConv::CCallConv as u32 } {
            return Ok(CallConv::CCallConv)
        }
        if value == const { CallConv::FastCallConv as u32 } {
            return Ok(CallConv::FastCallConv)
        }
        if value == const { CallConv::ColdCallConv as u32 } {
            return Ok(CallConv::ColdCallConv)
        }
        if value == const { CallConv::PreserveMost as u32 } {
            return Ok(CallConv::PreserveMost)
        }
        if value == const { CallConv::PreserveAll as u32 } {
            return Ok(CallConv::PreserveAll)
        }
        if value == const { CallConv::SwiftCallConv as u32 } {
            return Ok(CallConv::SwiftCallConv)
        }
        if value == const { CallConv::Tail as u32 } {
            return Ok(CallConv::Tail)
        }
        if value == const { CallConv::PreserveNone as u32 } {
            return Ok(CallConv::PreserveNone)
        }
        if value == const { CallConv::X86StdcallCallConv as u32 } {
            return Ok(CallConv::X86StdcallCallConv)
        }
        if value == const { CallConv::X86FastcallCallConv as u32 } {
            return Ok(CallConv::X86FastcallCallConv)
        }
        if value == const { CallConv::ArmAapcsCallConv as u32 } {
            return Ok(CallConv::ArmAapcsCallConv)
        }
        if value == const { CallConv::Msp430Intr as u32 } {
            return Ok(CallConv::Msp430Intr)
        }
        if value == const { CallConv::X86_ThisCall as u32 } {
            return Ok(CallConv::X86_ThisCall)
        }
        if value == const { CallConv::PtxKernel as u32 } {
            return Ok(CallConv::PtxKernel)
        }
        if value == const { CallConv::X86_64_SysV as u32 } {
            return Ok(CallConv::X86_64_SysV)
        }
        if value == const { CallConv::X86_64_Win64 as u32 } {
            return Ok(CallConv::X86_64_Win64)
        }
        if value == const { CallConv::X86_VectorCall as u32 } {
            return Ok(CallConv::X86_VectorCall)
        }
        if value == const { CallConv::X86_Intr as u32 } {
            return Ok(CallConv::X86_Intr)
        }
        if value == const { CallConv::AvrNonBlockingInterrupt as u32 } {
            return Ok(CallConv::AvrNonBlockingInterrupt)
        }
        if value == const { CallConv::AvrInterrupt as u32 } {
            return Ok(CallConv::AvrInterrupt)
        }
        if value == const { CallConv::AmdgpuKernel as u32 } {
            return Ok(CallConv::AmdgpuKernel)
        }
        Err(value)
    }
}TryFromU32)]
161#[repr(C)]
162pub(crate) enum CallConv {
163    CCallConv = 0,
164    FastCallConv = 8,
165    ColdCallConv = 9,
166    PreserveMost = 14,
167    PreserveAll = 15,
168    SwiftCallConv = 16,
169    Tail = 18,
170    PreserveNone = 21,
171    X86StdcallCallConv = 64,
172    X86FastcallCallConv = 65,
173    ArmAapcsCallConv = 67,
174    Msp430Intr = 69,
175    X86_ThisCall = 70,
176    PtxKernel = 71,
177    X86_64_SysV = 78,
178    X86_64_Win64 = 79,
179    X86_VectorCall = 80,
180    X86_Intr = 83,
181    AvrNonBlockingInterrupt = 84,
182    AvrInterrupt = 85,
183    AmdgpuKernel = 91,
184}
185
186/// Must match the layout of `LLVMLinkage`.
187#[derive(#[automatically_derived]
impl ::core::marker::Copy for Linkage { }Copy, #[automatically_derived]
impl ::core::clone::Clone for Linkage {
    #[inline]
    fn clone(&self) -> Linkage { *self }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for Linkage {
    #[inline]
    fn eq(&self, other: &Linkage) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, impl ::core::convert::TryFrom<u32> for Linkage {
    type Error = u32;
    #[allow(deprecated)]
    fn try_from(value: u32) -> ::core::result::Result<Linkage, Self::Error> {
        if value == const { Linkage::ExternalLinkage as u32 } {
            return Ok(Linkage::ExternalLinkage)
        }
        if value == const { Linkage::AvailableExternallyLinkage as u32 } {
            return Ok(Linkage::AvailableExternallyLinkage)
        }
        if value == const { Linkage::LinkOnceAnyLinkage as u32 } {
            return Ok(Linkage::LinkOnceAnyLinkage)
        }
        if value == const { Linkage::LinkOnceODRLinkage as u32 } {
            return Ok(Linkage::LinkOnceODRLinkage)
        }
        if value == const { Linkage::LinkOnceODRAutoHideLinkage as u32 } {
            return Ok(Linkage::LinkOnceODRAutoHideLinkage)
        }
        if value == const { Linkage::WeakAnyLinkage as u32 } {
            return Ok(Linkage::WeakAnyLinkage)
        }
        if value == const { Linkage::WeakODRLinkage as u32 } {
            return Ok(Linkage::WeakODRLinkage)
        }
        if value == const { Linkage::AppendingLinkage as u32 } {
            return Ok(Linkage::AppendingLinkage)
        }
        if value == const { Linkage::InternalLinkage as u32 } {
            return Ok(Linkage::InternalLinkage)
        }
        if value == const { Linkage::PrivateLinkage as u32 } {
            return Ok(Linkage::PrivateLinkage)
        }
        if value == const { Linkage::DLLImportLinkage as u32 } {
            return Ok(Linkage::DLLImportLinkage)
        }
        if value == const { Linkage::DLLExportLinkage as u32 } {
            return Ok(Linkage::DLLExportLinkage)
        }
        if value == const { Linkage::ExternalWeakLinkage as u32 } {
            return Ok(Linkage::ExternalWeakLinkage)
        }
        if value == const { Linkage::GhostLinkage as u32 } {
            return Ok(Linkage::GhostLinkage)
        }
        if value == const { Linkage::CommonLinkage as u32 } {
            return Ok(Linkage::CommonLinkage)
        }
        if value == const { Linkage::LinkerPrivateLinkage as u32 } {
            return Ok(Linkage::LinkerPrivateLinkage)
        }
        if value == const { Linkage::LinkerPrivateWeakLinkage as u32 } {
            return Ok(Linkage::LinkerPrivateWeakLinkage)
        }
        Err(value)
    }
}TryFromU32)]
188#[repr(C)]
189pub(crate) enum Linkage {
190    ExternalLinkage = 0,
191    AvailableExternallyLinkage = 1,
192    LinkOnceAnyLinkage = 2,
193    LinkOnceODRLinkage = 3,
194    #[deprecated = "marked obsolete by LLVM"]
195    LinkOnceODRAutoHideLinkage = 4,
196    WeakAnyLinkage = 5,
197    WeakODRLinkage = 6,
198    AppendingLinkage = 7,
199    InternalLinkage = 8,
200    PrivateLinkage = 9,
201    #[deprecated = "marked obsolete by LLVM"]
202    DLLImportLinkage = 10,
203    #[deprecated = "marked obsolete by LLVM"]
204    DLLExportLinkage = 11,
205    ExternalWeakLinkage = 12,
206    #[deprecated = "marked obsolete by LLVM"]
207    GhostLinkage = 13,
208    CommonLinkage = 14,
209    LinkerPrivateLinkage = 15,
210    LinkerPrivateWeakLinkage = 16,
211}
212
213/// Must match the layout of `LLVMVisibility`.
214#[repr(C)]
215#[derive(#[automatically_derived]
impl ::core::marker::Copy for Visibility { }Copy, #[automatically_derived]
impl ::core::clone::Clone for Visibility {
    #[inline]
    fn clone(&self) -> Visibility { *self }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for Visibility {
    #[inline]
    fn eq(&self, other: &Visibility) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, impl ::core::convert::TryFrom<u32> for Visibility {
    type Error = u32;
    #[allow(deprecated)]
    fn try_from(value: u32)
        -> ::core::result::Result<Visibility, Self::Error> {
        if value == const { Visibility::Default as u32 } {
            return Ok(Visibility::Default)
        }
        if value == const { Visibility::Hidden as u32 } {
            return Ok(Visibility::Hidden)
        }
        if value == const { Visibility::Protected as u32 } {
            return Ok(Visibility::Protected)
        }
        Err(value)
    }
}TryFromU32)]
216pub(crate) enum Visibility {
217    Default = 0,
218    Hidden = 1,
219    Protected = 2,
220}
221
222/// LLVMUnnamedAddr
223#[repr(C)]
224pub(crate) enum UnnamedAddr {
225    No,
226    #[expect(dead_code)]
227    Local,
228    Global,
229}
230
231/// LLVMDLLStorageClass
232#[derive(#[automatically_derived]
impl ::core::marker::Copy for DLLStorageClass { }Copy, #[automatically_derived]
impl ::core::clone::Clone for DLLStorageClass {
    #[inline]
    fn clone(&self) -> DLLStorageClass { *self }
}Clone)]
233#[repr(C)]
234pub(crate) enum DLLStorageClass {
235    #[allow(dead_code)]
236    Default = 0,
237    DllImport = 1, // Function to be imported from DLL.
238    #[allow(dead_code)]
239    DllExport = 2, // Function to be accessible from DLL.
240}
241
242/// Must match the layout of `llvm::UWTableKind`.
243#[derive(#[automatically_derived]
impl ::core::marker::Copy for UWTableKind { }Copy, #[automatically_derived]
impl ::core::clone::Clone for UWTableKind {
    #[inline]
    fn clone(&self) -> UWTableKind { *self }
}Clone)]
244#[repr(C)]
245pub(crate) enum UWTableKind {
246    /// No unwind table requested
247    None = 0,
248    /// "Synchronous" unwind tables
249    Sync = 1,
250    /// "Asynchronous" unwind tables (instr precise)
251    Async = 2,
252}
253
254/// Must match the layout of `llvm::FramePointerKind`.
255#[repr(C)]
256#[derive(#[automatically_derived]
impl ::core::marker::Copy for FramePointerKind { }Copy, #[automatically_derived]
impl ::core::clone::Clone for FramePointerKind {
    #[inline]
    fn clone(&self) -> FramePointerKind { *self }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for FramePointerKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                FramePointerKind::None => "None",
                FramePointerKind::NonLeaf => "NonLeaf",
                FramePointerKind::All => "All",
                FramePointerKind::Reserved => "Reserved",
                FramePointerKind::NonLeafNoReserve => "NonLeafNoReserve",
            })
    }
}Debug)]
257#[expect(dead_code, reason = "Some variants are unused, but are kept to match LLVM")]
258pub(crate) enum FramePointerKind {
259    None = 0,
260    NonLeaf = 1,
261    All = 2,
262    Reserved = 3,
263    NonLeafNoReserve = 4,
264}
265
266/// Must match the layout of `LLVMRustAttributeKind`.
267/// Semantically a subset of the C++ enum llvm::Attribute::AttrKind,
268/// though it is not ABI compatible (since it's a C++ enum)
269#[repr(C)]
270#[derive(#[automatically_derived]
impl ::core::marker::Copy for AttributeKind { }Copy, #[automatically_derived]
impl ::core::clone::Clone for AttributeKind {
    #[inline]
    fn clone(&self) -> AttributeKind { *self }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for AttributeKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                AttributeKind::AlwaysInline => "AlwaysInline",
                AttributeKind::ByVal => "ByVal",
                AttributeKind::Cold => "Cold",
                AttributeKind::InlineHint => "InlineHint",
                AttributeKind::MinSize => "MinSize",
                AttributeKind::Naked => "Naked",
                AttributeKind::NoAlias => "NoAlias",
                AttributeKind::CapturesAddress => "CapturesAddress",
                AttributeKind::NoInline => "NoInline",
                AttributeKind::NonNull => "NonNull",
                AttributeKind::NoRedZone => "NoRedZone",
                AttributeKind::NoReturn => "NoReturn",
                AttributeKind::NoUnwind => "NoUnwind",
                AttributeKind::OptimizeForSize => "OptimizeForSize",
                AttributeKind::ReadOnly => "ReadOnly",
                AttributeKind::SExt => "SExt",
                AttributeKind::StructRet => "StructRet",
                AttributeKind::UWTable => "UWTable",
                AttributeKind::ZExt => "ZExt",
                AttributeKind::InReg => "InReg",
                AttributeKind::SanitizeThread => "SanitizeThread",
                AttributeKind::SanitizeAddress => "SanitizeAddress",
                AttributeKind::SanitizeMemory => "SanitizeMemory",
                AttributeKind::NonLazyBind => "NonLazyBind",
                AttributeKind::OptimizeNone => "OptimizeNone",
                AttributeKind::ReadNone => "ReadNone",
                AttributeKind::SanitizeHWAddress => "SanitizeHWAddress",
                AttributeKind::WillReturn => "WillReturn",
                AttributeKind::StackProtectReq => "StackProtectReq",
                AttributeKind::StackProtectStrong => "StackProtectStrong",
                AttributeKind::StackProtect => "StackProtect",
                AttributeKind::NoUndef => "NoUndef",
                AttributeKind::SanitizeMemTag => "SanitizeMemTag",
                AttributeKind::NoCfCheck => "NoCfCheck",
                AttributeKind::ShadowCallStack => "ShadowCallStack",
                AttributeKind::AllocSize => "AllocSize",
                AttributeKind::AllocatedPointer => "AllocatedPointer",
                AttributeKind::AllocAlign => "AllocAlign",
                AttributeKind::SanitizeSafeStack => "SanitizeSafeStack",
                AttributeKind::FnRetThunkExtern => "FnRetThunkExtern",
                AttributeKind::Writable => "Writable",
                AttributeKind::DeadOnUnwind => "DeadOnUnwind",
                AttributeKind::DeadOnReturn => "DeadOnReturn",
                AttributeKind::CapturesReadOnly => "CapturesReadOnly",
                AttributeKind::CapturesNone => "CapturesNone",
                AttributeKind::SanitizeRealtimeNonblocking =>
                    "SanitizeRealtimeNonblocking",
                AttributeKind::SanitizeRealtimeBlocking =>
                    "SanitizeRealtimeBlocking",
                AttributeKind::Convergent => "Convergent",
                AttributeKind::NoFree => "NoFree",
            })
    }
}Debug)]
271#[expect(dead_code, reason = "Some variants are unused, but are kept to match the C++")]
272pub(crate) enum AttributeKind {
273    AlwaysInline = 0,
274    ByVal = 1,
275    Cold = 2,
276    InlineHint = 3,
277    MinSize = 4,
278    Naked = 5,
279    NoAlias = 6,
280    CapturesAddress = 7,
281    NoInline = 8,
282    NonNull = 9,
283    NoRedZone = 10,
284    NoReturn = 11,
285    NoUnwind = 12,
286    OptimizeForSize = 13,
287    ReadOnly = 14,
288    SExt = 15,
289    StructRet = 16,
290    UWTable = 17,
291    ZExt = 18,
292    InReg = 19,
293    SanitizeThread = 20,
294    SanitizeAddress = 21,
295    SanitizeMemory = 22,
296    NonLazyBind = 23,
297    OptimizeNone = 24,
298    ReadNone = 26,
299    SanitizeHWAddress = 28,
300    WillReturn = 29,
301    StackProtectReq = 30,
302    StackProtectStrong = 31,
303    StackProtect = 32,
304    NoUndef = 33,
305    SanitizeMemTag = 34,
306    NoCfCheck = 35,
307    ShadowCallStack = 36,
308    AllocSize = 37,
309    AllocatedPointer = 38,
310    AllocAlign = 39,
311    SanitizeSafeStack = 40,
312    FnRetThunkExtern = 41,
313    Writable = 42,
314    DeadOnUnwind = 43,
315    DeadOnReturn = 44,
316    CapturesReadOnly = 45,
317    CapturesNone = 46,
318    SanitizeRealtimeNonblocking = 47,
319    SanitizeRealtimeBlocking = 48,
320    Convergent = 49,
321    NoFree = 50,
322}
323
324/// LLVMIntPredicate
325#[derive(#[automatically_derived]
impl ::core::marker::Copy for IntPredicate { }Copy, #[automatically_derived]
impl ::core::clone::Clone for IntPredicate {
    #[inline]
    fn clone(&self) -> IntPredicate { *self }
}Clone)]
326#[repr(C)]
327pub(crate) enum IntPredicate {
328    IntEQ = 32,
329    IntNE = 33,
330    IntUGT = 34,
331    IntUGE = 35,
332    IntULT = 36,
333    IntULE = 37,
334    IntSGT = 38,
335    IntSGE = 39,
336    IntSLT = 40,
337    IntSLE = 41,
338}
339
340/// LLVMRealPredicate
341#[derive(#[automatically_derived]
impl ::core::marker::Copy for RealPredicate { }Copy, #[automatically_derived]
impl ::core::clone::Clone for RealPredicate {
    #[inline]
    fn clone(&self) -> RealPredicate { *self }
}Clone)]
342#[repr(C)]
343pub(crate) enum RealPredicate {
344    RealPredicateFalse = 0,
345    RealOEQ = 1,
346    RealOGT = 2,
347    RealOGE = 3,
348    RealOLT = 4,
349    RealOLE = 5,
350    RealONE = 6,
351    RealORD = 7,
352    RealUNO = 8,
353    RealUEQ = 9,
354    RealUGT = 10,
355    RealUGE = 11,
356    RealULT = 12,
357    RealULE = 13,
358    RealUNE = 14,
359    RealPredicateTrue = 15,
360}
361
362/// Must match the layout of `LLVMTypeKind`.
363///
364/// Use [`RawEnum<TypeKind>`] for values of `LLVMTypeKind` returned from LLVM,
365/// to avoid risk of UB if LLVM adds new enum values.
366///
367/// All of LLVM's variants should be declared here, even if no Rust-side code refers
368/// to them, because unknown variants will cause [`RawEnum::to_rust`] to panic.
369#[derive(#[automatically_derived]
impl ::core::marker::Copy for TypeKind { }Copy, #[automatically_derived]
impl ::core::clone::Clone for TypeKind {
    #[inline]
    fn clone(&self) -> TypeKind { *self }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for TypeKind {
    #[inline]
    fn eq(&self, other: &TypeKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[automatically_derived]
impl ::core::fmt::Debug for TypeKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                TypeKind::Void => "Void",
                TypeKind::Half => "Half",
                TypeKind::Float => "Float",
                TypeKind::Double => "Double",
                TypeKind::X86_FP80 => "X86_FP80",
                TypeKind::FP128 => "FP128",
                TypeKind::PPC_FP128 => "PPC_FP128",
                TypeKind::Label => "Label",
                TypeKind::Integer => "Integer",
                TypeKind::Function => "Function",
                TypeKind::Struct => "Struct",
                TypeKind::Array => "Array",
                TypeKind::Pointer => "Pointer",
                TypeKind::Vector => "Vector",
                TypeKind::Metadata => "Metadata",
                TypeKind::Token => "Token",
                TypeKind::ScalableVector => "ScalableVector",
                TypeKind::BFloat => "BFloat",
                TypeKind::X86_AMX => "X86_AMX",
            })
    }
}Debug, impl ::core::convert::TryFrom<u32> for TypeKind {
    type Error = u32;
    #[allow(deprecated)]
    fn try_from(value: u32) -> ::core::result::Result<TypeKind, Self::Error> {
        if value == const { TypeKind::Void as u32 } {
            return Ok(TypeKind::Void)
        }
        if value == const { TypeKind::Half as u32 } {
            return Ok(TypeKind::Half)
        }
        if value == const { TypeKind::Float as u32 } {
            return Ok(TypeKind::Float)
        }
        if value == const { TypeKind::Double as u32 } {
            return Ok(TypeKind::Double)
        }
        if value == const { TypeKind::X86_FP80 as u32 } {
            return Ok(TypeKind::X86_FP80)
        }
        if value == const { TypeKind::FP128 as u32 } {
            return Ok(TypeKind::FP128)
        }
        if value == const { TypeKind::PPC_FP128 as u32 } {
            return Ok(TypeKind::PPC_FP128)
        }
        if value == const { TypeKind::Label as u32 } {
            return Ok(TypeKind::Label)
        }
        if value == const { TypeKind::Integer as u32 } {
            return Ok(TypeKind::Integer)
        }
        if value == const { TypeKind::Function as u32 } {
            return Ok(TypeKind::Function)
        }
        if value == const { TypeKind::Struct as u32 } {
            return Ok(TypeKind::Struct)
        }
        if value == const { TypeKind::Array as u32 } {
            return Ok(TypeKind::Array)
        }
        if value == const { TypeKind::Pointer as u32 } {
            return Ok(TypeKind::Pointer)
        }
        if value == const { TypeKind::Vector as u32 } {
            return Ok(TypeKind::Vector)
        }
        if value == const { TypeKind::Metadata as u32 } {
            return Ok(TypeKind::Metadata)
        }
        if value == const { TypeKind::Token as u32 } {
            return Ok(TypeKind::Token)
        }
        if value == const { TypeKind::ScalableVector as u32 } {
            return Ok(TypeKind::ScalableVector)
        }
        if value == const { TypeKind::BFloat as u32 } {
            return Ok(TypeKind::BFloat)
        }
        if value == const { TypeKind::X86_AMX as u32 } {
            return Ok(TypeKind::X86_AMX)
        }
        Err(value)
    }
}TryFromU32)]
370#[repr(C)]
371pub(crate) enum TypeKind {
372    Void = 0,
373    Half = 1,
374    Float = 2,
375    Double = 3,
376    X86_FP80 = 4,
377    FP128 = 5,
378    PPC_FP128 = 6,
379    Label = 7,
380    Integer = 8,
381    Function = 9,
382    Struct = 10,
383    Array = 11,
384    Pointer = 12,
385    Vector = 13,
386    Metadata = 14,
387    Token = 16,
388    ScalableVector = 17,
389    BFloat = 18,
390    X86_AMX = 19,
391}
392
393/// LLVMAtomicRmwBinOp
394#[derive(#[automatically_derived]
impl ::core::marker::Copy for AtomicRmwBinOp { }Copy, #[automatically_derived]
impl ::core::clone::Clone for AtomicRmwBinOp {
    #[inline]
    fn clone(&self) -> AtomicRmwBinOp { *self }
}Clone)]
395#[repr(C)]
396pub(crate) enum AtomicRmwBinOp {
397    AtomicXchg = 0,
398    AtomicAdd = 1,
399    AtomicSub = 2,
400    AtomicAnd = 3,
401    AtomicNand = 4,
402    AtomicOr = 5,
403    AtomicXor = 6,
404    AtomicMax = 7,
405    AtomicMin = 8,
406    AtomicUMax = 9,
407    AtomicUMin = 10,
408}
409
410/// LLVMAtomicOrdering
411#[derive(#[automatically_derived]
impl ::core::marker::Copy for AtomicOrdering { }Copy, #[automatically_derived]
impl ::core::clone::Clone for AtomicOrdering {
    #[inline]
    fn clone(&self) -> AtomicOrdering { *self }
}Clone)]
412#[repr(C)]
413pub(crate) enum AtomicOrdering {
414    #[allow(dead_code)]
415    NotAtomic = 0,
416    #[allow(dead_code)]
417    Unordered = 1,
418    Monotonic = 2,
419    // Consume = 3,  // Not specified yet.
420    Acquire = 4,
421    Release = 5,
422    AcquireRelease = 6,
423    SequentiallyConsistent = 7,
424}
425
426/// LLVMRustFileType
427#[derive(#[automatically_derived]
impl ::core::marker::Copy for FileType { }Copy, #[automatically_derived]
impl ::core::clone::Clone for FileType {
    #[inline]
    fn clone(&self) -> FileType { *self }
}Clone)]
428#[repr(C)]
429pub(crate) enum FileType {
430    AssemblyFile,
431    ObjectFile,
432}
433
434/// Must match the layout of `LLVMInlineAsmDialect`.
435#[derive(#[automatically_derived]
impl ::core::marker::Copy for AsmDialect { }Copy, #[automatically_derived]
impl ::core::clone::Clone for AsmDialect {
    #[inline]
    fn clone(&self) -> AsmDialect { *self }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for AsmDialect {
    #[inline]
    fn eq(&self, other: &AsmDialect) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq)]
436#[repr(C)]
437pub(crate) enum AsmDialect {
438    Att,
439    Intel,
440}
441
442/// LLVMRustCodeGenOptLevel
443#[derive(#[automatically_derived]
impl ::core::marker::Copy for CodeGenOptLevel { }Copy, #[automatically_derived]
impl ::core::clone::Clone for CodeGenOptLevel {
    #[inline]
    fn clone(&self) -> CodeGenOptLevel { *self }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for CodeGenOptLevel {
    #[inline]
    fn eq(&self, other: &CodeGenOptLevel) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq)]
444#[repr(C)]
445pub(crate) enum CodeGenOptLevel {
446    None,
447    Less,
448    Default,
449    Aggressive,
450}
451
452/// LLVMRustPassBuilderOptLevel
453#[repr(C)]
454pub(crate) enum PassBuilderOptLevel {
455    O0,
456    O1,
457    O2,
458    O3,
459    Os,
460    Oz,
461}
462
463/// LLVMRustOptStage
464#[derive(#[automatically_derived]
impl ::core::cmp::PartialEq for OptStage {
    #[inline]
    fn eq(&self, other: &OptStage) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq)]
465#[repr(C)]
466pub(crate) enum OptStage {
467    PreLinkNoLTO,
468    PreLinkThinLTO,
469    PreLinkFatLTO,
470    ThinLTO,
471    FatLTO,
472}
473
474/// LLVMRustSanitizerOptions
475#[repr(C)]
476pub(crate) struct SanitizerOptions {
477    pub sanitize_address: bool,
478    pub sanitize_address_recover: bool,
479    pub sanitize_cfi: bool,
480    pub sanitize_dataflow: bool,
481    pub sanitize_dataflow_abilist: *const *const c_char,
482    pub sanitize_dataflow_abilist_len: size_t,
483    pub sanitize_kcfi: bool,
484    pub sanitize_memory: bool,
485    pub sanitize_memory_recover: bool,
486    pub sanitize_memory_track_origins: c_int,
487    pub sanitize_realtime: bool,
488    pub sanitize_thread: bool,
489    pub sanitize_hwaddress: bool,
490    pub sanitize_hwaddress_recover: bool,
491    pub sanitize_kernel_address: bool,
492    pub sanitize_kernel_address_recover: bool,
493    pub sanitize_kernel_hwaddress: bool,
494    pub sanitize_kernel_hwaddress_recover: bool,
495}
496
497/// LLVMRustRelocModel
498#[derive(#[automatically_derived]
impl ::core::marker::Copy for RelocModel { }Copy, #[automatically_derived]
impl ::core::clone::Clone for RelocModel {
    #[inline]
    fn clone(&self) -> RelocModel { *self }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for RelocModel {
    #[inline]
    fn eq(&self, other: &RelocModel) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq)]
499#[repr(C)]
500pub(crate) enum RelocModel {
501    Static,
502    PIC,
503    DynamicNoPic,
504    ROPI,
505    RWPI,
506    ROPI_RWPI,
507}
508
509/// LLVMRustFloatABI
510#[derive(#[automatically_derived]
impl ::core::marker::Copy for FloatAbi { }Copy, #[automatically_derived]
impl ::core::clone::Clone for FloatAbi {
    #[inline]
    fn clone(&self) -> FloatAbi { *self }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for FloatAbi {
    #[inline]
    fn eq(&self, other: &FloatAbi) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq)]
511#[repr(C)]
512pub(crate) enum FloatAbi {
513    Default,
514    Soft,
515    Hard,
516}
517
518/// LLVMRustCodeModel
519#[derive(#[automatically_derived]
impl ::core::marker::Copy for CodeModel { }Copy, #[automatically_derived]
impl ::core::clone::Clone for CodeModel {
    #[inline]
    fn clone(&self) -> CodeModel { *self }
}Clone)]
520#[repr(C)]
521pub(crate) enum CodeModel {
522    Tiny,
523    Small,
524    Kernel,
525    Medium,
526    Large,
527    None,
528}
529
530/// LLVMRustDiagnosticKind
531#[derive(#[automatically_derived]
#[allow(dead_code)]
impl ::core::marker::Copy for DiagnosticKind { }Copy, #[automatically_derived]
#[allow(dead_code)]
impl ::core::clone::Clone for DiagnosticKind {
    #[inline]
    fn clone(&self) -> DiagnosticKind { *self }
}Clone)]
532#[repr(C)]
533#[allow(dead_code)] // Variants constructed by C++.
534pub(crate) enum DiagnosticKind {
535    Other,
536    InlineAsm,
537    StackSize,
538    DebugMetadataVersion,
539    SampleProfile,
540    OptimizationRemark,
541    OptimizationRemarkMissed,
542    OptimizationRemarkAnalysis,
543    OptimizationRemarkAnalysisFPCommute,
544    OptimizationRemarkAnalysisAliasing,
545    OptimizationRemarkOther,
546    OptimizationFailure,
547    PGOProfile,
548    Linker,
549    Unsupported,
550    SrcMgr,
551}
552
553/// LLVMRustDiagnosticLevel
554#[derive(#[automatically_derived]
#[allow(dead_code)]
impl ::core::marker::Copy for DiagnosticLevel { }Copy, #[automatically_derived]
#[allow(dead_code)]
impl ::core::clone::Clone for DiagnosticLevel {
    #[inline]
    fn clone(&self) -> DiagnosticLevel { *self }
}Clone)]
555#[repr(C)]
556#[allow(dead_code)] // Variants constructed by C++.
557pub(crate) enum DiagnosticLevel {
558    Error,
559    Warning,
560    Note,
561    Remark,
562}
563
564unsafe extern "C" {
565    // LLVMRustThinLTOData
566    pub(crate) type ThinLTOData;
567}
568
569/// LLVMRustThinLTOModule
570#[repr(C)]
571pub(crate) struct ThinLTOModule {
572    pub identifier: *const c_char,
573    pub data: *const u8,
574    pub len: usize,
575}
576
577/// LLVMThreadLocalMode
578#[derive(#[automatically_derived]
impl ::core::marker::Copy for ThreadLocalMode { }Copy, #[automatically_derived]
impl ::core::clone::Clone for ThreadLocalMode {
    #[inline]
    fn clone(&self) -> ThreadLocalMode { *self }
}Clone)]
579#[repr(C)]
580pub(crate) enum ThreadLocalMode {
581    #[expect(dead_code)]
582    NotThreadLocal,
583    GeneralDynamic,
584    LocalDynamic,
585    InitialExec,
586    LocalExec,
587}
588
589/// LLVMRustChecksumKind
590#[derive(#[automatically_derived]
impl ::core::marker::Copy for ChecksumKind { }Copy, #[automatically_derived]
impl ::core::clone::Clone for ChecksumKind {
    #[inline]
    fn clone(&self) -> ChecksumKind { *self }
}Clone)]
591#[repr(C)]
592pub(crate) enum ChecksumKind {
593    None,
594    MD5,
595    SHA1,
596    SHA256,
597}
598
599/// LLVMRustMemoryEffects
600#[derive(#[automatically_derived]
impl ::core::marker::Copy for MemoryEffects { }Copy, #[automatically_derived]
impl ::core::clone::Clone for MemoryEffects {
    #[inline]
    fn clone(&self) -> MemoryEffects { *self }
}Clone)]
601#[repr(C)]
602pub(crate) enum MemoryEffects {
603    None,
604    ReadOnly,
605    InaccessibleMemOnly,
606    ReadOnlyNotPure,
607}
608
609/// LLVMOpcode
610#[derive(#[automatically_derived]
impl ::core::marker::Copy for Opcode { }Copy, #[automatically_derived]
impl ::core::clone::Clone for Opcode {
    #[inline]
    fn clone(&self) -> Opcode { *self }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for Opcode {
    #[inline]
    fn eq(&self, other: &Opcode) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for Opcode {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq)]
611#[repr(C)]
612#[expect(dead_code, reason = "Some variants are unused, but are kept to match LLVM-C")]
613pub(crate) enum Opcode {
614    Ret = 1,
615    Br = 2,
616    Switch = 3,
617    IndirectBr = 4,
618    Invoke = 5,
619    Unreachable = 7,
620    CallBr = 67,
621    FNeg = 66,
622    Add = 8,
623    FAdd = 9,
624    Sub = 10,
625    FSub = 11,
626    Mul = 12,
627    FMul = 13,
628    UDiv = 14,
629    SDiv = 15,
630    FDiv = 16,
631    URem = 17,
632    SRem = 18,
633    FRem = 19,
634    Shl = 20,
635    LShr = 21,
636    AShr = 22,
637    And = 23,
638    Or = 24,
639    Xor = 25,
640    Alloca = 26,
641    Load = 27,
642    Store = 28,
643    GetElementPtr = 29,
644    Trunc = 30,
645    ZExt = 31,
646    SExt = 32,
647    FPToUI = 33,
648    FPToSI = 34,
649    UIToFP = 35,
650    SIToFP = 36,
651    FPTrunc = 37,
652    FPExt = 38,
653    PtrToInt = 39,
654    IntToPtr = 40,
655    BitCast = 41,
656    AddrSpaceCast = 60,
657    ICmp = 42,
658    FCmp = 43,
659    PHI = 44,
660    Call = 45,
661    Select = 46,
662    UserOp1 = 47,
663    UserOp2 = 48,
664    VAArg = 49,
665    ExtractElement = 50,
666    InsertElement = 51,
667    ShuffleVector = 52,
668    ExtractValue = 53,
669    InsertValue = 54,
670    Freeze = 68,
671    Fence = 55,
672    AtomicCmpXchg = 56,
673    AtomicRMW = 57,
674    Resume = 58,
675    LandingPad = 59,
676    CleanupRet = 61,
677    CatchRet = 62,
678    CatchPad = 63,
679    CleanupPad = 64,
680    CatchSwitch = 65,
681}
682
683/// Must match the layout of `LLVMRustCompressionKind`.
684#[derive(#[automatically_derived]
impl ::core::marker::Copy for CompressionKind { }Copy, #[automatically_derived]
impl ::core::clone::Clone for CompressionKind {
    #[inline]
    fn clone(&self) -> CompressionKind { *self }
}Clone)]
685#[repr(C)]
686pub(crate) enum CompressionKind {
687    None = 0,
688    Zlib = 1,
689    Zstd = 2,
690}
691
692unsafe extern "C" {
693    type Opaque;
694}
695#[repr(C)]
696struct InvariantOpaque<'a> {
697    _marker: PhantomData<&'a mut &'a ()>,
698    _opaque: Opaque,
699}
700
701// Opaque pointer types
702unsafe extern "C" {
703    pub(crate) type Module;
704    pub(crate) type Context;
705    pub(crate) type Type;
706    pub(crate) type Value;
707    pub(crate) type ConstantInt;
708    pub(crate) type Attribute;
709    pub(crate) type Metadata;
710    pub(crate) type BasicBlock;
711    pub(crate) type Comdat;
712    /// `&'ll DbgRecord` represents `LLVMDbgRecordRef`.
713    pub(crate) type DbgRecord;
714}
715#[repr(C)]
716pub(crate) struct Builder<'a>(InvariantOpaque<'a>);
717#[repr(C)]
718pub(crate) struct PassManager<'a>(InvariantOpaque<'a>);
719unsafe extern "C" {
720    pub type TargetMachine;
721}
722unsafe extern "C" {
723    pub(crate) type Twine;
724    pub(crate) type DiagnosticInfo;
725    pub(crate) type SMDiagnostic;
726}
727/// Opaque pointee of `LLVMOperandBundleRef`.
728#[repr(C)]
729pub(crate) struct OperandBundle<'a>(InvariantOpaque<'a>);
730#[repr(C)]
731pub(crate) struct Linker<'a>(InvariantOpaque<'a>);
732
733unsafe extern "C" {
734    pub(crate) type DiagnosticHandler;
735}
736
737pub(crate) type DiagnosticHandlerTy = unsafe extern "C" fn(&DiagnosticInfo, *mut c_void);
738
739pub(crate) mod debuginfo {
740    use bitflags::bitflags;
741
742    use super::{InvariantOpaque, Metadata};
743
744    /// Opaque target type for references to an LLVM debuginfo builder.
745    ///
746    /// `&'_ DIBuilder<'ll>` corresponds to `LLVMDIBuilderRef`, which is the
747    /// LLVM-C wrapper for `DIBuilder *`.
748    ///
749    /// Debuginfo builders are created and destroyed during codegen, so the
750    /// builder reference typically has a shorter lifetime than the LLVM
751    /// session (`'ll`) that it participates in.
752    #[repr(C)]
753    pub(crate) struct DIBuilder<'ll>(InvariantOpaque<'ll>);
754
755    pub(crate) type DIDescriptor = Metadata;
756    pub(crate) type DILocation = Metadata;
757    pub(crate) type DIScope = DIDescriptor;
758    pub(crate) type DIFile = DIScope;
759    pub(crate) type DILexicalBlock = DIScope;
760    pub(crate) type DISubprogram = DIScope;
761    pub(crate) type DIType = DIDescriptor;
762    pub(crate) type DIBasicType = DIType;
763    pub(crate) type DIDerivedType = DIType;
764    pub(crate) type DICompositeType = DIDerivedType;
765    pub(crate) type DIVariable = DIDescriptor;
766    pub(crate) type DIArray = DIDescriptor;
767    pub(crate) type DITemplateTypeParameter = DIDescriptor;
768
769    bitflags! {
770        /// Must match the layout of `LLVMDIFlags` in the LLVM-C API.
771        ///
772        /// Each value declared here must also be covered by the static
773        /// assertions in `RustWrapper.cpp` used by `fromRust(LLVMDIFlags)`.
774        #[repr(transparent)]
775        #[derive(#[automatically_derived]
impl ::core::clone::Clone for DIFlags {
    #[inline]
    fn clone(&self) -> DIFlags {
        let _:
                ::core::clone::AssertParamIsClone<<DIFlags as
                ::bitflags::__private::PublicFlags>::Internal>;
        *self
    }
}
impl DIFlags {
    #[allow(deprecated, non_upper_case_globals,)]
    pub const FlagZero: Self = Self::from_bits_retain(0);
    #[allow(deprecated, non_upper_case_globals,)]
    pub const FlagPrivate: Self = Self::from_bits_retain(1);
    #[allow(deprecated, non_upper_case_globals,)]
    pub const FlagProtected: Self = Self::from_bits_retain(2);
    #[allow(deprecated, non_upper_case_globals,)]
    pub const FlagPublic: Self = Self::from_bits_retain(3);
    #[allow(deprecated, non_upper_case_globals,)]
    pub const FlagFwdDecl: Self = Self::from_bits_retain((1 << 2));
    #[allow(deprecated, non_upper_case_globals,)]
    pub const FlagAppleBlock: Self = Self::from_bits_retain((1 << 3));
    #[allow(deprecated, non_upper_case_globals,)]
    pub const FlagReservedBit4: Self = Self::from_bits_retain((1 << 4));
    #[allow(deprecated, non_upper_case_globals,)]
    pub const FlagVirtual: Self = Self::from_bits_retain((1 << 5));
    #[allow(deprecated, non_upper_case_globals,)]
    pub const FlagArtificial: Self = Self::from_bits_retain((1 << 6));
    #[allow(deprecated, non_upper_case_globals,)]
    pub const FlagExplicit: Self = Self::from_bits_retain((1 << 7));
    #[allow(deprecated, non_upper_case_globals,)]
    pub const FlagPrototyped: Self = Self::from_bits_retain((1 << 8));
    #[allow(deprecated, non_upper_case_globals,)]
    pub const FlagObjcClassComplete: Self = Self::from_bits_retain((1 << 9));
    #[allow(deprecated, non_upper_case_globals,)]
    pub const FlagObjectPointer: Self = Self::from_bits_retain((1 << 10));
    #[allow(deprecated, non_upper_case_globals,)]
    pub const FlagVector: Self = Self::from_bits_retain((1 << 11));
    #[allow(deprecated, non_upper_case_globals,)]
    pub const FlagStaticMember: Self = Self::from_bits_retain((1 << 12));
    #[allow(deprecated, non_upper_case_globals,)]
    pub const FlagLValueReference: Self = Self::from_bits_retain((1 << 13));
    #[allow(deprecated, non_upper_case_globals,)]
    pub const FlagRValueReference: Self = Self::from_bits_retain((1 << 14));
    #[allow(deprecated, non_upper_case_globals,)]
    pub const FlagReserved: Self = Self::from_bits_retain((1 << 15));
    #[allow(deprecated, non_upper_case_globals,)]
    pub const FlagSingleInheritance: Self = Self::from_bits_retain((1 << 16));
    #[allow(deprecated, non_upper_case_globals,)]
    pub const FlagMultipleInheritance: Self =
        Self::from_bits_retain((2 << 16));
    #[allow(deprecated, non_upper_case_globals,)]
    pub const FlagVirtualInheritance: Self =
        Self::from_bits_retain((3 << 16));
    #[allow(deprecated, non_upper_case_globals,)]
    pub const FlagIntroducedVirtual: Self = Self::from_bits_retain((1 << 18));
    #[allow(deprecated, non_upper_case_globals,)]
    pub const FlagBitField: Self = Self::from_bits_retain((1 << 19));
    #[allow(deprecated, non_upper_case_globals,)]
    pub const FlagNoReturn: Self = Self::from_bits_retain((1 << 20));
    #[allow(deprecated, non_upper_case_globals,)]
    pub const FlagTypePassByValue: Self = Self::from_bits_retain((1 << 22));
    #[allow(deprecated, non_upper_case_globals,)]
    pub const FlagTypePassByReference: Self =
        Self::from_bits_retain((1 << 23));
    #[allow(deprecated, non_upper_case_globals,)]
    pub const FlagEnumClass: Self = Self::from_bits_retain((1 << 24));
    #[allow(deprecated, non_upper_case_globals,)]
    pub const FlagThunk: Self = Self::from_bits_retain((1 << 25));
    #[allow(deprecated, non_upper_case_globals,)]
    pub const FlagNonTrivial: Self = Self::from_bits_retain((1 << 26));
    #[allow(deprecated, non_upper_case_globals,)]
    pub const FlagBigEndian: Self = Self::from_bits_retain((1 << 27));
    #[allow(deprecated, non_upper_case_globals,)]
    pub const FlagLittleEndian: Self = Self::from_bits_retain((1 << 28));
}
impl ::bitflags::Flags for DIFlags {
    const FLAGS: &'static [::bitflags::Flag<DIFlags>] =
        &[{

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("FlagZero", DIFlags::FlagZero)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("FlagPrivate", DIFlags::FlagPrivate)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("FlagProtected",
                            DIFlags::FlagProtected)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("FlagPublic", DIFlags::FlagPublic)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("FlagFwdDecl", DIFlags::FlagFwdDecl)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("FlagAppleBlock",
                            DIFlags::FlagAppleBlock)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("FlagReservedBit4",
                            DIFlags::FlagReservedBit4)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("FlagVirtual", DIFlags::FlagVirtual)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("FlagArtificial",
                            DIFlags::FlagArtificial)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("FlagExplicit", DIFlags::FlagExplicit)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("FlagPrototyped",
                            DIFlags::FlagPrototyped)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("FlagObjcClassComplete",
                            DIFlags::FlagObjcClassComplete)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("FlagObjectPointer",
                            DIFlags::FlagObjectPointer)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("FlagVector", DIFlags::FlagVector)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("FlagStaticMember",
                            DIFlags::FlagStaticMember)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("FlagLValueReference",
                            DIFlags::FlagLValueReference)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("FlagRValueReference",
                            DIFlags::FlagRValueReference)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("FlagReserved", DIFlags::FlagReserved)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("FlagSingleInheritance",
                            DIFlags::FlagSingleInheritance)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("FlagMultipleInheritance",
                            DIFlags::FlagMultipleInheritance)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("FlagVirtualInheritance",
                            DIFlags::FlagVirtualInheritance)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("FlagIntroducedVirtual",
                            DIFlags::FlagIntroducedVirtual)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("FlagBitField", DIFlags::FlagBitField)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("FlagNoReturn", DIFlags::FlagNoReturn)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("FlagTypePassByValue",
                            DIFlags::FlagTypePassByValue)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("FlagTypePassByReference",
                            DIFlags::FlagTypePassByReference)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("FlagEnumClass",
                            DIFlags::FlagEnumClass)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("FlagThunk", DIFlags::FlagThunk)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("FlagNonTrivial",
                            DIFlags::FlagNonTrivial)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("FlagBigEndian",
                            DIFlags::FlagBigEndian)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("FlagLittleEndian",
                            DIFlags::FlagLittleEndian)
                    }];
    type Bits = u32;
    fn bits(&self) -> u32 { DIFlags::bits(self) }
    fn from_bits_retain(bits: u32) -> DIFlags {
        DIFlags::from_bits_retain(bits)
    }
}
#[allow(dead_code, deprecated, unused_doc_comments, unused_attributes,
unused_mut, unused_imports, non_upper_case_globals, clippy ::
assign_op_pattern, clippy :: indexing_slicing, clippy :: same_name_method,
clippy :: iter_without_into_iter,)]
const _: () =
    {
        #[repr(transparent)]
        pub(crate) struct InternalBitFlags(u32);
        #[automatically_derived]
        #[doc(hidden)]
        unsafe impl ::core::clone::TrivialClone for InternalBitFlags { }
        #[automatically_derived]
        impl ::core::clone::Clone for InternalBitFlags {
            #[inline]
            fn clone(&self) -> InternalBitFlags {
                let _: ::core::clone::AssertParamIsClone<u32>;
                *self
            }
        }
        #[automatically_derived]
        impl ::core::marker::Copy for InternalBitFlags { }
        #[automatically_derived]
        impl ::core::marker::StructuralPartialEq for InternalBitFlags { }
        #[automatically_derived]
        impl ::core::cmp::PartialEq for InternalBitFlags {
            #[inline]
            fn eq(&self, other: &InternalBitFlags) -> bool {
                self.0 == other.0
            }
        }
        #[automatically_derived]
        impl ::core::cmp::Eq for InternalBitFlags {
            #[inline]
            #[doc(hidden)]
            #[coverage(off)]
            fn assert_fields_are_eq(&self) {
                let _: ::core::cmp::AssertParamIsEq<u32>;
            }
        }
        #[automatically_derived]
        impl ::core::cmp::PartialOrd for InternalBitFlags {
            #[inline]
            fn partial_cmp(&self, other: &InternalBitFlags)
                -> ::core::option::Option<::core::cmp::Ordering> {
                ::core::option::Option::Some(::core::cmp::Ord::cmp(self,
                        other))
            }
        }
        #[automatically_derived]
        impl ::core::cmp::Ord for InternalBitFlags {
            #[inline]
            fn cmp(&self, other: &InternalBitFlags) -> ::core::cmp::Ordering {
                ::core::cmp::Ord::cmp(&self.0, &other.0)
            }
        }
        #[automatically_derived]
        impl ::core::hash::Hash for InternalBitFlags {
            #[inline]
            fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
                ::core::hash::Hash::hash(&self.0, state)
            }
        }
        impl ::bitflags::__private::PublicFlags for DIFlags {
            type Primitive = u32;
            type Internal = InternalBitFlags;
        }
        impl ::bitflags::__private::core::default::Default for
            InternalBitFlags {
            #[inline]
            fn default() -> Self { InternalBitFlags::empty() }
        }
        impl ::bitflags::__private::core::fmt::Debug for InternalBitFlags {
            fn fmt(&self,
                f: &mut ::bitflags::__private::core::fmt::Formatter<'_>)
                -> ::bitflags::__private::core::fmt::Result {
                if self.is_empty() {
                    f.write_fmt(format_args!("{0:#x}",
                            <u32 as ::bitflags::Bits>::EMPTY))
                } else {
                    ::bitflags::__private::core::fmt::Display::fmt(self, f)
                }
            }
        }
        impl ::bitflags::__private::core::fmt::Display for InternalBitFlags {
            fn fmt(&self,
                f: &mut ::bitflags::__private::core::fmt::Formatter<'_>)
                -> ::bitflags::__private::core::fmt::Result {
                ::bitflags::parser::to_writer(&DIFlags(*self), f)
            }
        }
        impl ::bitflags::__private::core::str::FromStr for InternalBitFlags {
            type Err = ::bitflags::parser::ParseError;
            fn from_str(s: &str)
                ->
                    ::bitflags::__private::core::result::Result<Self,
                    Self::Err> {
                ::bitflags::parser::from_str::<DIFlags>(s).map(|flags|
                        flags.0)
            }
        }
        impl ::bitflags::__private::core::convert::AsRef<u32> for
            InternalBitFlags {
            fn as_ref(&self) -> &u32 { &self.0 }
        }
        impl ::bitflags::__private::core::convert::From<u32> for
            InternalBitFlags {
            fn from(bits: u32) -> Self { Self::from_bits_retain(bits) }
        }
        #[allow(dead_code, deprecated, unused_attributes)]
        impl InternalBitFlags {
            /// Get a flags value with all bits unset.
            #[inline]
            pub const fn empty() -> Self {
                Self(<u32 as ::bitflags::Bits>::EMPTY)
            }
            /// Get a flags value with all known bits set.
            #[inline]
            pub const fn all() -> Self {
                let mut truncated = <u32 as ::bitflags::Bits>::EMPTY;
                let mut i = 0;
                {
                    {
                        let flag =
                            <DIFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <DIFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <DIFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <DIFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <DIFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <DIFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <DIFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <DIFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <DIFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <DIFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <DIFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <DIFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <DIFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <DIFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <DIFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <DIFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <DIFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <DIFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <DIFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <DIFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <DIFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <DIFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <DIFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <DIFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <DIFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <DIFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <DIFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <DIFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <DIFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <DIFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <DIFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                let _ = i;
                Self(truncated)
            }
            /// Get the underlying bits value.
            ///
            /// The returned value is exactly the bits set in this flags value.
            #[inline]
            pub const fn bits(&self) -> u32 { self.0 }
            /// Convert from a bits value.
            ///
            /// This method will return `None` if any unknown bits are set.
            #[inline]
            pub const fn from_bits(bits: u32)
                -> ::bitflags::__private::core::option::Option<Self> {
                let truncated = Self::from_bits_truncate(bits).0;
                if truncated == bits {
                    ::bitflags::__private::core::option::Option::Some(Self(bits))
                } else { ::bitflags::__private::core::option::Option::None }
            }
            /// Convert from a bits value, unsetting any unknown bits.
            #[inline]
            pub const fn from_bits_truncate(bits: u32) -> Self {
                Self(bits & Self::all().0)
            }
            /// Convert from a bits value exactly.
            #[inline]
            pub const fn from_bits_retain(bits: u32) -> Self { Self(bits) }
            /// Get a flags value with the bits of a flag with the given name set.
            ///
            /// This method will return `None` if `name` is empty or doesn't
            /// correspond to any named flag.
            #[inline]
            pub fn from_name(name: &str)
                -> ::bitflags::__private::core::option::Option<Self> {
                {
                    if name == "FlagZero" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DIFlags::FlagZero.bits()));
                    }
                };
                ;
                {
                    if name == "FlagPrivate" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DIFlags::FlagPrivate.bits()));
                    }
                };
                ;
                {
                    if name == "FlagProtected" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DIFlags::FlagProtected.bits()));
                    }
                };
                ;
                {
                    if name == "FlagPublic" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DIFlags::FlagPublic.bits()));
                    }
                };
                ;
                {
                    if name == "FlagFwdDecl" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DIFlags::FlagFwdDecl.bits()));
                    }
                };
                ;
                {
                    if name == "FlagAppleBlock" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DIFlags::FlagAppleBlock.bits()));
                    }
                };
                ;
                {
                    if name == "FlagReservedBit4" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DIFlags::FlagReservedBit4.bits()));
                    }
                };
                ;
                {
                    if name == "FlagVirtual" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DIFlags::FlagVirtual.bits()));
                    }
                };
                ;
                {
                    if name == "FlagArtificial" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DIFlags::FlagArtificial.bits()));
                    }
                };
                ;
                {
                    if name == "FlagExplicit" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DIFlags::FlagExplicit.bits()));
                    }
                };
                ;
                {
                    if name == "FlagPrototyped" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DIFlags::FlagPrototyped.bits()));
                    }
                };
                ;
                {
                    if name == "FlagObjcClassComplete" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DIFlags::FlagObjcClassComplete.bits()));
                    }
                };
                ;
                {
                    if name == "FlagObjectPointer" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DIFlags::FlagObjectPointer.bits()));
                    }
                };
                ;
                {
                    if name == "FlagVector" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DIFlags::FlagVector.bits()));
                    }
                };
                ;
                {
                    if name == "FlagStaticMember" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DIFlags::FlagStaticMember.bits()));
                    }
                };
                ;
                {
                    if name == "FlagLValueReference" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DIFlags::FlagLValueReference.bits()));
                    }
                };
                ;
                {
                    if name == "FlagRValueReference" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DIFlags::FlagRValueReference.bits()));
                    }
                };
                ;
                {
                    if name == "FlagReserved" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DIFlags::FlagReserved.bits()));
                    }
                };
                ;
                {
                    if name == "FlagSingleInheritance" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DIFlags::FlagSingleInheritance.bits()));
                    }
                };
                ;
                {
                    if name == "FlagMultipleInheritance" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DIFlags::FlagMultipleInheritance.bits()));
                    }
                };
                ;
                {
                    if name == "FlagVirtualInheritance" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DIFlags::FlagVirtualInheritance.bits()));
                    }
                };
                ;
                {
                    if name == "FlagIntroducedVirtual" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DIFlags::FlagIntroducedVirtual.bits()));
                    }
                };
                ;
                {
                    if name == "FlagBitField" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DIFlags::FlagBitField.bits()));
                    }
                };
                ;
                {
                    if name == "FlagNoReturn" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DIFlags::FlagNoReturn.bits()));
                    }
                };
                ;
                {
                    if name == "FlagTypePassByValue" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DIFlags::FlagTypePassByValue.bits()));
                    }
                };
                ;
                {
                    if name == "FlagTypePassByReference" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DIFlags::FlagTypePassByReference.bits()));
                    }
                };
                ;
                {
                    if name == "FlagEnumClass" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DIFlags::FlagEnumClass.bits()));
                    }
                };
                ;
                {
                    if name == "FlagThunk" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DIFlags::FlagThunk.bits()));
                    }
                };
                ;
                {
                    if name == "FlagNonTrivial" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DIFlags::FlagNonTrivial.bits()));
                    }
                };
                ;
                {
                    if name == "FlagBigEndian" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DIFlags::FlagBigEndian.bits()));
                    }
                };
                ;
                {
                    if name == "FlagLittleEndian" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DIFlags::FlagLittleEndian.bits()));
                    }
                };
                ;
                let _ = name;
                ::bitflags::__private::core::option::Option::None
            }
            /// Whether all bits in this flags value are unset.
            #[inline]
            pub const fn is_empty(&self) -> bool {
                self.0 == <u32 as ::bitflags::Bits>::EMPTY
            }
            /// Whether all known bits in this flags value are set.
            #[inline]
            pub const fn is_all(&self) -> bool {
                Self::all().0 | self.0 == self.0
            }
            /// Whether any set bits in a source flags value are also set in a target flags value.
            #[inline]
            pub const fn intersects(&self, other: Self) -> bool {
                self.0 & other.0 != <u32 as ::bitflags::Bits>::EMPTY
            }
            /// Whether all set bits in a source flags value are also set in a target flags value.
            #[inline]
            pub const fn contains(&self, other: Self) -> bool {
                self.0 & other.0 == other.0
            }
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            pub fn insert(&mut self, other: Self) {
                *self = Self(self.0).union(other);
            }
            /// The intersection of a source flags value with the complement of a target flags
            /// value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `remove` won't truncate `other`, but the `!` operator will.
            #[inline]
            pub fn remove(&mut self, other: Self) {
                *self = Self(self.0).difference(other);
            }
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            pub fn toggle(&mut self, other: Self) {
                *self = Self(self.0).symmetric_difference(other);
            }
            /// Call `insert` when `value` is `true` or `remove` when `value` is `false`.
            #[inline]
            pub fn set(&mut self, other: Self, value: bool) {
                if value { self.insert(other); } else { self.remove(other); }
            }
            /// The bitwise and (`&`) of the bits in two flags values.
            #[inline]
            #[must_use]
            pub const fn intersection(self, other: Self) -> Self {
                Self(self.0 & other.0)
            }
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            #[must_use]
            pub const fn union(self, other: Self) -> Self {
                Self(self.0 | other.0)
            }
            /// The intersection of a source flags value with the complement of a target flags
            /// value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `difference` won't truncate `other`, but the `!` operator will.
            #[inline]
            #[must_use]
            pub const fn difference(self, other: Self) -> Self {
                Self(self.0 & !other.0)
            }
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            #[must_use]
            pub const fn symmetric_difference(self, other: Self) -> Self {
                Self(self.0 ^ other.0)
            }
            /// The bitwise negation (`!`) of the bits in a flags value, truncating the result.
            #[inline]
            #[must_use]
            pub const fn complement(self) -> Self {
                Self::from_bits_truncate(!self.0)
            }
        }
        impl ::bitflags::__private::core::fmt::Binary for InternalBitFlags {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::Binary::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::fmt::Octal for InternalBitFlags {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::Octal::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::fmt::LowerHex for InternalBitFlags {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::LowerHex::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::fmt::UpperHex for InternalBitFlags {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::UpperHex::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::ops::BitOr for InternalBitFlags {
            type Output = Self;
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            fn bitor(self, other: InternalBitFlags) -> Self {
                self.union(other)
            }
        }
        impl ::bitflags::__private::core::ops::BitOrAssign for
            InternalBitFlags {
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            fn bitor_assign(&mut self, other: Self) { self.insert(other); }
        }
        impl ::bitflags::__private::core::ops::BitXor for InternalBitFlags {
            type Output = Self;
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            fn bitxor(self, other: Self) -> Self {
                self.symmetric_difference(other)
            }
        }
        impl ::bitflags::__private::core::ops::BitXorAssign for
            InternalBitFlags {
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            fn bitxor_assign(&mut self, other: Self) { self.toggle(other); }
        }
        impl ::bitflags::__private::core::ops::BitAnd for InternalBitFlags {
            type Output = Self;
            /// The bitwise and (`&`) of the bits in two flags values.
            #[inline]
            fn bitand(self, other: Self) -> Self { self.intersection(other) }
        }
        impl ::bitflags::__private::core::ops::BitAndAssign for
            InternalBitFlags {
            /// The bitwise and (`&`) of the bits in two flags values.
            #[inline]
            fn bitand_assign(&mut self, other: Self) {
                *self =
                    Self::from_bits_retain(self.bits()).intersection(other);
            }
        }
        impl ::bitflags::__private::core::ops::Sub for InternalBitFlags {
            type Output = Self;
            /// The intersection of a source flags value with the complement of a target flags value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `difference` won't truncate `other`, but the `!` operator will.
            #[inline]
            fn sub(self, other: Self) -> Self { self.difference(other) }
        }
        impl ::bitflags::__private::core::ops::SubAssign for InternalBitFlags
            {
            /// The intersection of a source flags value with the complement of a target flags value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `difference` won't truncate `other`, but the `!` operator will.
            #[inline]
            fn sub_assign(&mut self, other: Self) { self.remove(other); }
        }
        impl ::bitflags::__private::core::ops::Not for InternalBitFlags {
            type Output = Self;
            /// The bitwise negation (`!`) of the bits in a flags value, truncating the result.
            #[inline]
            fn not(self) -> Self { self.complement() }
        }
        impl ::bitflags::__private::core::iter::Extend<InternalBitFlags> for
            InternalBitFlags {
            /// The bitwise or (`|`) of the bits in each flags value.
            fn extend<T: ::bitflags::__private::core::iter::IntoIterator<Item
                = Self>>(&mut self, iterator: T) {
                for item in iterator { self.insert(item) }
            }
        }
        impl ::bitflags::__private::core::iter::FromIterator<InternalBitFlags>
            for InternalBitFlags {
            /// The bitwise or (`|`) of the bits in each flags value.
            fn from_iter<T: ::bitflags::__private::core::iter::IntoIterator<Item
                = Self>>(iterator: T) -> Self {
                use ::bitflags::__private::core::iter::Extend;
                let mut result = Self::empty();
                result.extend(iterator);
                result
            }
        }
        impl InternalBitFlags {
            /// Yield a set of contained flags values.
            ///
            /// Each yielded flags value will correspond to a defined named flag. Any unknown bits
            /// will be yielded together as a final flags value.
            #[inline]
            pub const fn iter(&self) -> ::bitflags::iter::Iter<DIFlags> {
                ::bitflags::iter::Iter::__private_const_new(<DIFlags as
                        ::bitflags::Flags>::FLAGS,
                    DIFlags::from_bits_retain(self.bits()),
                    DIFlags::from_bits_retain(self.bits()))
            }
            /// Yield a set of contained named flags values.
            ///
            /// This method is like [`iter`](#method.iter), except only yields bits in contained named flags.
            /// Any unknown bits, or bits not corresponding to a contained flag will not be yielded.
            #[inline]
            pub const fn iter_names(&self)
                -> ::bitflags::iter::IterNames<DIFlags> {
                ::bitflags::iter::IterNames::__private_const_new(<DIFlags as
                        ::bitflags::Flags>::FLAGS,
                    DIFlags::from_bits_retain(self.bits()),
                    DIFlags::from_bits_retain(self.bits()))
            }
        }
        impl ::bitflags::__private::core::iter::IntoIterator for
            InternalBitFlags {
            type Item = DIFlags;
            type IntoIter = ::bitflags::iter::Iter<DIFlags>;
            fn into_iter(self) -> Self::IntoIter { self.iter() }
        }
        impl InternalBitFlags {
            /// Returns a mutable reference to the raw value of the flags currently stored.
            #[inline]
            pub fn bits_mut(&mut self) -> &mut u32 { &mut self.0 }
        }
        #[allow(dead_code, deprecated, unused_attributes)]
        impl DIFlags {
            /// Get a flags value with all bits unset.
            #[inline]
            pub const fn empty() -> Self { Self(InternalBitFlags::empty()) }
            /// Get a flags value with all known bits set.
            #[inline]
            pub const fn all() -> Self { Self(InternalBitFlags::all()) }
            /// Get the underlying bits value.
            ///
            /// The returned value is exactly the bits set in this flags value.
            #[inline]
            pub const fn bits(&self) -> u32 { self.0.bits() }
            /// Convert from a bits value.
            ///
            /// This method will return `None` if any unknown bits are set.
            #[inline]
            pub const fn from_bits(bits: u32)
                -> ::bitflags::__private::core::option::Option<Self> {
                match InternalBitFlags::from_bits(bits) {
                    ::bitflags::__private::core::option::Option::Some(bits) =>
                        ::bitflags::__private::core::option::Option::Some(Self(bits)),
                    ::bitflags::__private::core::option::Option::None =>
                        ::bitflags::__private::core::option::Option::None,
                }
            }
            /// Convert from a bits value, unsetting any unknown bits.
            #[inline]
            pub const fn from_bits_truncate(bits: u32) -> Self {
                Self(InternalBitFlags::from_bits_truncate(bits))
            }
            /// Convert from a bits value exactly.
            #[inline]
            pub const fn from_bits_retain(bits: u32) -> Self {
                Self(InternalBitFlags::from_bits_retain(bits))
            }
            /// Get a flags value with the bits of a flag with the given name set.
            ///
            /// This method will return `None` if `name` is empty or doesn't
            /// correspond to any named flag.
            #[inline]
            pub fn from_name(name: &str)
                -> ::bitflags::__private::core::option::Option<Self> {
                match InternalBitFlags::from_name(name) {
                    ::bitflags::__private::core::option::Option::Some(bits) =>
                        ::bitflags::__private::core::option::Option::Some(Self(bits)),
                    ::bitflags::__private::core::option::Option::None =>
                        ::bitflags::__private::core::option::Option::None,
                }
            }
            /// Whether all bits in this flags value are unset.
            #[inline]
            pub const fn is_empty(&self) -> bool { self.0.is_empty() }
            /// Whether all known bits in this flags value are set.
            #[inline]
            pub const fn is_all(&self) -> bool { self.0.is_all() }
            /// Whether any set bits in a source flags value are also set in a target flags value.
            #[inline]
            pub const fn intersects(&self, other: Self) -> bool {
                self.0.intersects(other.0)
            }
            /// Whether all set bits in a source flags value are also set in a target flags value.
            #[inline]
            pub const fn contains(&self, other: Self) -> bool {
                self.0.contains(other.0)
            }
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            pub fn insert(&mut self, other: Self) { self.0.insert(other.0) }
            /// The intersection of a source flags value with the complement of a target flags
            /// value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `remove` won't truncate `other`, but the `!` operator will.
            #[inline]
            pub fn remove(&mut self, other: Self) { self.0.remove(other.0) }
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            pub fn toggle(&mut self, other: Self) { self.0.toggle(other.0) }
            /// Call `insert` when `value` is `true` or `remove` when `value` is `false`.
            #[inline]
            pub fn set(&mut self, other: Self, value: bool) {
                self.0.set(other.0, value)
            }
            /// The bitwise and (`&`) of the bits in two flags values.
            #[inline]
            #[must_use]
            pub const fn intersection(self, other: Self) -> Self {
                Self(self.0.intersection(other.0))
            }
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            #[must_use]
            pub const fn union(self, other: Self) -> Self {
                Self(self.0.union(other.0))
            }
            /// The intersection of a source flags value with the complement of a target flags
            /// value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `difference` won't truncate `other`, but the `!` operator will.
            #[inline]
            #[must_use]
            pub const fn difference(self, other: Self) -> Self {
                Self(self.0.difference(other.0))
            }
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            #[must_use]
            pub const fn symmetric_difference(self, other: Self) -> Self {
                Self(self.0.symmetric_difference(other.0))
            }
            /// The bitwise negation (`!`) of the bits in a flags value, truncating the result.
            #[inline]
            #[must_use]
            pub const fn complement(self) -> Self {
                Self(self.0.complement())
            }
        }
        impl ::bitflags::__private::core::fmt::Binary for DIFlags {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::Binary::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::fmt::Octal for DIFlags {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::Octal::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::fmt::LowerHex for DIFlags {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::LowerHex::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::fmt::UpperHex for DIFlags {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::UpperHex::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::ops::BitOr for DIFlags {
            type Output = Self;
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            fn bitor(self, other: DIFlags) -> Self { self.union(other) }
        }
        impl ::bitflags::__private::core::ops::BitOrAssign for DIFlags {
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            fn bitor_assign(&mut self, other: Self) { self.insert(other); }
        }
        impl ::bitflags::__private::core::ops::BitXor for DIFlags {
            type Output = Self;
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            fn bitxor(self, other: Self) -> Self {
                self.symmetric_difference(other)
            }
        }
        impl ::bitflags::__private::core::ops::BitXorAssign for DIFlags {
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            fn bitxor_assign(&mut self, other: Self) { self.toggle(other); }
        }
        impl ::bitflags::__private::core::ops::BitAnd for DIFlags {
            type Output = Self;
            /// The bitwise and (`&`) of the bits in two flags values.
            #[inline]
            fn bitand(self, other: Self) -> Self { self.intersection(other) }
        }
        impl ::bitflags::__private::core::ops::BitAndAssign for DIFlags {
            /// The bitwise and (`&`) of the bits in two flags values.
            #[inline]
            fn bitand_assign(&mut self, other: Self) {
                *self =
                    Self::from_bits_retain(self.bits()).intersection(other);
            }
        }
        impl ::bitflags::__private::core::ops::Sub for DIFlags {
            type Output = Self;
            /// The intersection of a source flags value with the complement of a target flags value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `difference` won't truncate `other`, but the `!` operator will.
            #[inline]
            fn sub(self, other: Self) -> Self { self.difference(other) }
        }
        impl ::bitflags::__private::core::ops::SubAssign for DIFlags {
            /// The intersection of a source flags value with the complement of a target flags value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `difference` won't truncate `other`, but the `!` operator will.
            #[inline]
            fn sub_assign(&mut self, other: Self) { self.remove(other); }
        }
        impl ::bitflags::__private::core::ops::Not for DIFlags {
            type Output = Self;
            /// The bitwise negation (`!`) of the bits in a flags value, truncating the result.
            #[inline]
            fn not(self) -> Self { self.complement() }
        }
        impl ::bitflags::__private::core::iter::Extend<DIFlags> for DIFlags {
            /// The bitwise or (`|`) of the bits in each flags value.
            fn extend<T: ::bitflags::__private::core::iter::IntoIterator<Item
                = Self>>(&mut self, iterator: T) {
                for item in iterator { self.insert(item) }
            }
        }
        impl ::bitflags::__private::core::iter::FromIterator<DIFlags> for
            DIFlags {
            /// The bitwise or (`|`) of the bits in each flags value.
            fn from_iter<T: ::bitflags::__private::core::iter::IntoIterator<Item
                = Self>>(iterator: T) -> Self {
                use ::bitflags::__private::core::iter::Extend;
                let mut result = Self::empty();
                result.extend(iterator);
                result
            }
        }
        impl DIFlags {
            /// Yield a set of contained flags values.
            ///
            /// Each yielded flags value will correspond to a defined named flag. Any unknown bits
            /// will be yielded together as a final flags value.
            #[inline]
            pub const fn iter(&self) -> ::bitflags::iter::Iter<DIFlags> {
                ::bitflags::iter::Iter::__private_const_new(<DIFlags as
                        ::bitflags::Flags>::FLAGS,
                    DIFlags::from_bits_retain(self.bits()),
                    DIFlags::from_bits_retain(self.bits()))
            }
            /// Yield a set of contained named flags values.
            ///
            /// This method is like [`iter`](#method.iter), except only yields bits in contained named flags.
            /// Any unknown bits, or bits not corresponding to a contained flag will not be yielded.
            #[inline]
            pub const fn iter_names(&self)
                -> ::bitflags::iter::IterNames<DIFlags> {
                ::bitflags::iter::IterNames::__private_const_new(<DIFlags as
                        ::bitflags::Flags>::FLAGS,
                    DIFlags::from_bits_retain(self.bits()),
                    DIFlags::from_bits_retain(self.bits()))
            }
        }
        impl ::bitflags::__private::core::iter::IntoIterator for DIFlags {
            type Item = DIFlags;
            type IntoIter = ::bitflags::iter::Iter<DIFlags>;
            fn into_iter(self) -> Self::IntoIter { self.iter() }
        }
    };Clone, #[automatically_derived]
impl ::core::marker::Copy for DIFlags { }Copy, #[automatically_derived]
impl ::core::default::Default for DIFlags {
    #[inline]
    fn default() -> DIFlags { DIFlags(::core::default::Default::default()) }
}Default)]
776        pub(crate) struct DIFlags: u32 {
777            const FlagZero                = 0;
778            const FlagPrivate             = 1;
779            const FlagProtected           = 2;
780            const FlagPublic              = 3;
781            const FlagFwdDecl             = (1 << 2);
782            const FlagAppleBlock          = (1 << 3);
783            const FlagReservedBit4        = (1 << 4);
784            const FlagVirtual             = (1 << 5);
785            const FlagArtificial          = (1 << 6);
786            const FlagExplicit            = (1 << 7);
787            const FlagPrototyped          = (1 << 8);
788            const FlagObjcClassComplete   = (1 << 9);
789            const FlagObjectPointer       = (1 << 10);
790            const FlagVector              = (1 << 11);
791            const FlagStaticMember        = (1 << 12);
792            const FlagLValueReference     = (1 << 13);
793            const FlagRValueReference     = (1 << 14);
794            const FlagReserved            = (1 << 15);
795            const FlagSingleInheritance   = (1 << 16);
796            const FlagMultipleInheritance = (2 << 16);
797            const FlagVirtualInheritance  = (3 << 16);
798            const FlagIntroducedVirtual   = (1 << 18);
799            const FlagBitField            = (1 << 19);
800            const FlagNoReturn            = (1 << 20);
801            // The bit at (1 << 21) is unused, but was `LLVMDIFlagMainSubprogram`.
802            const FlagTypePassByValue     = (1 << 22);
803            const FlagTypePassByReference = (1 << 23);
804            const FlagEnumClass           = (1 << 24);
805            const FlagThunk               = (1 << 25);
806            const FlagNonTrivial          = (1 << 26);
807            const FlagBigEndian           = (1 << 27);
808            const FlagLittleEndian        = (1 << 28);
809        }
810    }
811
812    // These values **must** match with LLVMRustDISPFlags!!
813    bitflags! {
814        #[repr(transparent)]
815        #[derive(#[automatically_derived]
impl ::core::clone::Clone for DISPFlags {
    #[inline]
    fn clone(&self) -> DISPFlags {
        let _:
                ::core::clone::AssertParamIsClone<<DISPFlags as
                ::bitflags::__private::PublicFlags>::Internal>;
        *self
    }
}
impl DISPFlags {
    #[allow(deprecated, non_upper_case_globals,)]
    pub const SPFlagZero: Self = Self::from_bits_retain(0);
    #[allow(deprecated, non_upper_case_globals,)]
    pub const SPFlagVirtual: Self = Self::from_bits_retain(1);
    #[allow(deprecated, non_upper_case_globals,)]
    pub const SPFlagPureVirtual: Self = Self::from_bits_retain(2);
    #[allow(deprecated, non_upper_case_globals,)]
    pub const SPFlagLocalToUnit: Self = Self::from_bits_retain((1 << 2));
    #[allow(deprecated, non_upper_case_globals,)]
    pub const SPFlagDefinition: Self = Self::from_bits_retain((1 << 3));
    #[allow(deprecated, non_upper_case_globals,)]
    pub const SPFlagOptimized: Self = Self::from_bits_retain((1 << 4));
    #[allow(deprecated, non_upper_case_globals,)]
    pub const SPFlagMainSubprogram: Self = Self::from_bits_retain((1 << 5));
}
impl ::bitflags::Flags for DISPFlags {
    const FLAGS: &'static [::bitflags::Flag<DISPFlags>] =
        &[{

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("SPFlagZero", DISPFlags::SPFlagZero)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("SPFlagVirtual",
                            DISPFlags::SPFlagVirtual)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("SPFlagPureVirtual",
                            DISPFlags::SPFlagPureVirtual)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("SPFlagLocalToUnit",
                            DISPFlags::SPFlagLocalToUnit)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("SPFlagDefinition",
                            DISPFlags::SPFlagDefinition)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("SPFlagOptimized",
                            DISPFlags::SPFlagOptimized)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("SPFlagMainSubprogram",
                            DISPFlags::SPFlagMainSubprogram)
                    }];
    type Bits = u32;
    fn bits(&self) -> u32 { DISPFlags::bits(self) }
    fn from_bits_retain(bits: u32) -> DISPFlags {
        DISPFlags::from_bits_retain(bits)
    }
}
#[allow(dead_code, deprecated, unused_doc_comments, unused_attributes,
unused_mut, unused_imports, non_upper_case_globals, clippy ::
assign_op_pattern, clippy :: indexing_slicing, clippy :: same_name_method,
clippy :: iter_without_into_iter,)]
const _: () =
    {
        #[repr(transparent)]
        pub(crate) struct InternalBitFlags(u32);
        #[automatically_derived]
        #[doc(hidden)]
        unsafe impl ::core::clone::TrivialClone for InternalBitFlags { }
        #[automatically_derived]
        impl ::core::clone::Clone for InternalBitFlags {
            #[inline]
            fn clone(&self) -> InternalBitFlags {
                let _: ::core::clone::AssertParamIsClone<u32>;
                *self
            }
        }
        #[automatically_derived]
        impl ::core::marker::Copy for InternalBitFlags { }
        #[automatically_derived]
        impl ::core::marker::StructuralPartialEq for InternalBitFlags { }
        #[automatically_derived]
        impl ::core::cmp::PartialEq for InternalBitFlags {
            #[inline]
            fn eq(&self, other: &InternalBitFlags) -> bool {
                self.0 == other.0
            }
        }
        #[automatically_derived]
        impl ::core::cmp::Eq for InternalBitFlags {
            #[inline]
            #[doc(hidden)]
            #[coverage(off)]
            fn assert_fields_are_eq(&self) {
                let _: ::core::cmp::AssertParamIsEq<u32>;
            }
        }
        #[automatically_derived]
        impl ::core::cmp::PartialOrd for InternalBitFlags {
            #[inline]
            fn partial_cmp(&self, other: &InternalBitFlags)
                -> ::core::option::Option<::core::cmp::Ordering> {
                ::core::option::Option::Some(::core::cmp::Ord::cmp(self,
                        other))
            }
        }
        #[automatically_derived]
        impl ::core::cmp::Ord for InternalBitFlags {
            #[inline]
            fn cmp(&self, other: &InternalBitFlags) -> ::core::cmp::Ordering {
                ::core::cmp::Ord::cmp(&self.0, &other.0)
            }
        }
        #[automatically_derived]
        impl ::core::hash::Hash for InternalBitFlags {
            #[inline]
            fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
                ::core::hash::Hash::hash(&self.0, state)
            }
        }
        impl ::bitflags::__private::PublicFlags for DISPFlags {
            type Primitive = u32;
            type Internal = InternalBitFlags;
        }
        impl ::bitflags::__private::core::default::Default for
            InternalBitFlags {
            #[inline]
            fn default() -> Self { InternalBitFlags::empty() }
        }
        impl ::bitflags::__private::core::fmt::Debug for InternalBitFlags {
            fn fmt(&self,
                f: &mut ::bitflags::__private::core::fmt::Formatter<'_>)
                -> ::bitflags::__private::core::fmt::Result {
                if self.is_empty() {
                    f.write_fmt(format_args!("{0:#x}",
                            <u32 as ::bitflags::Bits>::EMPTY))
                } else {
                    ::bitflags::__private::core::fmt::Display::fmt(self, f)
                }
            }
        }
        impl ::bitflags::__private::core::fmt::Display for InternalBitFlags {
            fn fmt(&self,
                f: &mut ::bitflags::__private::core::fmt::Formatter<'_>)
                -> ::bitflags::__private::core::fmt::Result {
                ::bitflags::parser::to_writer(&DISPFlags(*self), f)
            }
        }
        impl ::bitflags::__private::core::str::FromStr for InternalBitFlags {
            type Err = ::bitflags::parser::ParseError;
            fn from_str(s: &str)
                ->
                    ::bitflags::__private::core::result::Result<Self,
                    Self::Err> {
                ::bitflags::parser::from_str::<DISPFlags>(s).map(|flags|
                        flags.0)
            }
        }
        impl ::bitflags::__private::core::convert::AsRef<u32> for
            InternalBitFlags {
            fn as_ref(&self) -> &u32 { &self.0 }
        }
        impl ::bitflags::__private::core::convert::From<u32> for
            InternalBitFlags {
            fn from(bits: u32) -> Self { Self::from_bits_retain(bits) }
        }
        #[allow(dead_code, deprecated, unused_attributes)]
        impl InternalBitFlags {
            /// Get a flags value with all bits unset.
            #[inline]
            pub const fn empty() -> Self {
                Self(<u32 as ::bitflags::Bits>::EMPTY)
            }
            /// Get a flags value with all known bits set.
            #[inline]
            pub const fn all() -> Self {
                let mut truncated = <u32 as ::bitflags::Bits>::EMPTY;
                let mut i = 0;
                {
                    {
                        let flag =
                            <DISPFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <DISPFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <DISPFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <DISPFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <DISPFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <DISPFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <DISPFlags as ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                let _ = i;
                Self(truncated)
            }
            /// Get the underlying bits value.
            ///
            /// The returned value is exactly the bits set in this flags value.
            #[inline]
            pub const fn bits(&self) -> u32 { self.0 }
            /// Convert from a bits value.
            ///
            /// This method will return `None` if any unknown bits are set.
            #[inline]
            pub const fn from_bits(bits: u32)
                -> ::bitflags::__private::core::option::Option<Self> {
                let truncated = Self::from_bits_truncate(bits).0;
                if truncated == bits {
                    ::bitflags::__private::core::option::Option::Some(Self(bits))
                } else { ::bitflags::__private::core::option::Option::None }
            }
            /// Convert from a bits value, unsetting any unknown bits.
            #[inline]
            pub const fn from_bits_truncate(bits: u32) -> Self {
                Self(bits & Self::all().0)
            }
            /// Convert from a bits value exactly.
            #[inline]
            pub const fn from_bits_retain(bits: u32) -> Self { Self(bits) }
            /// Get a flags value with the bits of a flag with the given name set.
            ///
            /// This method will return `None` if `name` is empty or doesn't
            /// correspond to any named flag.
            #[inline]
            pub fn from_name(name: &str)
                -> ::bitflags::__private::core::option::Option<Self> {
                {
                    if name == "SPFlagZero" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DISPFlags::SPFlagZero.bits()));
                    }
                };
                ;
                {
                    if name == "SPFlagVirtual" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DISPFlags::SPFlagVirtual.bits()));
                    }
                };
                ;
                {
                    if name == "SPFlagPureVirtual" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DISPFlags::SPFlagPureVirtual.bits()));
                    }
                };
                ;
                {
                    if name == "SPFlagLocalToUnit" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DISPFlags::SPFlagLocalToUnit.bits()));
                    }
                };
                ;
                {
                    if name == "SPFlagDefinition" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DISPFlags::SPFlagDefinition.bits()));
                    }
                };
                ;
                {
                    if name == "SPFlagOptimized" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DISPFlags::SPFlagOptimized.bits()));
                    }
                };
                ;
                {
                    if name == "SPFlagMainSubprogram" {
                        return ::bitflags::__private::core::option::Option::Some(Self(DISPFlags::SPFlagMainSubprogram.bits()));
                    }
                };
                ;
                let _ = name;
                ::bitflags::__private::core::option::Option::None
            }
            /// Whether all bits in this flags value are unset.
            #[inline]
            pub const fn is_empty(&self) -> bool {
                self.0 == <u32 as ::bitflags::Bits>::EMPTY
            }
            /// Whether all known bits in this flags value are set.
            #[inline]
            pub const fn is_all(&self) -> bool {
                Self::all().0 | self.0 == self.0
            }
            /// Whether any set bits in a source flags value are also set in a target flags value.
            #[inline]
            pub const fn intersects(&self, other: Self) -> bool {
                self.0 & other.0 != <u32 as ::bitflags::Bits>::EMPTY
            }
            /// Whether all set bits in a source flags value are also set in a target flags value.
            #[inline]
            pub const fn contains(&self, other: Self) -> bool {
                self.0 & other.0 == other.0
            }
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            pub fn insert(&mut self, other: Self) {
                *self = Self(self.0).union(other);
            }
            /// The intersection of a source flags value with the complement of a target flags
            /// value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `remove` won't truncate `other`, but the `!` operator will.
            #[inline]
            pub fn remove(&mut self, other: Self) {
                *self = Self(self.0).difference(other);
            }
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            pub fn toggle(&mut self, other: Self) {
                *self = Self(self.0).symmetric_difference(other);
            }
            /// Call `insert` when `value` is `true` or `remove` when `value` is `false`.
            #[inline]
            pub fn set(&mut self, other: Self, value: bool) {
                if value { self.insert(other); } else { self.remove(other); }
            }
            /// The bitwise and (`&`) of the bits in two flags values.
            #[inline]
            #[must_use]
            pub const fn intersection(self, other: Self) -> Self {
                Self(self.0 & other.0)
            }
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            #[must_use]
            pub const fn union(self, other: Self) -> Self {
                Self(self.0 | other.0)
            }
            /// The intersection of a source flags value with the complement of a target flags
            /// value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `difference` won't truncate `other`, but the `!` operator will.
            #[inline]
            #[must_use]
            pub const fn difference(self, other: Self) -> Self {
                Self(self.0 & !other.0)
            }
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            #[must_use]
            pub const fn symmetric_difference(self, other: Self) -> Self {
                Self(self.0 ^ other.0)
            }
            /// The bitwise negation (`!`) of the bits in a flags value, truncating the result.
            #[inline]
            #[must_use]
            pub const fn complement(self) -> Self {
                Self::from_bits_truncate(!self.0)
            }
        }
        impl ::bitflags::__private::core::fmt::Binary for InternalBitFlags {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::Binary::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::fmt::Octal for InternalBitFlags {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::Octal::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::fmt::LowerHex for InternalBitFlags {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::LowerHex::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::fmt::UpperHex for InternalBitFlags {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::UpperHex::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::ops::BitOr for InternalBitFlags {
            type Output = Self;
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            fn bitor(self, other: InternalBitFlags) -> Self {
                self.union(other)
            }
        }
        impl ::bitflags::__private::core::ops::BitOrAssign for
            InternalBitFlags {
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            fn bitor_assign(&mut self, other: Self) { self.insert(other); }
        }
        impl ::bitflags::__private::core::ops::BitXor for InternalBitFlags {
            type Output = Self;
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            fn bitxor(self, other: Self) -> Self {
                self.symmetric_difference(other)
            }
        }
        impl ::bitflags::__private::core::ops::BitXorAssign for
            InternalBitFlags {
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            fn bitxor_assign(&mut self, other: Self) { self.toggle(other); }
        }
        impl ::bitflags::__private::core::ops::BitAnd for InternalBitFlags {
            type Output = Self;
            /// The bitwise and (`&`) of the bits in two flags values.
            #[inline]
            fn bitand(self, other: Self) -> Self { self.intersection(other) }
        }
        impl ::bitflags::__private::core::ops::BitAndAssign for
            InternalBitFlags {
            /// The bitwise and (`&`) of the bits in two flags values.
            #[inline]
            fn bitand_assign(&mut self, other: Self) {
                *self =
                    Self::from_bits_retain(self.bits()).intersection(other);
            }
        }
        impl ::bitflags::__private::core::ops::Sub for InternalBitFlags {
            type Output = Self;
            /// The intersection of a source flags value with the complement of a target flags value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `difference` won't truncate `other`, but the `!` operator will.
            #[inline]
            fn sub(self, other: Self) -> Self { self.difference(other) }
        }
        impl ::bitflags::__private::core::ops::SubAssign for InternalBitFlags
            {
            /// The intersection of a source flags value with the complement of a target flags value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `difference` won't truncate `other`, but the `!` operator will.
            #[inline]
            fn sub_assign(&mut self, other: Self) { self.remove(other); }
        }
        impl ::bitflags::__private::core::ops::Not for InternalBitFlags {
            type Output = Self;
            /// The bitwise negation (`!`) of the bits in a flags value, truncating the result.
            #[inline]
            fn not(self) -> Self { self.complement() }
        }
        impl ::bitflags::__private::core::iter::Extend<InternalBitFlags> for
            InternalBitFlags {
            /// The bitwise or (`|`) of the bits in each flags value.
            fn extend<T: ::bitflags::__private::core::iter::IntoIterator<Item
                = Self>>(&mut self, iterator: T) {
                for item in iterator { self.insert(item) }
            }
        }
        impl ::bitflags::__private::core::iter::FromIterator<InternalBitFlags>
            for InternalBitFlags {
            /// The bitwise or (`|`) of the bits in each flags value.
            fn from_iter<T: ::bitflags::__private::core::iter::IntoIterator<Item
                = Self>>(iterator: T) -> Self {
                use ::bitflags::__private::core::iter::Extend;
                let mut result = Self::empty();
                result.extend(iterator);
                result
            }
        }
        impl InternalBitFlags {
            /// Yield a set of contained flags values.
            ///
            /// Each yielded flags value will correspond to a defined named flag. Any unknown bits
            /// will be yielded together as a final flags value.
            #[inline]
            pub const fn iter(&self) -> ::bitflags::iter::Iter<DISPFlags> {
                ::bitflags::iter::Iter::__private_const_new(<DISPFlags as
                        ::bitflags::Flags>::FLAGS,
                    DISPFlags::from_bits_retain(self.bits()),
                    DISPFlags::from_bits_retain(self.bits()))
            }
            /// Yield a set of contained named flags values.
            ///
            /// This method is like [`iter`](#method.iter), except only yields bits in contained named flags.
            /// Any unknown bits, or bits not corresponding to a contained flag will not be yielded.
            #[inline]
            pub const fn iter_names(&self)
                -> ::bitflags::iter::IterNames<DISPFlags> {
                ::bitflags::iter::IterNames::__private_const_new(<DISPFlags as
                        ::bitflags::Flags>::FLAGS,
                    DISPFlags::from_bits_retain(self.bits()),
                    DISPFlags::from_bits_retain(self.bits()))
            }
        }
        impl ::bitflags::__private::core::iter::IntoIterator for
            InternalBitFlags {
            type Item = DISPFlags;
            type IntoIter = ::bitflags::iter::Iter<DISPFlags>;
            fn into_iter(self) -> Self::IntoIter { self.iter() }
        }
        impl InternalBitFlags {
            /// Returns a mutable reference to the raw value of the flags currently stored.
            #[inline]
            pub fn bits_mut(&mut self) -> &mut u32 { &mut self.0 }
        }
        #[allow(dead_code, deprecated, unused_attributes)]
        impl DISPFlags {
            /// Get a flags value with all bits unset.
            #[inline]
            pub const fn empty() -> Self { Self(InternalBitFlags::empty()) }
            /// Get a flags value with all known bits set.
            #[inline]
            pub const fn all() -> Self { Self(InternalBitFlags::all()) }
            /// Get the underlying bits value.
            ///
            /// The returned value is exactly the bits set in this flags value.
            #[inline]
            pub const fn bits(&self) -> u32 { self.0.bits() }
            /// Convert from a bits value.
            ///
            /// This method will return `None` if any unknown bits are set.
            #[inline]
            pub const fn from_bits(bits: u32)
                -> ::bitflags::__private::core::option::Option<Self> {
                match InternalBitFlags::from_bits(bits) {
                    ::bitflags::__private::core::option::Option::Some(bits) =>
                        ::bitflags::__private::core::option::Option::Some(Self(bits)),
                    ::bitflags::__private::core::option::Option::None =>
                        ::bitflags::__private::core::option::Option::None,
                }
            }
            /// Convert from a bits value, unsetting any unknown bits.
            #[inline]
            pub const fn from_bits_truncate(bits: u32) -> Self {
                Self(InternalBitFlags::from_bits_truncate(bits))
            }
            /// Convert from a bits value exactly.
            #[inline]
            pub const fn from_bits_retain(bits: u32) -> Self {
                Self(InternalBitFlags::from_bits_retain(bits))
            }
            /// Get a flags value with the bits of a flag with the given name set.
            ///
            /// This method will return `None` if `name` is empty or doesn't
            /// correspond to any named flag.
            #[inline]
            pub fn from_name(name: &str)
                -> ::bitflags::__private::core::option::Option<Self> {
                match InternalBitFlags::from_name(name) {
                    ::bitflags::__private::core::option::Option::Some(bits) =>
                        ::bitflags::__private::core::option::Option::Some(Self(bits)),
                    ::bitflags::__private::core::option::Option::None =>
                        ::bitflags::__private::core::option::Option::None,
                }
            }
            /// Whether all bits in this flags value are unset.
            #[inline]
            pub const fn is_empty(&self) -> bool { self.0.is_empty() }
            /// Whether all known bits in this flags value are set.
            #[inline]
            pub const fn is_all(&self) -> bool { self.0.is_all() }
            /// Whether any set bits in a source flags value are also set in a target flags value.
            #[inline]
            pub const fn intersects(&self, other: Self) -> bool {
                self.0.intersects(other.0)
            }
            /// Whether all set bits in a source flags value are also set in a target flags value.
            #[inline]
            pub const fn contains(&self, other: Self) -> bool {
                self.0.contains(other.0)
            }
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            pub fn insert(&mut self, other: Self) { self.0.insert(other.0) }
            /// The intersection of a source flags value with the complement of a target flags
            /// value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `remove` won't truncate `other`, but the `!` operator will.
            #[inline]
            pub fn remove(&mut self, other: Self) { self.0.remove(other.0) }
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            pub fn toggle(&mut self, other: Self) { self.0.toggle(other.0) }
            /// Call `insert` when `value` is `true` or `remove` when `value` is `false`.
            #[inline]
            pub fn set(&mut self, other: Self, value: bool) {
                self.0.set(other.0, value)
            }
            /// The bitwise and (`&`) of the bits in two flags values.
            #[inline]
            #[must_use]
            pub const fn intersection(self, other: Self) -> Self {
                Self(self.0.intersection(other.0))
            }
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            #[must_use]
            pub const fn union(self, other: Self) -> Self {
                Self(self.0.union(other.0))
            }
            /// The intersection of a source flags value with the complement of a target flags
            /// value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `difference` won't truncate `other`, but the `!` operator will.
            #[inline]
            #[must_use]
            pub const fn difference(self, other: Self) -> Self {
                Self(self.0.difference(other.0))
            }
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            #[must_use]
            pub const fn symmetric_difference(self, other: Self) -> Self {
                Self(self.0.symmetric_difference(other.0))
            }
            /// The bitwise negation (`!`) of the bits in a flags value, truncating the result.
            #[inline]
            #[must_use]
            pub const fn complement(self) -> Self {
                Self(self.0.complement())
            }
        }
        impl ::bitflags::__private::core::fmt::Binary for DISPFlags {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::Binary::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::fmt::Octal for DISPFlags {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::Octal::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::fmt::LowerHex for DISPFlags {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::LowerHex::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::fmt::UpperHex for DISPFlags {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::UpperHex::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::ops::BitOr for DISPFlags {
            type Output = Self;
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            fn bitor(self, other: DISPFlags) -> Self { self.union(other) }
        }
        impl ::bitflags::__private::core::ops::BitOrAssign for DISPFlags {
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            fn bitor_assign(&mut self, other: Self) { self.insert(other); }
        }
        impl ::bitflags::__private::core::ops::BitXor for DISPFlags {
            type Output = Self;
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            fn bitxor(self, other: Self) -> Self {
                self.symmetric_difference(other)
            }
        }
        impl ::bitflags::__private::core::ops::BitXorAssign for DISPFlags {
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            fn bitxor_assign(&mut self, other: Self) { self.toggle(other); }
        }
        impl ::bitflags::__private::core::ops::BitAnd for DISPFlags {
            type Output = Self;
            /// The bitwise and (`&`) of the bits in two flags values.
            #[inline]
            fn bitand(self, other: Self) -> Self { self.intersection(other) }
        }
        impl ::bitflags::__private::core::ops::BitAndAssign for DISPFlags {
            /// The bitwise and (`&`) of the bits in two flags values.
            #[inline]
            fn bitand_assign(&mut self, other: Self) {
                *self =
                    Self::from_bits_retain(self.bits()).intersection(other);
            }
        }
        impl ::bitflags::__private::core::ops::Sub for DISPFlags {
            type Output = Self;
            /// The intersection of a source flags value with the complement of a target flags value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `difference` won't truncate `other`, but the `!` operator will.
            #[inline]
            fn sub(self, other: Self) -> Self { self.difference(other) }
        }
        impl ::bitflags::__private::core::ops::SubAssign for DISPFlags {
            /// The intersection of a source flags value with the complement of a target flags value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `difference` won't truncate `other`, but the `!` operator will.
            #[inline]
            fn sub_assign(&mut self, other: Self) { self.remove(other); }
        }
        impl ::bitflags::__private::core::ops::Not for DISPFlags {
            type Output = Self;
            /// The bitwise negation (`!`) of the bits in a flags value, truncating the result.
            #[inline]
            fn not(self) -> Self { self.complement() }
        }
        impl ::bitflags::__private::core::iter::Extend<DISPFlags> for
            DISPFlags {
            /// The bitwise or (`|`) of the bits in each flags value.
            fn extend<T: ::bitflags::__private::core::iter::IntoIterator<Item
                = Self>>(&mut self, iterator: T) {
                for item in iterator { self.insert(item) }
            }
        }
        impl ::bitflags::__private::core::iter::FromIterator<DISPFlags> for
            DISPFlags {
            /// The bitwise or (`|`) of the bits in each flags value.
            fn from_iter<T: ::bitflags::__private::core::iter::IntoIterator<Item
                = Self>>(iterator: T) -> Self {
                use ::bitflags::__private::core::iter::Extend;
                let mut result = Self::empty();
                result.extend(iterator);
                result
            }
        }
        impl DISPFlags {
            /// Yield a set of contained flags values.
            ///
            /// Each yielded flags value will correspond to a defined named flag. Any unknown bits
            /// will be yielded together as a final flags value.
            #[inline]
            pub const fn iter(&self) -> ::bitflags::iter::Iter<DISPFlags> {
                ::bitflags::iter::Iter::__private_const_new(<DISPFlags as
                        ::bitflags::Flags>::FLAGS,
                    DISPFlags::from_bits_retain(self.bits()),
                    DISPFlags::from_bits_retain(self.bits()))
            }
            /// Yield a set of contained named flags values.
            ///
            /// This method is like [`iter`](#method.iter), except only yields bits in contained named flags.
            /// Any unknown bits, or bits not corresponding to a contained flag will not be yielded.
            #[inline]
            pub const fn iter_names(&self)
                -> ::bitflags::iter::IterNames<DISPFlags> {
                ::bitflags::iter::IterNames::__private_const_new(<DISPFlags as
                        ::bitflags::Flags>::FLAGS,
                    DISPFlags::from_bits_retain(self.bits()),
                    DISPFlags::from_bits_retain(self.bits()))
            }
        }
        impl ::bitflags::__private::core::iter::IntoIterator for DISPFlags {
            type Item = DISPFlags;
            type IntoIter = ::bitflags::iter::Iter<DISPFlags>;
            fn into_iter(self) -> Self::IntoIter { self.iter() }
        }
    };Clone, #[automatically_derived]
impl ::core::marker::Copy for DISPFlags { }Copy, #[automatically_derived]
impl ::core::default::Default for DISPFlags {
    #[inline]
    fn default() -> DISPFlags {
        DISPFlags(::core::default::Default::default())
    }
}Default)]
816        pub(crate) struct DISPFlags: u32 {
817            const SPFlagZero              = 0;
818            const SPFlagVirtual           = 1;
819            const SPFlagPureVirtual       = 2;
820            const SPFlagLocalToUnit       = (1 << 2);
821            const SPFlagDefinition        = (1 << 3);
822            const SPFlagOptimized         = (1 << 4);
823            const SPFlagMainSubprogram    = (1 << 5);
824        }
825    }
826
827    /// LLVMRustDebugEmissionKind
828    #[derive(#[automatically_derived]
impl ::core::marker::Copy for DebugEmissionKind { }Copy, #[automatically_derived]
impl ::core::clone::Clone for DebugEmissionKind {
    #[inline]
    fn clone(&self) -> DebugEmissionKind { *self }
}Clone)]
829    #[repr(C)]
830    pub(crate) enum DebugEmissionKind {
831        NoDebug,
832        FullDebug,
833        LineTablesOnly,
834        DebugDirectivesOnly,
835    }
836
837    /// LLVMRustDebugNameTableKind
838    #[derive(#[automatically_derived]
impl ::core::clone::Clone for DebugNameTableKind {
    #[inline]
    fn clone(&self) -> DebugNameTableKind { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for DebugNameTableKind { }Copy)]
839    #[repr(C)]
840    pub(crate) enum DebugNameTableKind {
841        Default,
842        #[expect(dead_code)]
843        Gnu,
844        None,
845    }
846}
847
848// These values **must** match with LLVMRustAllocKindFlags
849#[repr(transparent)]
pub(crate) struct AllocKindFlags(<AllocKindFlags as
    ::bitflags::__private::PublicFlags>::Internal);
#[automatically_derived]
impl ::core::default::Default for AllocKindFlags {
    #[inline]
    fn default() -> AllocKindFlags {
        AllocKindFlags(::core::default::Default::default())
    }
}
impl AllocKindFlags {
    #[allow(deprecated, non_upper_case_globals,)]
    pub const Unknown: Self = Self::from_bits_retain(0);
    #[allow(deprecated, non_upper_case_globals,)]
    pub const Alloc: Self = Self::from_bits_retain(1);
    #[allow(deprecated, non_upper_case_globals,)]
    pub const Realloc: Self = Self::from_bits_retain(1 << 1);
    #[allow(deprecated, non_upper_case_globals,)]
    pub const Free: Self = Self::from_bits_retain(1 << 2);
    #[allow(deprecated, non_upper_case_globals,)]
    pub const Uninitialized: Self = Self::from_bits_retain(1 << 3);
    #[allow(deprecated, non_upper_case_globals,)]
    pub const Zeroed: Self = Self::from_bits_retain(1 << 4);
    #[allow(deprecated, non_upper_case_globals,)]
    pub const Aligned: Self = Self::from_bits_retain(1 << 5);
}
impl ::bitflags::Flags for AllocKindFlags {
    const FLAGS: &'static [::bitflags::Flag<AllocKindFlags>] =
        &[{

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("Unknown", AllocKindFlags::Unknown)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("Alloc", AllocKindFlags::Alloc)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("Realloc", AllocKindFlags::Realloc)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("Free", AllocKindFlags::Free)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("Uninitialized",
                            AllocKindFlags::Uninitialized)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("Zeroed", AllocKindFlags::Zeroed)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("Aligned", AllocKindFlags::Aligned)
                    }];
    type Bits = u64;
    fn bits(&self) -> u64 { AllocKindFlags::bits(self) }
    fn from_bits_retain(bits: u64) -> AllocKindFlags {
        AllocKindFlags::from_bits_retain(bits)
    }
}
#[allow(dead_code, deprecated, unused_doc_comments, unused_attributes,
unused_mut, unused_imports, non_upper_case_globals, clippy ::
assign_op_pattern, clippy :: indexing_slicing, clippy :: same_name_method,
clippy :: iter_without_into_iter,)]
const _: () =
    {
        #[repr(transparent)]
        pub(crate) struct InternalBitFlags(u64);
        #[automatically_derived]
        #[doc(hidden)]
        unsafe impl ::core::clone::TrivialClone for InternalBitFlags { }
        #[automatically_derived]
        impl ::core::clone::Clone for InternalBitFlags {
            #[inline]
            fn clone(&self) -> InternalBitFlags {
                let _: ::core::clone::AssertParamIsClone<u64>;
                *self
            }
        }
        #[automatically_derived]
        impl ::core::marker::Copy for InternalBitFlags { }
        #[automatically_derived]
        impl ::core::marker::StructuralPartialEq for InternalBitFlags { }
        #[automatically_derived]
        impl ::core::cmp::PartialEq for InternalBitFlags {
            #[inline]
            fn eq(&self, other: &InternalBitFlags) -> bool {
                self.0 == other.0
            }
        }
        #[automatically_derived]
        impl ::core::cmp::Eq for InternalBitFlags {
            #[inline]
            #[doc(hidden)]
            #[coverage(off)]
            fn assert_fields_are_eq(&self) {
                let _: ::core::cmp::AssertParamIsEq<u64>;
            }
        }
        #[automatically_derived]
        impl ::core::cmp::PartialOrd for InternalBitFlags {
            #[inline]
            fn partial_cmp(&self, other: &InternalBitFlags)
                -> ::core::option::Option<::core::cmp::Ordering> {
                ::core::option::Option::Some(::core::cmp::Ord::cmp(self,
                        other))
            }
        }
        #[automatically_derived]
        impl ::core::cmp::Ord for InternalBitFlags {
            #[inline]
            fn cmp(&self, other: &InternalBitFlags) -> ::core::cmp::Ordering {
                ::core::cmp::Ord::cmp(&self.0, &other.0)
            }
        }
        #[automatically_derived]
        impl ::core::hash::Hash for InternalBitFlags {
            #[inline]
            fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
                ::core::hash::Hash::hash(&self.0, state)
            }
        }
        impl ::bitflags::__private::PublicFlags for AllocKindFlags {
            type Primitive = u64;
            type Internal = InternalBitFlags;
        }
        impl ::bitflags::__private::core::default::Default for
            InternalBitFlags {
            #[inline]
            fn default() -> Self { InternalBitFlags::empty() }
        }
        impl ::bitflags::__private::core::fmt::Debug for InternalBitFlags {
            fn fmt(&self,
                f: &mut ::bitflags::__private::core::fmt::Formatter<'_>)
                -> ::bitflags::__private::core::fmt::Result {
                if self.is_empty() {
                    f.write_fmt(format_args!("{0:#x}",
                            <u64 as ::bitflags::Bits>::EMPTY))
                } else {
                    ::bitflags::__private::core::fmt::Display::fmt(self, f)
                }
            }
        }
        impl ::bitflags::__private::core::fmt::Display for InternalBitFlags {
            fn fmt(&self,
                f: &mut ::bitflags::__private::core::fmt::Formatter<'_>)
                -> ::bitflags::__private::core::fmt::Result {
                ::bitflags::parser::to_writer(&AllocKindFlags(*self), f)
            }
        }
        impl ::bitflags::__private::core::str::FromStr for InternalBitFlags {
            type Err = ::bitflags::parser::ParseError;
            fn from_str(s: &str)
                ->
                    ::bitflags::__private::core::result::Result<Self,
                    Self::Err> {
                ::bitflags::parser::from_str::<AllocKindFlags>(s).map(|flags|
                        flags.0)
            }
        }
        impl ::bitflags::__private::core::convert::AsRef<u64> for
            InternalBitFlags {
            fn as_ref(&self) -> &u64 { &self.0 }
        }
        impl ::bitflags::__private::core::convert::From<u64> for
            InternalBitFlags {
            fn from(bits: u64) -> Self { Self::from_bits_retain(bits) }
        }
        #[allow(dead_code, deprecated, unused_attributes)]
        impl InternalBitFlags {
            /// Get a flags value with all bits unset.
            #[inline]
            pub const fn empty() -> Self {
                Self(<u64 as ::bitflags::Bits>::EMPTY)
            }
            /// Get a flags value with all known bits set.
            #[inline]
            pub const fn all() -> Self {
                let mut truncated = <u64 as ::bitflags::Bits>::EMPTY;
                let mut i = 0;
                {
                    {
                        let flag =
                            <AllocKindFlags as
                                            ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <AllocKindFlags as
                                            ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <AllocKindFlags as
                                            ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <AllocKindFlags as
                                            ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <AllocKindFlags as
                                            ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <AllocKindFlags as
                                            ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <AllocKindFlags as
                                            ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                let _ = i;
                Self(truncated)
            }
            /// Get the underlying bits value.
            ///
            /// The returned value is exactly the bits set in this flags value.
            #[inline]
            pub const fn bits(&self) -> u64 { self.0 }
            /// Convert from a bits value.
            ///
            /// This method will return `None` if any unknown bits are set.
            #[inline]
            pub const fn from_bits(bits: u64)
                -> ::bitflags::__private::core::option::Option<Self> {
                let truncated = Self::from_bits_truncate(bits).0;
                if truncated == bits {
                    ::bitflags::__private::core::option::Option::Some(Self(bits))
                } else { ::bitflags::__private::core::option::Option::None }
            }
            /// Convert from a bits value, unsetting any unknown bits.
            #[inline]
            pub const fn from_bits_truncate(bits: u64) -> Self {
                Self(bits & Self::all().0)
            }
            /// Convert from a bits value exactly.
            #[inline]
            pub const fn from_bits_retain(bits: u64) -> Self { Self(bits) }
            /// Get a flags value with the bits of a flag with the given name set.
            ///
            /// This method will return `None` if `name` is empty or doesn't
            /// correspond to any named flag.
            #[inline]
            pub fn from_name(name: &str)
                -> ::bitflags::__private::core::option::Option<Self> {
                {
                    if name == "Unknown" {
                        return ::bitflags::__private::core::option::Option::Some(Self(AllocKindFlags::Unknown.bits()));
                    }
                };
                ;
                {
                    if name == "Alloc" {
                        return ::bitflags::__private::core::option::Option::Some(Self(AllocKindFlags::Alloc.bits()));
                    }
                };
                ;
                {
                    if name == "Realloc" {
                        return ::bitflags::__private::core::option::Option::Some(Self(AllocKindFlags::Realloc.bits()));
                    }
                };
                ;
                {
                    if name == "Free" {
                        return ::bitflags::__private::core::option::Option::Some(Self(AllocKindFlags::Free.bits()));
                    }
                };
                ;
                {
                    if name == "Uninitialized" {
                        return ::bitflags::__private::core::option::Option::Some(Self(AllocKindFlags::Uninitialized.bits()));
                    }
                };
                ;
                {
                    if name == "Zeroed" {
                        return ::bitflags::__private::core::option::Option::Some(Self(AllocKindFlags::Zeroed.bits()));
                    }
                };
                ;
                {
                    if name == "Aligned" {
                        return ::bitflags::__private::core::option::Option::Some(Self(AllocKindFlags::Aligned.bits()));
                    }
                };
                ;
                let _ = name;
                ::bitflags::__private::core::option::Option::None
            }
            /// Whether all bits in this flags value are unset.
            #[inline]
            pub const fn is_empty(&self) -> bool {
                self.0 == <u64 as ::bitflags::Bits>::EMPTY
            }
            /// Whether all known bits in this flags value are set.
            #[inline]
            pub const fn is_all(&self) -> bool {
                Self::all().0 | self.0 == self.0
            }
            /// Whether any set bits in a source flags value are also set in a target flags value.
            #[inline]
            pub const fn intersects(&self, other: Self) -> bool {
                self.0 & other.0 != <u64 as ::bitflags::Bits>::EMPTY
            }
            /// Whether all set bits in a source flags value are also set in a target flags value.
            #[inline]
            pub const fn contains(&self, other: Self) -> bool {
                self.0 & other.0 == other.0
            }
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            pub fn insert(&mut self, other: Self) {
                *self = Self(self.0).union(other);
            }
            /// The intersection of a source flags value with the complement of a target flags
            /// value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `remove` won't truncate `other`, but the `!` operator will.
            #[inline]
            pub fn remove(&mut self, other: Self) {
                *self = Self(self.0).difference(other);
            }
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            pub fn toggle(&mut self, other: Self) {
                *self = Self(self.0).symmetric_difference(other);
            }
            /// Call `insert` when `value` is `true` or `remove` when `value` is `false`.
            #[inline]
            pub fn set(&mut self, other: Self, value: bool) {
                if value { self.insert(other); } else { self.remove(other); }
            }
            /// The bitwise and (`&`) of the bits in two flags values.
            #[inline]
            #[must_use]
            pub const fn intersection(self, other: Self) -> Self {
                Self(self.0 & other.0)
            }
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            #[must_use]
            pub const fn union(self, other: Self) -> Self {
                Self(self.0 | other.0)
            }
            /// The intersection of a source flags value with the complement of a target flags
            /// value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `difference` won't truncate `other`, but the `!` operator will.
            #[inline]
            #[must_use]
            pub const fn difference(self, other: Self) -> Self {
                Self(self.0 & !other.0)
            }
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            #[must_use]
            pub const fn symmetric_difference(self, other: Self) -> Self {
                Self(self.0 ^ other.0)
            }
            /// The bitwise negation (`!`) of the bits in a flags value, truncating the result.
            #[inline]
            #[must_use]
            pub const fn complement(self) -> Self {
                Self::from_bits_truncate(!self.0)
            }
        }
        impl ::bitflags::__private::core::fmt::Binary for InternalBitFlags {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::Binary::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::fmt::Octal for InternalBitFlags {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::Octal::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::fmt::LowerHex for InternalBitFlags {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::LowerHex::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::fmt::UpperHex for InternalBitFlags {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::UpperHex::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::ops::BitOr for InternalBitFlags {
            type Output = Self;
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            fn bitor(self, other: InternalBitFlags) -> Self {
                self.union(other)
            }
        }
        impl ::bitflags::__private::core::ops::BitOrAssign for
            InternalBitFlags {
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            fn bitor_assign(&mut self, other: Self) { self.insert(other); }
        }
        impl ::bitflags::__private::core::ops::BitXor for InternalBitFlags {
            type Output = Self;
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            fn bitxor(self, other: Self) -> Self {
                self.symmetric_difference(other)
            }
        }
        impl ::bitflags::__private::core::ops::BitXorAssign for
            InternalBitFlags {
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            fn bitxor_assign(&mut self, other: Self) { self.toggle(other); }
        }
        impl ::bitflags::__private::core::ops::BitAnd for InternalBitFlags {
            type Output = Self;
            /// The bitwise and (`&`) of the bits in two flags values.
            #[inline]
            fn bitand(self, other: Self) -> Self { self.intersection(other) }
        }
        impl ::bitflags::__private::core::ops::BitAndAssign for
            InternalBitFlags {
            /// The bitwise and (`&`) of the bits in two flags values.
            #[inline]
            fn bitand_assign(&mut self, other: Self) {
                *self =
                    Self::from_bits_retain(self.bits()).intersection(other);
            }
        }
        impl ::bitflags::__private::core::ops::Sub for InternalBitFlags {
            type Output = Self;
            /// The intersection of a source flags value with the complement of a target flags value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `difference` won't truncate `other`, but the `!` operator will.
            #[inline]
            fn sub(self, other: Self) -> Self { self.difference(other) }
        }
        impl ::bitflags::__private::core::ops::SubAssign for InternalBitFlags
            {
            /// The intersection of a source flags value with the complement of a target flags value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `difference` won't truncate `other`, but the `!` operator will.
            #[inline]
            fn sub_assign(&mut self, other: Self) { self.remove(other); }
        }
        impl ::bitflags::__private::core::ops::Not for InternalBitFlags {
            type Output = Self;
            /// The bitwise negation (`!`) of the bits in a flags value, truncating the result.
            #[inline]
            fn not(self) -> Self { self.complement() }
        }
        impl ::bitflags::__private::core::iter::Extend<InternalBitFlags> for
            InternalBitFlags {
            /// The bitwise or (`|`) of the bits in each flags value.
            fn extend<T: ::bitflags::__private::core::iter::IntoIterator<Item
                = Self>>(&mut self, iterator: T) {
                for item in iterator { self.insert(item) }
            }
        }
        impl ::bitflags::__private::core::iter::FromIterator<InternalBitFlags>
            for InternalBitFlags {
            /// The bitwise or (`|`) of the bits in each flags value.
            fn from_iter<T: ::bitflags::__private::core::iter::IntoIterator<Item
                = Self>>(iterator: T) -> Self {
                use ::bitflags::__private::core::iter::Extend;
                let mut result = Self::empty();
                result.extend(iterator);
                result
            }
        }
        impl InternalBitFlags {
            /// Yield a set of contained flags values.
            ///
            /// Each yielded flags value will correspond to a defined named flag. Any unknown bits
            /// will be yielded together as a final flags value.
            #[inline]
            pub const fn iter(&self)
                -> ::bitflags::iter::Iter<AllocKindFlags> {
                ::bitflags::iter::Iter::__private_const_new(<AllocKindFlags as
                        ::bitflags::Flags>::FLAGS,
                    AllocKindFlags::from_bits_retain(self.bits()),
                    AllocKindFlags::from_bits_retain(self.bits()))
            }
            /// Yield a set of contained named flags values.
            ///
            /// This method is like [`iter`](#method.iter), except only yields bits in contained named flags.
            /// Any unknown bits, or bits not corresponding to a contained flag will not be yielded.
            #[inline]
            pub const fn iter_names(&self)
                -> ::bitflags::iter::IterNames<AllocKindFlags> {
                ::bitflags::iter::IterNames::__private_const_new(<AllocKindFlags
                        as ::bitflags::Flags>::FLAGS,
                    AllocKindFlags::from_bits_retain(self.bits()),
                    AllocKindFlags::from_bits_retain(self.bits()))
            }
        }
        impl ::bitflags::__private::core::iter::IntoIterator for
            InternalBitFlags {
            type Item = AllocKindFlags;
            type IntoIter = ::bitflags::iter::Iter<AllocKindFlags>;
            fn into_iter(self) -> Self::IntoIter { self.iter() }
        }
        impl InternalBitFlags {
            /// Returns a mutable reference to the raw value of the flags currently stored.
            #[inline]
            pub fn bits_mut(&mut self) -> &mut u64 { &mut self.0 }
        }
        #[allow(dead_code, deprecated, unused_attributes)]
        impl AllocKindFlags {
            /// Get a flags value with all bits unset.
            #[inline]
            pub const fn empty() -> Self { Self(InternalBitFlags::empty()) }
            /// Get a flags value with all known bits set.
            #[inline]
            pub const fn all() -> Self { Self(InternalBitFlags::all()) }
            /// Get the underlying bits value.
            ///
            /// The returned value is exactly the bits set in this flags value.
            #[inline]
            pub const fn bits(&self) -> u64 { self.0.bits() }
            /// Convert from a bits value.
            ///
            /// This method will return `None` if any unknown bits are set.
            #[inline]
            pub const fn from_bits(bits: u64)
                -> ::bitflags::__private::core::option::Option<Self> {
                match InternalBitFlags::from_bits(bits) {
                    ::bitflags::__private::core::option::Option::Some(bits) =>
                        ::bitflags::__private::core::option::Option::Some(Self(bits)),
                    ::bitflags::__private::core::option::Option::None =>
                        ::bitflags::__private::core::option::Option::None,
                }
            }
            /// Convert from a bits value, unsetting any unknown bits.
            #[inline]
            pub const fn from_bits_truncate(bits: u64) -> Self {
                Self(InternalBitFlags::from_bits_truncate(bits))
            }
            /// Convert from a bits value exactly.
            #[inline]
            pub const fn from_bits_retain(bits: u64) -> Self {
                Self(InternalBitFlags::from_bits_retain(bits))
            }
            /// Get a flags value with the bits of a flag with the given name set.
            ///
            /// This method will return `None` if `name` is empty or doesn't
            /// correspond to any named flag.
            #[inline]
            pub fn from_name(name: &str)
                -> ::bitflags::__private::core::option::Option<Self> {
                match InternalBitFlags::from_name(name) {
                    ::bitflags::__private::core::option::Option::Some(bits) =>
                        ::bitflags::__private::core::option::Option::Some(Self(bits)),
                    ::bitflags::__private::core::option::Option::None =>
                        ::bitflags::__private::core::option::Option::None,
                }
            }
            /// Whether all bits in this flags value are unset.
            #[inline]
            pub const fn is_empty(&self) -> bool { self.0.is_empty() }
            /// Whether all known bits in this flags value are set.
            #[inline]
            pub const fn is_all(&self) -> bool { self.0.is_all() }
            /// Whether any set bits in a source flags value are also set in a target flags value.
            #[inline]
            pub const fn intersects(&self, other: Self) -> bool {
                self.0.intersects(other.0)
            }
            /// Whether all set bits in a source flags value are also set in a target flags value.
            #[inline]
            pub const fn contains(&self, other: Self) -> bool {
                self.0.contains(other.0)
            }
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            pub fn insert(&mut self, other: Self) { self.0.insert(other.0) }
            /// The intersection of a source flags value with the complement of a target flags
            /// value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `remove` won't truncate `other`, but the `!` operator will.
            #[inline]
            pub fn remove(&mut self, other: Self) { self.0.remove(other.0) }
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            pub fn toggle(&mut self, other: Self) { self.0.toggle(other.0) }
            /// Call `insert` when `value` is `true` or `remove` when `value` is `false`.
            #[inline]
            pub fn set(&mut self, other: Self, value: bool) {
                self.0.set(other.0, value)
            }
            /// The bitwise and (`&`) of the bits in two flags values.
            #[inline]
            #[must_use]
            pub const fn intersection(self, other: Self) -> Self {
                Self(self.0.intersection(other.0))
            }
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            #[must_use]
            pub const fn union(self, other: Self) -> Self {
                Self(self.0.union(other.0))
            }
            /// The intersection of a source flags value with the complement of a target flags
            /// value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `difference` won't truncate `other`, but the `!` operator will.
            #[inline]
            #[must_use]
            pub const fn difference(self, other: Self) -> Self {
                Self(self.0.difference(other.0))
            }
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            #[must_use]
            pub const fn symmetric_difference(self, other: Self) -> Self {
                Self(self.0.symmetric_difference(other.0))
            }
            /// The bitwise negation (`!`) of the bits in a flags value, truncating the result.
            #[inline]
            #[must_use]
            pub const fn complement(self) -> Self {
                Self(self.0.complement())
            }
        }
        impl ::bitflags::__private::core::fmt::Binary for AllocKindFlags {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::Binary::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::fmt::Octal for AllocKindFlags {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::Octal::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::fmt::LowerHex for AllocKindFlags {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::LowerHex::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::fmt::UpperHex for AllocKindFlags {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::UpperHex::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::ops::BitOr for AllocKindFlags {
            type Output = Self;
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            fn bitor(self, other: AllocKindFlags) -> Self {
                self.union(other)
            }
        }
        impl ::bitflags::__private::core::ops::BitOrAssign for AllocKindFlags
            {
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            fn bitor_assign(&mut self, other: Self) { self.insert(other); }
        }
        impl ::bitflags::__private::core::ops::BitXor for AllocKindFlags {
            type Output = Self;
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            fn bitxor(self, other: Self) -> Self {
                self.symmetric_difference(other)
            }
        }
        impl ::bitflags::__private::core::ops::BitXorAssign for AllocKindFlags
            {
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            fn bitxor_assign(&mut self, other: Self) { self.toggle(other); }
        }
        impl ::bitflags::__private::core::ops::BitAnd for AllocKindFlags {
            type Output = Self;
            /// The bitwise and (`&`) of the bits in two flags values.
            #[inline]
            fn bitand(self, other: Self) -> Self { self.intersection(other) }
        }
        impl ::bitflags::__private::core::ops::BitAndAssign for AllocKindFlags
            {
            /// The bitwise and (`&`) of the bits in two flags values.
            #[inline]
            fn bitand_assign(&mut self, other: Self) {
                *self =
                    Self::from_bits_retain(self.bits()).intersection(other);
            }
        }
        impl ::bitflags::__private::core::ops::Sub for AllocKindFlags {
            type Output = Self;
            /// The intersection of a source flags value with the complement of a target flags value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `difference` won't truncate `other`, but the `!` operator will.
            #[inline]
            fn sub(self, other: Self) -> Self { self.difference(other) }
        }
        impl ::bitflags::__private::core::ops::SubAssign for AllocKindFlags {
            /// The intersection of a source flags value with the complement of a target flags value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `difference` won't truncate `other`, but the `!` operator will.
            #[inline]
            fn sub_assign(&mut self, other: Self) { self.remove(other); }
        }
        impl ::bitflags::__private::core::ops::Not for AllocKindFlags {
            type Output = Self;
            /// The bitwise negation (`!`) of the bits in a flags value, truncating the result.
            #[inline]
            fn not(self) -> Self { self.complement() }
        }
        impl ::bitflags::__private::core::iter::Extend<AllocKindFlags> for
            AllocKindFlags {
            /// The bitwise or (`|`) of the bits in each flags value.
            fn extend<T: ::bitflags::__private::core::iter::IntoIterator<Item
                = Self>>(&mut self, iterator: T) {
                for item in iterator { self.insert(item) }
            }
        }
        impl ::bitflags::__private::core::iter::FromIterator<AllocKindFlags>
            for AllocKindFlags {
            /// The bitwise or (`|`) of the bits in each flags value.
            fn from_iter<T: ::bitflags::__private::core::iter::IntoIterator<Item
                = Self>>(iterator: T) -> Self {
                use ::bitflags::__private::core::iter::Extend;
                let mut result = Self::empty();
                result.extend(iterator);
                result
            }
        }
        impl AllocKindFlags {
            /// Yield a set of contained flags values.
            ///
            /// Each yielded flags value will correspond to a defined named flag. Any unknown bits
            /// will be yielded together as a final flags value.
            #[inline]
            pub const fn iter(&self)
                -> ::bitflags::iter::Iter<AllocKindFlags> {
                ::bitflags::iter::Iter::__private_const_new(<AllocKindFlags as
                        ::bitflags::Flags>::FLAGS,
                    AllocKindFlags::from_bits_retain(self.bits()),
                    AllocKindFlags::from_bits_retain(self.bits()))
            }
            /// Yield a set of contained named flags values.
            ///
            /// This method is like [`iter`](#method.iter), except only yields bits in contained named flags.
            /// Any unknown bits, or bits not corresponding to a contained flag will not be yielded.
            #[inline]
            pub const fn iter_names(&self)
                -> ::bitflags::iter::IterNames<AllocKindFlags> {
                ::bitflags::iter::IterNames::__private_const_new(<AllocKindFlags
                        as ::bitflags::Flags>::FLAGS,
                    AllocKindFlags::from_bits_retain(self.bits()),
                    AllocKindFlags::from_bits_retain(self.bits()))
            }
        }
        impl ::bitflags::__private::core::iter::IntoIterator for
            AllocKindFlags {
            type Item = AllocKindFlags;
            type IntoIter = ::bitflags::iter::Iter<AllocKindFlags>;
            fn into_iter(self) -> Self::IntoIter { self.iter() }
        }
    };bitflags! {
850    #[repr(transparent)]
851    #[derive(Default)]
852    pub(crate) struct AllocKindFlags : u64 {
853        const Unknown = 0;
854        const Alloc = 1;
855        const Realloc = 1 << 1;
856        const Free = 1 << 2;
857        const Uninitialized = 1 << 3;
858        const Zeroed = 1 << 4;
859        const Aligned = 1 << 5;
860    }
861}
862
863// These values **must** match with LLVMGEPNoWrapFlags
864#[repr(transparent)]
pub struct GEPNoWrapFlags(<GEPNoWrapFlags as
    ::bitflags::__private::PublicFlags>::Internal);
#[automatically_derived]
impl ::core::default::Default for GEPNoWrapFlags {
    #[inline]
    fn default() -> GEPNoWrapFlags {
        GEPNoWrapFlags(::core::default::Default::default())
    }
}
impl GEPNoWrapFlags {
    #[allow(deprecated, non_upper_case_globals,)]
    pub const InBounds: Self = Self::from_bits_retain(1 << 0);
    #[allow(deprecated, non_upper_case_globals,)]
    pub const NUSW: Self = Self::from_bits_retain(1 << 1);
    #[allow(deprecated, non_upper_case_globals,)]
    pub const NUW: Self = Self::from_bits_retain(1 << 2);
}
impl ::bitflags::Flags for GEPNoWrapFlags {
    const FLAGS: &'static [::bitflags::Flag<GEPNoWrapFlags>] =
        &[{

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("InBounds", GEPNoWrapFlags::InBounds)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("NUSW", GEPNoWrapFlags::NUSW)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("NUW", GEPNoWrapFlags::NUW)
                    }];
    type Bits = c_uint;
    fn bits(&self) -> c_uint { GEPNoWrapFlags::bits(self) }
    fn from_bits_retain(bits: c_uint) -> GEPNoWrapFlags {
        GEPNoWrapFlags::from_bits_retain(bits)
    }
}
#[allow(dead_code, deprecated, unused_doc_comments, unused_attributes,
unused_mut, unused_imports, non_upper_case_globals, clippy ::
assign_op_pattern, clippy :: indexing_slicing, clippy :: same_name_method,
clippy :: iter_without_into_iter,)]
const _: () =
    {
        #[repr(transparent)]
        pub struct InternalBitFlags(c_uint);
        #[automatically_derived]
        #[doc(hidden)]
        unsafe impl ::core::clone::TrivialClone for InternalBitFlags { }
        #[automatically_derived]
        impl ::core::clone::Clone for InternalBitFlags {
            #[inline]
            fn clone(&self) -> InternalBitFlags {
                let _: ::core::clone::AssertParamIsClone<c_uint>;
                *self
            }
        }
        #[automatically_derived]
        impl ::core::marker::Copy for InternalBitFlags { }
        #[automatically_derived]
        impl ::core::marker::StructuralPartialEq for InternalBitFlags { }
        #[automatically_derived]
        impl ::core::cmp::PartialEq for InternalBitFlags {
            #[inline]
            fn eq(&self, other: &InternalBitFlags) -> bool {
                self.0 == other.0
            }
        }
        #[automatically_derived]
        impl ::core::cmp::Eq for InternalBitFlags {
            #[inline]
            #[doc(hidden)]
            #[coverage(off)]
            fn assert_fields_are_eq(&self) {
                let _: ::core::cmp::AssertParamIsEq<c_uint>;
            }
        }
        #[automatically_derived]
        impl ::core::cmp::PartialOrd for InternalBitFlags {
            #[inline]
            fn partial_cmp(&self, other: &InternalBitFlags)
                -> ::core::option::Option<::core::cmp::Ordering> {
                ::core::option::Option::Some(::core::cmp::Ord::cmp(self,
                        other))
            }
        }
        #[automatically_derived]
        impl ::core::cmp::Ord for InternalBitFlags {
            #[inline]
            fn cmp(&self, other: &InternalBitFlags) -> ::core::cmp::Ordering {
                ::core::cmp::Ord::cmp(&self.0, &other.0)
            }
        }
        #[automatically_derived]
        impl ::core::hash::Hash for InternalBitFlags {
            #[inline]
            fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
                ::core::hash::Hash::hash(&self.0, state)
            }
        }
        impl ::bitflags::__private::PublicFlags for GEPNoWrapFlags {
            type Primitive = c_uint;
            type Internal = InternalBitFlags;
        }
        impl ::bitflags::__private::core::default::Default for
            InternalBitFlags {
            #[inline]
            fn default() -> Self { InternalBitFlags::empty() }
        }
        impl ::bitflags::__private::core::fmt::Debug for InternalBitFlags {
            fn fmt(&self,
                f: &mut ::bitflags::__private::core::fmt::Formatter<'_>)
                -> ::bitflags::__private::core::fmt::Result {
                if self.is_empty() {
                    f.write_fmt(format_args!("{0:#x}",
                            <c_uint as ::bitflags::Bits>::EMPTY))
                } else {
                    ::bitflags::__private::core::fmt::Display::fmt(self, f)
                }
            }
        }
        impl ::bitflags::__private::core::fmt::Display for InternalBitFlags {
            fn fmt(&self,
                f: &mut ::bitflags::__private::core::fmt::Formatter<'_>)
                -> ::bitflags::__private::core::fmt::Result {
                ::bitflags::parser::to_writer(&GEPNoWrapFlags(*self), f)
            }
        }
        impl ::bitflags::__private::core::str::FromStr for InternalBitFlags {
            type Err = ::bitflags::parser::ParseError;
            fn from_str(s: &str)
                ->
                    ::bitflags::__private::core::result::Result<Self,
                    Self::Err> {
                ::bitflags::parser::from_str::<GEPNoWrapFlags>(s).map(|flags|
                        flags.0)
            }
        }
        impl ::bitflags::__private::core::convert::AsRef<c_uint> for
            InternalBitFlags {
            fn as_ref(&self) -> &c_uint { &self.0 }
        }
        impl ::bitflags::__private::core::convert::From<c_uint> for
            InternalBitFlags {
            fn from(bits: c_uint) -> Self { Self::from_bits_retain(bits) }
        }
        #[allow(dead_code, deprecated, unused_attributes)]
        impl InternalBitFlags {
            /// Get a flags value with all bits unset.
            #[inline]
            pub const fn empty() -> Self {
                Self(<c_uint as ::bitflags::Bits>::EMPTY)
            }
            /// Get a flags value with all known bits set.
            #[inline]
            pub const fn all() -> Self {
                let mut truncated = <c_uint as ::bitflags::Bits>::EMPTY;
                let mut i = 0;
                {
                    {
                        let flag =
                            <GEPNoWrapFlags as
                                            ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <GEPNoWrapFlags as
                                            ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <GEPNoWrapFlags as
                                            ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                let _ = i;
                Self(truncated)
            }
            /// Get the underlying bits value.
            ///
            /// The returned value is exactly the bits set in this flags value.
            #[inline]
            pub const fn bits(&self) -> c_uint { self.0 }
            /// Convert from a bits value.
            ///
            /// This method will return `None` if any unknown bits are set.
            #[inline]
            pub const fn from_bits(bits: c_uint)
                -> ::bitflags::__private::core::option::Option<Self> {
                let truncated = Self::from_bits_truncate(bits).0;
                if truncated == bits {
                    ::bitflags::__private::core::option::Option::Some(Self(bits))
                } else { ::bitflags::__private::core::option::Option::None }
            }
            /// Convert from a bits value, unsetting any unknown bits.
            #[inline]
            pub const fn from_bits_truncate(bits: c_uint) -> Self {
                Self(bits & Self::all().0)
            }
            /// Convert from a bits value exactly.
            #[inline]
            pub const fn from_bits_retain(bits: c_uint) -> Self { Self(bits) }
            /// Get a flags value with the bits of a flag with the given name set.
            ///
            /// This method will return `None` if `name` is empty or doesn't
            /// correspond to any named flag.
            #[inline]
            pub fn from_name(name: &str)
                -> ::bitflags::__private::core::option::Option<Self> {
                {
                    if name == "InBounds" {
                        return ::bitflags::__private::core::option::Option::Some(Self(GEPNoWrapFlags::InBounds.bits()));
                    }
                };
                ;
                {
                    if name == "NUSW" {
                        return ::bitflags::__private::core::option::Option::Some(Self(GEPNoWrapFlags::NUSW.bits()));
                    }
                };
                ;
                {
                    if name == "NUW" {
                        return ::bitflags::__private::core::option::Option::Some(Self(GEPNoWrapFlags::NUW.bits()));
                    }
                };
                ;
                let _ = name;
                ::bitflags::__private::core::option::Option::None
            }
            /// Whether all bits in this flags value are unset.
            #[inline]
            pub const fn is_empty(&self) -> bool {
                self.0 == <c_uint as ::bitflags::Bits>::EMPTY
            }
            /// Whether all known bits in this flags value are set.
            #[inline]
            pub const fn is_all(&self) -> bool {
                Self::all().0 | self.0 == self.0
            }
            /// Whether any set bits in a source flags value are also set in a target flags value.
            #[inline]
            pub const fn intersects(&self, other: Self) -> bool {
                self.0 & other.0 != <c_uint as ::bitflags::Bits>::EMPTY
            }
            /// Whether all set bits in a source flags value are also set in a target flags value.
            #[inline]
            pub const fn contains(&self, other: Self) -> bool {
                self.0 & other.0 == other.0
            }
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            pub fn insert(&mut self, other: Self) {
                *self = Self(self.0).union(other);
            }
            /// The intersection of a source flags value with the complement of a target flags
            /// value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `remove` won't truncate `other`, but the `!` operator will.
            #[inline]
            pub fn remove(&mut self, other: Self) {
                *self = Self(self.0).difference(other);
            }
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            pub fn toggle(&mut self, other: Self) {
                *self = Self(self.0).symmetric_difference(other);
            }
            /// Call `insert` when `value` is `true` or `remove` when `value` is `false`.
            #[inline]
            pub fn set(&mut self, other: Self, value: bool) {
                if value { self.insert(other); } else { self.remove(other); }
            }
            /// The bitwise and (`&`) of the bits in two flags values.
            #[inline]
            #[must_use]
            pub const fn intersection(self, other: Self) -> Self {
                Self(self.0 & other.0)
            }
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            #[must_use]
            pub const fn union(self, other: Self) -> Self {
                Self(self.0 | other.0)
            }
            /// The intersection of a source flags value with the complement of a target flags
            /// value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `difference` won't truncate `other`, but the `!` operator will.
            #[inline]
            #[must_use]
            pub const fn difference(self, other: Self) -> Self {
                Self(self.0 & !other.0)
            }
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            #[must_use]
            pub const fn symmetric_difference(self, other: Self) -> Self {
                Self(self.0 ^ other.0)
            }
            /// The bitwise negation (`!`) of the bits in a flags value, truncating the result.
            #[inline]
            #[must_use]
            pub const fn complement(self) -> Self {
                Self::from_bits_truncate(!self.0)
            }
        }
        impl ::bitflags::__private::core::fmt::Binary for InternalBitFlags {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::Binary::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::fmt::Octal for InternalBitFlags {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::Octal::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::fmt::LowerHex for InternalBitFlags {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::LowerHex::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::fmt::UpperHex for InternalBitFlags {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::UpperHex::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::ops::BitOr for InternalBitFlags {
            type Output = Self;
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            fn bitor(self, other: InternalBitFlags) -> Self {
                self.union(other)
            }
        }
        impl ::bitflags::__private::core::ops::BitOrAssign for
            InternalBitFlags {
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            fn bitor_assign(&mut self, other: Self) { self.insert(other); }
        }
        impl ::bitflags::__private::core::ops::BitXor for InternalBitFlags {
            type Output = Self;
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            fn bitxor(self, other: Self) -> Self {
                self.symmetric_difference(other)
            }
        }
        impl ::bitflags::__private::core::ops::BitXorAssign for
            InternalBitFlags {
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            fn bitxor_assign(&mut self, other: Self) { self.toggle(other); }
        }
        impl ::bitflags::__private::core::ops::BitAnd for InternalBitFlags {
            type Output = Self;
            /// The bitwise and (`&`) of the bits in two flags values.
            #[inline]
            fn bitand(self, other: Self) -> Self { self.intersection(other) }
        }
        impl ::bitflags::__private::core::ops::BitAndAssign for
            InternalBitFlags {
            /// The bitwise and (`&`) of the bits in two flags values.
            #[inline]
            fn bitand_assign(&mut self, other: Self) {
                *self =
                    Self::from_bits_retain(self.bits()).intersection(other);
            }
        }
        impl ::bitflags::__private::core::ops::Sub for InternalBitFlags {
            type Output = Self;
            /// The intersection of a source flags value with the complement of a target flags value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `difference` won't truncate `other`, but the `!` operator will.
            #[inline]
            fn sub(self, other: Self) -> Self { self.difference(other) }
        }
        impl ::bitflags::__private::core::ops::SubAssign for InternalBitFlags
            {
            /// The intersection of a source flags value with the complement of a target flags value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `difference` won't truncate `other`, but the `!` operator will.
            #[inline]
            fn sub_assign(&mut self, other: Self) { self.remove(other); }
        }
        impl ::bitflags::__private::core::ops::Not for InternalBitFlags {
            type Output = Self;
            /// The bitwise negation (`!`) of the bits in a flags value, truncating the result.
            #[inline]
            fn not(self) -> Self { self.complement() }
        }
        impl ::bitflags::__private::core::iter::Extend<InternalBitFlags> for
            InternalBitFlags {
            /// The bitwise or (`|`) of the bits in each flags value.
            fn extend<T: ::bitflags::__private::core::iter::IntoIterator<Item
                = Self>>(&mut self, iterator: T) {
                for item in iterator { self.insert(item) }
            }
        }
        impl ::bitflags::__private::core::iter::FromIterator<InternalBitFlags>
            for InternalBitFlags {
            /// The bitwise or (`|`) of the bits in each flags value.
            fn from_iter<T: ::bitflags::__private::core::iter::IntoIterator<Item
                = Self>>(iterator: T) -> Self {
                use ::bitflags::__private::core::iter::Extend;
                let mut result = Self::empty();
                result.extend(iterator);
                result
            }
        }
        impl InternalBitFlags {
            /// Yield a set of contained flags values.
            ///
            /// Each yielded flags value will correspond to a defined named flag. Any unknown bits
            /// will be yielded together as a final flags value.
            #[inline]
            pub const fn iter(&self)
                -> ::bitflags::iter::Iter<GEPNoWrapFlags> {
                ::bitflags::iter::Iter::__private_const_new(<GEPNoWrapFlags as
                        ::bitflags::Flags>::FLAGS,
                    GEPNoWrapFlags::from_bits_retain(self.bits()),
                    GEPNoWrapFlags::from_bits_retain(self.bits()))
            }
            /// Yield a set of contained named flags values.
            ///
            /// This method is like [`iter`](#method.iter), except only yields bits in contained named flags.
            /// Any unknown bits, or bits not corresponding to a contained flag will not be yielded.
            #[inline]
            pub const fn iter_names(&self)
                -> ::bitflags::iter::IterNames<GEPNoWrapFlags> {
                ::bitflags::iter::IterNames::__private_const_new(<GEPNoWrapFlags
                        as ::bitflags::Flags>::FLAGS,
                    GEPNoWrapFlags::from_bits_retain(self.bits()),
                    GEPNoWrapFlags::from_bits_retain(self.bits()))
            }
        }
        impl ::bitflags::__private::core::iter::IntoIterator for
            InternalBitFlags {
            type Item = GEPNoWrapFlags;
            type IntoIter = ::bitflags::iter::Iter<GEPNoWrapFlags>;
            fn into_iter(self) -> Self::IntoIter { self.iter() }
        }
        impl InternalBitFlags {
            /// Returns a mutable reference to the raw value of the flags currently stored.
            #[inline]
            pub fn bits_mut(&mut self) -> &mut c_uint { &mut self.0 }
        }
        #[allow(dead_code, deprecated, unused_attributes)]
        impl GEPNoWrapFlags {
            /// Get a flags value with all bits unset.
            #[inline]
            pub const fn empty() -> Self { Self(InternalBitFlags::empty()) }
            /// Get a flags value with all known bits set.
            #[inline]
            pub const fn all() -> Self { Self(InternalBitFlags::all()) }
            /// Get the underlying bits value.
            ///
            /// The returned value is exactly the bits set in this flags value.
            #[inline]
            pub const fn bits(&self) -> c_uint { self.0.bits() }
            /// Convert from a bits value.
            ///
            /// This method will return `None` if any unknown bits are set.
            #[inline]
            pub const fn from_bits(bits: c_uint)
                -> ::bitflags::__private::core::option::Option<Self> {
                match InternalBitFlags::from_bits(bits) {
                    ::bitflags::__private::core::option::Option::Some(bits) =>
                        ::bitflags::__private::core::option::Option::Some(Self(bits)),
                    ::bitflags::__private::core::option::Option::None =>
                        ::bitflags::__private::core::option::Option::None,
                }
            }
            /// Convert from a bits value, unsetting any unknown bits.
            #[inline]
            pub const fn from_bits_truncate(bits: c_uint) -> Self {
                Self(InternalBitFlags::from_bits_truncate(bits))
            }
            /// Convert from a bits value exactly.
            #[inline]
            pub const fn from_bits_retain(bits: c_uint) -> Self {
                Self(InternalBitFlags::from_bits_retain(bits))
            }
            /// Get a flags value with the bits of a flag with the given name set.
            ///
            /// This method will return `None` if `name` is empty or doesn't
            /// correspond to any named flag.
            #[inline]
            pub fn from_name(name: &str)
                -> ::bitflags::__private::core::option::Option<Self> {
                match InternalBitFlags::from_name(name) {
                    ::bitflags::__private::core::option::Option::Some(bits) =>
                        ::bitflags::__private::core::option::Option::Some(Self(bits)),
                    ::bitflags::__private::core::option::Option::None =>
                        ::bitflags::__private::core::option::Option::None,
                }
            }
            /// Whether all bits in this flags value are unset.
            #[inline]
            pub const fn is_empty(&self) -> bool { self.0.is_empty() }
            /// Whether all known bits in this flags value are set.
            #[inline]
            pub const fn is_all(&self) -> bool { self.0.is_all() }
            /// Whether any set bits in a source flags value are also set in a target flags value.
            #[inline]
            pub const fn intersects(&self, other: Self) -> bool {
                self.0.intersects(other.0)
            }
            /// Whether all set bits in a source flags value are also set in a target flags value.
            #[inline]
            pub const fn contains(&self, other: Self) -> bool {
                self.0.contains(other.0)
            }
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            pub fn insert(&mut self, other: Self) { self.0.insert(other.0) }
            /// The intersection of a source flags value with the complement of a target flags
            /// value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `remove` won't truncate `other`, but the `!` operator will.
            #[inline]
            pub fn remove(&mut self, other: Self) { self.0.remove(other.0) }
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            pub fn toggle(&mut self, other: Self) { self.0.toggle(other.0) }
            /// Call `insert` when `value` is `true` or `remove` when `value` is `false`.
            #[inline]
            pub fn set(&mut self, other: Self, value: bool) {
                self.0.set(other.0, value)
            }
            /// The bitwise and (`&`) of the bits in two flags values.
            #[inline]
            #[must_use]
            pub const fn intersection(self, other: Self) -> Self {
                Self(self.0.intersection(other.0))
            }
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            #[must_use]
            pub const fn union(self, other: Self) -> Self {
                Self(self.0.union(other.0))
            }
            /// The intersection of a source flags value with the complement of a target flags
            /// value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `difference` won't truncate `other`, but the `!` operator will.
            #[inline]
            #[must_use]
            pub const fn difference(self, other: Self) -> Self {
                Self(self.0.difference(other.0))
            }
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            #[must_use]
            pub const fn symmetric_difference(self, other: Self) -> Self {
                Self(self.0.symmetric_difference(other.0))
            }
            /// The bitwise negation (`!`) of the bits in a flags value, truncating the result.
            #[inline]
            #[must_use]
            pub const fn complement(self) -> Self {
                Self(self.0.complement())
            }
        }
        impl ::bitflags::__private::core::fmt::Binary for GEPNoWrapFlags {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::Binary::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::fmt::Octal for GEPNoWrapFlags {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::Octal::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::fmt::LowerHex for GEPNoWrapFlags {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::LowerHex::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::fmt::UpperHex for GEPNoWrapFlags {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::UpperHex::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::ops::BitOr for GEPNoWrapFlags {
            type Output = Self;
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            fn bitor(self, other: GEPNoWrapFlags) -> Self {
                self.union(other)
            }
        }
        impl ::bitflags::__private::core::ops::BitOrAssign for GEPNoWrapFlags
            {
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            fn bitor_assign(&mut self, other: Self) { self.insert(other); }
        }
        impl ::bitflags::__private::core::ops::BitXor for GEPNoWrapFlags {
            type Output = Self;
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            fn bitxor(self, other: Self) -> Self {
                self.symmetric_difference(other)
            }
        }
        impl ::bitflags::__private::core::ops::BitXorAssign for GEPNoWrapFlags
            {
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            fn bitxor_assign(&mut self, other: Self) { self.toggle(other); }
        }
        impl ::bitflags::__private::core::ops::BitAnd for GEPNoWrapFlags {
            type Output = Self;
            /// The bitwise and (`&`) of the bits in two flags values.
            #[inline]
            fn bitand(self, other: Self) -> Self { self.intersection(other) }
        }
        impl ::bitflags::__private::core::ops::BitAndAssign for GEPNoWrapFlags
            {
            /// The bitwise and (`&`) of the bits in two flags values.
            #[inline]
            fn bitand_assign(&mut self, other: Self) {
                *self =
                    Self::from_bits_retain(self.bits()).intersection(other);
            }
        }
        impl ::bitflags::__private::core::ops::Sub for GEPNoWrapFlags {
            type Output = Self;
            /// The intersection of a source flags value with the complement of a target flags value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `difference` won't truncate `other`, but the `!` operator will.
            #[inline]
            fn sub(self, other: Self) -> Self { self.difference(other) }
        }
        impl ::bitflags::__private::core::ops::SubAssign for GEPNoWrapFlags {
            /// The intersection of a source flags value with the complement of a target flags value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `difference` won't truncate `other`, but the `!` operator will.
            #[inline]
            fn sub_assign(&mut self, other: Self) { self.remove(other); }
        }
        impl ::bitflags::__private::core::ops::Not for GEPNoWrapFlags {
            type Output = Self;
            /// The bitwise negation (`!`) of the bits in a flags value, truncating the result.
            #[inline]
            fn not(self) -> Self { self.complement() }
        }
        impl ::bitflags::__private::core::iter::Extend<GEPNoWrapFlags> for
            GEPNoWrapFlags {
            /// The bitwise or (`|`) of the bits in each flags value.
            fn extend<T: ::bitflags::__private::core::iter::IntoIterator<Item
                = Self>>(&mut self, iterator: T) {
                for item in iterator { self.insert(item) }
            }
        }
        impl ::bitflags::__private::core::iter::FromIterator<GEPNoWrapFlags>
            for GEPNoWrapFlags {
            /// The bitwise or (`|`) of the bits in each flags value.
            fn from_iter<T: ::bitflags::__private::core::iter::IntoIterator<Item
                = Self>>(iterator: T) -> Self {
                use ::bitflags::__private::core::iter::Extend;
                let mut result = Self::empty();
                result.extend(iterator);
                result
            }
        }
        impl GEPNoWrapFlags {
            /// Yield a set of contained flags values.
            ///
            /// Each yielded flags value will correspond to a defined named flag. Any unknown bits
            /// will be yielded together as a final flags value.
            #[inline]
            pub const fn iter(&self)
                -> ::bitflags::iter::Iter<GEPNoWrapFlags> {
                ::bitflags::iter::Iter::__private_const_new(<GEPNoWrapFlags as
                        ::bitflags::Flags>::FLAGS,
                    GEPNoWrapFlags::from_bits_retain(self.bits()),
                    GEPNoWrapFlags::from_bits_retain(self.bits()))
            }
            /// Yield a set of contained named flags values.
            ///
            /// This method is like [`iter`](#method.iter), except only yields bits in contained named flags.
            /// Any unknown bits, or bits not corresponding to a contained flag will not be yielded.
            #[inline]
            pub const fn iter_names(&self)
                -> ::bitflags::iter::IterNames<GEPNoWrapFlags> {
                ::bitflags::iter::IterNames::__private_const_new(<GEPNoWrapFlags
                        as ::bitflags::Flags>::FLAGS,
                    GEPNoWrapFlags::from_bits_retain(self.bits()),
                    GEPNoWrapFlags::from_bits_retain(self.bits()))
            }
        }
        impl ::bitflags::__private::core::iter::IntoIterator for
            GEPNoWrapFlags {
            type Item = GEPNoWrapFlags;
            type IntoIter = ::bitflags::iter::Iter<GEPNoWrapFlags>;
            fn into_iter(self) -> Self::IntoIter { self.iter() }
        }
    };bitflags! {
865    #[repr(transparent)]
866    #[derive(Default)]
867    pub struct GEPNoWrapFlags : c_uint {
868        const InBounds = 1 << 0;
869        const NUSW = 1 << 1;
870        const NUW = 1 << 2;
871    }
872}
873
874unsafe extern "C" {
875    pub(crate) type Buffer;
876}
877
878pub(crate) type SelfProfileBeforePassCallback =
879    unsafe extern "C" fn(*mut c_void, *const c_char, *const c_char);
880pub(crate) type SelfProfileAfterPassCallback = unsafe extern "C" fn(*mut c_void);
881
882pub(crate) type GetSymbolsCallback =
883    unsafe extern "C" fn(*mut c_void, *const c_char) -> *mut c_void;
884pub(crate) type GetSymbolsErrorCallback = unsafe extern "C" fn(*const c_char) -> *mut c_void;
885
886unsafe extern "C" {
887    // Create and destroy contexts.
888    pub(crate) fn LLVMContextCreate() -> &'static mut Context;
889    pub(crate) fn LLVMContextDispose(C: &'static mut Context);
890    pub(crate) fn LLVMContextSetDiscardValueNames(C: &Context, Discard: Bool);
891    pub(crate) fn LLVMGetMDKindIDInContext(
892        C: &Context,
893        Name: *const c_char,
894        SLen: c_uint,
895    ) -> MetadataKindId;
896
897    pub(crate) fn LLVMDisposeTargetMachine(T: ptr::NonNull<TargetMachine>);
898
899    // Create modules.
900    pub(crate) fn LLVMModuleCreateWithNameInContext(
901        ModuleID: *const c_char,
902        C: &Context,
903    ) -> &Module;
904    pub(crate) safe fn LLVMCloneModule(M: &Module) -> &Module;
905
906    /// Data layout. See Module::getDataLayout.
907    pub(crate) fn LLVMGetDataLayoutStr(M: &Module) -> *const c_char;
908    pub(crate) fn LLVMSetDataLayout(M: &Module, Triple: *const c_char);
909
910    /// Append inline assembly to a module. See `Module::appendModuleInlineAsm`.
911    pub(crate) fn LLVMAppendModuleInlineAsm(
912        M: &Module,
913        Asm: *const c_uchar, // See "PTR_LEN_STR".
914        Len: size_t,
915    );
916
917    /// Create the specified uniqued inline asm string. See `InlineAsm::get()`.
918    pub(crate) fn LLVMGetInlineAsm<'ll>(
919        Ty: &'ll Type,
920        AsmString: *const c_uchar, // See "PTR_LEN_STR".
921        AsmStringSize: size_t,
922        Constraints: *const c_uchar, // See "PTR_LEN_STR".
923        ConstraintsSize: size_t,
924        HasSideEffects: llvm::Bool,
925        IsAlignStack: llvm::Bool,
926        Dialect: AsmDialect,
927        CanThrow: llvm::Bool,
928    ) -> &'ll Value;
929
930    pub(crate) safe fn LLVMGetTypeKind(Ty: &Type) -> RawEnum<TypeKind>;
931
932    // Operations on integer types
933    pub(crate) fn LLVMInt1TypeInContext(C: &Context) -> &Type;
934    pub(crate) fn LLVMInt8TypeInContext(C: &Context) -> &Type;
935    pub(crate) fn LLVMInt16TypeInContext(C: &Context) -> &Type;
936    pub(crate) fn LLVMInt32TypeInContext(C: &Context) -> &Type;
937    pub(crate) fn LLVMInt64TypeInContext(C: &Context) -> &Type;
938    pub(crate) safe fn LLVMIntTypeInContext(C: &Context, NumBits: c_uint) -> &Type;
939
940    pub(crate) fn LLVMGetIntTypeWidth(IntegerTy: &Type) -> c_uint;
941
942    // Operations on real types
943    pub(crate) fn LLVMHalfTypeInContext(C: &Context) -> &Type;
944    pub(crate) fn LLVMFloatTypeInContext(C: &Context) -> &Type;
945    pub(crate) fn LLVMDoubleTypeInContext(C: &Context) -> &Type;
946    pub(crate) fn LLVMFP128TypeInContext(C: &Context) -> &Type;
947
948    // Operations on non-IEEE real types
949    pub(crate) fn LLVMBFloatTypeInContext(C: &Context) -> &Type;
950
951    // Operations on function types
952    pub(crate) fn LLVMFunctionType<'a>(
953        ReturnType: &'a Type,
954        ParamTypes: *const &'a Type,
955        ParamCount: c_uint,
956        IsVarArg: Bool,
957    ) -> &'a Type;
958    pub(crate) fn LLVMCountParamTypes(FunctionTy: &Type) -> c_uint;
959    pub(crate) fn LLVMGetParamTypes<'a>(FunctionTy: &'a Type, Dest: *mut &'a Type);
960    pub(crate) fn LLVMGetReturnType(FunctionTy: &Type) -> &Type;
961    pub(crate) fn LLVMIsFunctionVarArg(FunctionTy: &Type) -> Bool;
962
963    // Operations on struct types
964    pub(crate) fn LLVMStructTypeInContext<'a>(
965        C: &'a Context,
966        ElementTypes: *const &'a Type,
967        ElementCount: c_uint,
968        Packed: Bool,
969    ) -> &'a Type;
970
971    // Operations on array, pointer, and vector types (sequence types)
972    pub(crate) safe fn LLVMPointerTypeInContext(C: &Context, AddressSpace: c_uint) -> &Type;
973    pub(crate) fn LLVMVectorType(ElementType: &Type, ElementCount: c_uint) -> &Type;
974    pub(crate) fn LLVMScalableVectorType(ElementType: &Type, ElementCount: c_uint) -> &Type;
975
976    pub(crate) fn LLVMGetElementType(Ty: &Type) -> &Type;
977    pub(crate) fn LLVMGetVectorSize(VectorTy: &Type) -> c_uint;
978
979    // Operations on other types
980    pub(crate) fn LLVMVoidTypeInContext(C: &Context) -> &Type;
981
982    // Operations on all values
983    pub(crate) fn LLVMTypeOf(Val: &Value) -> &Type;
984    pub(crate) fn LLVMGetValueName2(Val: &Value, Length: *mut size_t) -> *const c_char;
985    pub(crate) fn LLVMSetValueName2(Val: &Value, Name: *const c_char, NameLen: size_t);
986    pub(crate) fn LLVMReplaceAllUsesWith<'a>(OldVal: &'a Value, NewVal: &'a Value);
987    pub(crate) safe fn LLVMGetMetadata<'a>(
988        Val: &'a Value,
989        KindID: MetadataKindId,
990    ) -> Option<&'a Value>;
991    pub(crate) safe fn LLVMSetMetadata<'a>(Val: &'a Value, KindID: MetadataKindId, Node: &'a Value);
992    pub(crate) fn LLVMGlobalSetMetadata<'a>(
993        Val: &'a Value,
994        KindID: MetadataKindId,
995        Metadata: &'a Metadata,
996    );
997    pub(crate) safe fn LLVMValueAsMetadata(Node: &Value) -> &Metadata;
998
999    // Operations on constants of any type
1000    pub(crate) fn LLVMConstNull(Ty: &Type) -> &Value;
1001    pub(crate) fn LLVMGetUndef(Ty: &Type) -> &Value;
1002    pub(crate) fn LLVMGetPoison(Ty: &Type) -> &Value;
1003
1004    // Operations on metadata
1005    pub(crate) fn LLVMMDStringInContext2(
1006        C: &Context,
1007        Str: *const c_char,
1008        SLen: size_t,
1009    ) -> &Metadata;
1010    pub(crate) fn LLVMMDNodeInContext2<'a>(
1011        C: &'a Context,
1012        Vals: *const &'a Metadata,
1013        Count: size_t,
1014    ) -> &'a Metadata;
1015    pub(crate) fn LLVMAddNamedMetadataOperand<'a>(
1016        M: &'a Module,
1017        Name: *const c_char,
1018        Val: &'a Value,
1019    );
1020    pub(crate) fn LLVMReplaceMDNodeOperandWith(Val: &Value, index: u32, replacement: &Metadata);
1021
1022    // Operations on scalar constants
1023    pub(crate) fn LLVMConstInt(IntTy: &Type, N: c_ulonglong, SignExtend: Bool) -> &Value;
1024    pub(crate) fn LLVMConstIntOfArbitraryPrecision(
1025        IntTy: &Type,
1026        Wn: c_uint,
1027        Ws: *const u64,
1028    ) -> &Value;
1029    pub(crate) fn LLVMConstReal(RealTy: &Type, N: f64) -> &Value;
1030
1031    // Operations on composite constants
1032    pub(crate) fn LLVMConstArray2<'a>(
1033        ElementTy: &'a Type,
1034        ConstantVals: *const &'a Value,
1035        Length: u64,
1036    ) -> &'a Value;
1037    pub(crate) fn LLVMArrayType2(ElementType: &Type, ElementCount: u64) -> &Type;
1038    pub(crate) fn LLVMConstStringInContext2(
1039        C: &Context,
1040        Str: *const c_char,
1041        Length: size_t,
1042        DontNullTerminate: Bool,
1043    ) -> &Value;
1044    pub(crate) fn LLVMConstStructInContext<'a>(
1045        C: &'a Context,
1046        ConstantVals: *const &'a Value,
1047        Count: c_uint,
1048        Packed: Bool,
1049    ) -> &'a Value;
1050    pub(crate) fn LLVMConstNamedStruct<'a>(
1051        StructTy: &'a Type,
1052        ConstantVals: *const &'a Value,
1053        Count: c_uint,
1054    ) -> &'a Value;
1055    pub(crate) fn LLVMConstVector(ScalarConstantVals: *const &Value, Size: c_uint) -> &Value;
1056
1057    // Constant expressions
1058    pub(crate) fn LLVMConstInBoundsGEP2<'a>(
1059        ty: &'a Type,
1060        ConstantVal: &'a Value,
1061        ConstantIndices: *const &'a Value,
1062        NumIndices: c_uint,
1063    ) -> &'a Value;
1064    pub(crate) fn LLVMConstPtrToInt<'a>(ConstantVal: &'a Value, ToType: &'a Type) -> &'a Value;
1065    pub(crate) fn LLVMConstIntToPtr<'a>(ConstantVal: &'a Value, ToType: &'a Type) -> &'a Value;
1066    pub(crate) fn LLVMConstBitCast<'a>(ConstantVal: &'a Value, ToType: &'a Type) -> &'a Value;
1067    pub(crate) fn LLVMConstPointerCast<'a>(ConstantVal: &'a Value, ToType: &'a Type) -> &'a Value;
1068    pub(crate) fn LLVMGetAggregateElement(ConstantVal: &Value, Idx: c_uint) -> Option<&Value>;
1069    pub(crate) fn LLVMGetConstOpcode(ConstantVal: &Value) -> Opcode;
1070    pub(crate) fn LLVMIsAConstantExpr(Val: &Value) -> Option<&Value>;
1071
1072    // Operations on global variables, functions, and aliases (globals)
1073    pub(crate) fn LLVMIsDeclaration(Global: &Value) -> Bool;
1074    pub(crate) fn LLVMGetLinkage(Global: &Value) -> RawEnum<Linkage>;
1075    pub(crate) fn LLVMSetLinkage(Global: &Value, RustLinkage: Linkage);
1076    pub(crate) fn LLVMSetSection(Global: &Value, Section: *const c_char);
1077    pub(crate) fn LLVMGetVisibility(Global: &Value) -> RawEnum<Visibility>;
1078    pub(crate) fn LLVMSetVisibility(Global: &Value, Viz: Visibility);
1079    pub(crate) fn LLVMGetAlignment(Global: &Value) -> c_uint;
1080    pub(crate) fn LLVMSetAlignment(Global: &Value, Bytes: c_uint);
1081    pub(crate) fn LLVMSetDLLStorageClass(V: &Value, C: DLLStorageClass);
1082    pub(crate) fn LLVMGlobalGetValueType(Global: &Value) -> &Type;
1083
1084    // Operations on global variables
1085    pub(crate) safe fn LLVMIsAGlobalVariable(GlobalVar: &Value) -> Option<&Value>;
1086    pub(crate) fn LLVMAddGlobal<'a>(M: &'a Module, Ty: &'a Type, Name: *const c_char) -> &'a Value;
1087    pub(crate) fn LLVMGetNamedGlobal(M: &Module, Name: *const c_char) -> Option<&Value>;
1088    pub(crate) fn LLVMGetFirstGlobal(M: &Module) -> Option<&Value>;
1089    pub(crate) fn LLVMGetNextGlobal(GlobalVar: &Value) -> Option<&Value>;
1090    pub(crate) fn LLVMDeleteGlobal(GlobalVar: &Value);
1091    pub(crate) safe fn LLVMGetInitializer(GlobalVar: &Value) -> Option<&Value>;
1092    pub(crate) fn LLVMSetInitializer<'a>(GlobalVar: &'a Value, ConstantVal: &'a Value);
1093    pub(crate) safe fn LLVMIsThreadLocal(GlobalVar: &Value) -> Bool;
1094    pub(crate) fn LLVMSetThreadLocalMode(GlobalVar: &Value, Mode: ThreadLocalMode);
1095    pub(crate) safe fn LLVMIsGlobalConstant(GlobalVar: &Value) -> Bool;
1096    pub(crate) safe fn LLVMSetGlobalConstant(GlobalVar: &Value, IsConstant: Bool);
1097    pub(crate) safe fn LLVMSetTailCall(CallInst: &Value, IsTailCall: Bool);
1098    pub(crate) safe fn LLVMSetTailCallKind(CallInst: &Value, kind: TailCallKind);
1099    pub(crate) safe fn LLVMSetExternallyInitialized(GlobalVar: &Value, IsExtInit: Bool);
1100
1101    // Operations on global aliases
1102    pub(crate) fn LLVMAddAlias2<'ll>(
1103        M: &'ll Module,
1104        ValueTy: &Type,
1105        AddressSpace: c_uint,
1106        Aliasee: &Value,
1107        Name: *const c_char,
1108    ) -> &'ll Value;
1109    pub(crate) fn LLVMGetFirstGlobalAlias(M: &Module) -> Option<&Value>;
1110    pub(crate) fn LLVMGetNextGlobalAlias(GlobalAlias: &Value) -> Option<&Value>;
1111
1112    // Operations on attributes
1113    pub(crate) fn LLVMCreateStringAttribute(
1114        C: &Context,
1115        Name: *const c_char,
1116        NameLen: c_uint,
1117        Value: *const c_char,
1118        ValueLen: c_uint,
1119    ) -> &Attribute;
1120
1121    // Operations on functions
1122    pub(crate) fn LLVMSetFunctionCallConv(Fn: &Value, CC: c_uint);
1123    pub(crate) fn LLVMAddFunction<'a>(
1124        Mod: &'a Module,
1125        Name: *const c_char,
1126        FunctionTy: &'a Type,
1127    ) -> &'a Value;
1128    pub(crate) fn LLVMDeleteFunction(Fn: &Value);
1129
1130    // Operations about llvm intrinsics
1131    pub(crate) fn LLVMLookupIntrinsicID(Name: *const c_char, NameLen: size_t) -> c_uint;
1132    pub(crate) fn LLVMIntrinsicIsOverloaded(ID: NonZero<c_uint>) -> Bool;
1133    pub(crate) fn LLVMGetIntrinsicDeclaration<'a>(
1134        Mod: &'a Module,
1135        ID: NonZero<c_uint>,
1136        ParamTypes: *const &'a Type,
1137        ParamCount: size_t,
1138    ) -> &'a Value;
1139    pub(crate) fn LLVMRustUpgradeIntrinsicFunction<'a>(
1140        Fn: &'a Value,
1141        NewFn: &mut Option<&'a Value>,
1142    ) -> bool;
1143    pub(crate) fn LLVMRustIsTargetIntrinsic(ID: NonZero<c_uint>) -> bool;
1144
1145    // Operations on parameters
1146    pub(crate) fn LLVMIsAArgument(Val: &Value) -> Option<&Value>;
1147    pub(crate) safe fn LLVMCountParams(Fn: &Value) -> c_uint;
1148    pub(crate) fn LLVMGetParam(Fn: &Value, Index: c_uint) -> &Value;
1149
1150    // Operations on basic blocks
1151    pub(crate) fn LLVMGetBasicBlockParent(BB: &BasicBlock) -> &Value;
1152    pub(crate) fn LLVMAppendBasicBlockInContext<'a>(
1153        C: &'a Context,
1154        Fn: &'a Value,
1155        Name: *const c_char,
1156    ) -> &'a BasicBlock;
1157
1158    // Operations on instructions
1159    pub(crate) fn LLVMIsAInstruction(Val: &Value) -> Option<&Value>;
1160    pub(crate) fn LLVMGetFirstBasicBlock(Fn: &Value) -> &BasicBlock;
1161    pub(crate) fn LLVMGetOperand(Val: &Value, Index: c_uint) -> Option<&Value>;
1162
1163    // Operations on call sites
1164    pub(crate) fn LLVMSetInstructionCallConv(Instr: &Value, CC: c_uint);
1165
1166    // Operations on load/store instructions (only)
1167    pub(crate) fn LLVMSetVolatile(MemoryAccessInst: &Value, volatile: Bool);
1168    pub(crate) fn LLVMSetOrdering(MemoryAccessInst: &Value, Ordering: AtomicOrdering);
1169
1170    // Operations on phi nodes
1171    pub(crate) fn LLVMAddIncoming<'a>(
1172        PhiNode: &'a Value,
1173        IncomingValues: *const &'a Value,
1174        IncomingBlocks: *const &'a BasicBlock,
1175        Count: c_uint,
1176    );
1177
1178    // Instruction builders
1179    pub(crate) fn LLVMCreateBuilderInContext(C: &Context) -> &mut Builder<'_>;
1180    pub(crate) fn LLVMPositionBuilderAtEnd<'a>(Builder: &Builder<'a>, Block: &'a BasicBlock);
1181    pub(crate) fn LLVMGetInsertBlock<'a>(Builder: &Builder<'a>) -> &'a BasicBlock;
1182    pub(crate) fn LLVMDisposeBuilder<'a>(Builder: &'a mut Builder<'a>);
1183
1184    // Metadata
1185    pub(crate) fn LLVMSetCurrentDebugLocation2<'a>(Builder: &Builder<'a>, Loc: *const Metadata);
1186    pub(crate) fn LLVMGetCurrentDebugLocation2<'a>(Builder: &Builder<'a>) -> Option<&'a Metadata>;
1187
1188    // Terminators
1189    pub(crate) safe fn LLVMBuildRetVoid<'a>(B: &Builder<'a>) -> &'a Value;
1190    pub(crate) fn LLVMBuildRet<'a>(B: &Builder<'a>, V: &'a Value) -> &'a Value;
1191    pub(crate) fn LLVMBuildBr<'a>(B: &Builder<'a>, Dest: &'a BasicBlock) -> &'a Value;
1192    pub(crate) fn LLVMBuildCondBr<'a>(
1193        B: &Builder<'a>,
1194        If: &'a Value,
1195        Then: &'a BasicBlock,
1196        Else: &'a BasicBlock,
1197    ) -> &'a Value;
1198    pub(crate) fn LLVMBuildSwitch<'a>(
1199        B: &Builder<'a>,
1200        V: &'a Value,
1201        Else: &'a BasicBlock,
1202        NumCases: c_uint,
1203    ) -> &'a Value;
1204    pub(crate) fn LLVMBuildLandingPad<'a>(
1205        B: &Builder<'a>,
1206        Ty: &'a Type,
1207        PersFn: Option<&'a Value>,
1208        NumClauses: c_uint,
1209        Name: *const c_char,
1210    ) -> &'a Value;
1211    pub(crate) fn LLVMBuildResume<'a>(B: &Builder<'a>, Exn: &'a Value) -> &'a Value;
1212    pub(crate) fn LLVMBuildUnreachable<'a>(B: &Builder<'a>) -> &'a Value;
1213
1214    pub(crate) fn LLVMBuildCleanupPad<'a>(
1215        B: &Builder<'a>,
1216        ParentPad: Option<&'a Value>,
1217        Args: *const &'a Value,
1218        NumArgs: c_uint,
1219        Name: *const c_char,
1220    ) -> Option<&'a Value>;
1221    pub(crate) fn LLVMBuildCleanupRet<'a>(
1222        B: &Builder<'a>,
1223        CleanupPad: &'a Value,
1224        BB: Option<&'a BasicBlock>,
1225    ) -> Option<&'a Value>;
1226    pub(crate) fn LLVMBuildCatchPad<'a>(
1227        B: &Builder<'a>,
1228        ParentPad: &'a Value,
1229        Args: *const &'a Value,
1230        NumArgs: c_uint,
1231        Name: *const c_char,
1232    ) -> Option<&'a Value>;
1233    pub(crate) fn LLVMBuildCatchRet<'a>(
1234        B: &Builder<'a>,
1235        CatchPad: &'a Value,
1236        BB: &'a BasicBlock,
1237    ) -> Option<&'a Value>;
1238    pub(crate) fn LLVMBuildCatchSwitch<'a>(
1239        Builder: &Builder<'a>,
1240        ParentPad: Option<&'a Value>,
1241        UnwindBB: Option<&'a BasicBlock>,
1242        NumHandlers: c_uint,
1243        Name: *const c_char,
1244    ) -> Option<&'a Value>;
1245    pub(crate) fn LLVMAddHandler<'a>(CatchSwitch: &'a Value, Dest: &'a BasicBlock);
1246    pub(crate) fn LLVMSetPersonalityFn<'a>(Func: &'a Value, Pers: &'a Value);
1247
1248    // Add a case to the switch instruction
1249    pub(crate) fn LLVMAddCase<'a>(Switch: &'a Value, OnVal: &'a Value, Dest: &'a BasicBlock);
1250
1251    // Add a clause to the landing pad instruction
1252    pub(crate) fn LLVMAddClause<'a>(LandingPad: &'a Value, ClauseVal: &'a Value);
1253
1254    // Set the cleanup on a landing pad instruction
1255    pub(crate) fn LLVMSetCleanup(LandingPad: &Value, Val: Bool);
1256
1257    // Arithmetic
1258    pub(crate) fn LLVMBuildAdd<'a>(
1259        B: &Builder<'a>,
1260        LHS: &'a Value,
1261        RHS: &'a Value,
1262        Name: *const c_char,
1263    ) -> &'a Value;
1264    pub(crate) fn LLVMBuildFAdd<'a>(
1265        B: &Builder<'a>,
1266        LHS: &'a Value,
1267        RHS: &'a Value,
1268        Name: *const c_char,
1269    ) -> &'a Value;
1270    pub(crate) fn LLVMBuildSub<'a>(
1271        B: &Builder<'a>,
1272        LHS: &'a Value,
1273        RHS: &'a Value,
1274        Name: *const c_char,
1275    ) -> &'a Value;
1276    pub(crate) fn LLVMBuildFSub<'a>(
1277        B: &Builder<'a>,
1278        LHS: &'a Value,
1279        RHS: &'a Value,
1280        Name: *const c_char,
1281    ) -> &'a Value;
1282    pub(crate) fn LLVMBuildMul<'a>(
1283        B: &Builder<'a>,
1284        LHS: &'a Value,
1285        RHS: &'a Value,
1286        Name: *const c_char,
1287    ) -> &'a Value;
1288    pub(crate) fn LLVMBuildFMul<'a>(
1289        B: &Builder<'a>,
1290        LHS: &'a Value,
1291        RHS: &'a Value,
1292        Name: *const c_char,
1293    ) -> &'a Value;
1294    pub(crate) fn LLVMBuildUDiv<'a>(
1295        B: &Builder<'a>,
1296        LHS: &'a Value,
1297        RHS: &'a Value,
1298        Name: *const c_char,
1299    ) -> &'a Value;
1300    pub(crate) fn LLVMBuildExactUDiv<'a>(
1301        B: &Builder<'a>,
1302        LHS: &'a Value,
1303        RHS: &'a Value,
1304        Name: *const c_char,
1305    ) -> &'a Value;
1306    pub(crate) fn LLVMBuildSDiv<'a>(
1307        B: &Builder<'a>,
1308        LHS: &'a Value,
1309        RHS: &'a Value,
1310        Name: *const c_char,
1311    ) -> &'a Value;
1312    pub(crate) fn LLVMBuildExactSDiv<'a>(
1313        B: &Builder<'a>,
1314        LHS: &'a Value,
1315        RHS: &'a Value,
1316        Name: *const c_char,
1317    ) -> &'a Value;
1318    pub(crate) fn LLVMBuildFDiv<'a>(
1319        B: &Builder<'a>,
1320        LHS: &'a Value,
1321        RHS: &'a Value,
1322        Name: *const c_char,
1323    ) -> &'a Value;
1324    pub(crate) fn LLVMBuildURem<'a>(
1325        B: &Builder<'a>,
1326        LHS: &'a Value,
1327        RHS: &'a Value,
1328        Name: *const c_char,
1329    ) -> &'a Value;
1330    pub(crate) fn LLVMBuildSRem<'a>(
1331        B: &Builder<'a>,
1332        LHS: &'a Value,
1333        RHS: &'a Value,
1334        Name: *const c_char,
1335    ) -> &'a Value;
1336    pub(crate) fn LLVMBuildFRem<'a>(
1337        B: &Builder<'a>,
1338        LHS: &'a Value,
1339        RHS: &'a Value,
1340        Name: *const c_char,
1341    ) -> &'a Value;
1342    pub(crate) fn LLVMBuildShl<'a>(
1343        B: &Builder<'a>,
1344        LHS: &'a Value,
1345        RHS: &'a Value,
1346        Name: *const c_char,
1347    ) -> &'a Value;
1348    pub(crate) fn LLVMBuildLShr<'a>(
1349        B: &Builder<'a>,
1350        LHS: &'a Value,
1351        RHS: &'a Value,
1352        Name: *const c_char,
1353    ) -> &'a Value;
1354    pub(crate) fn LLVMBuildAShr<'a>(
1355        B: &Builder<'a>,
1356        LHS: &'a Value,
1357        RHS: &'a Value,
1358        Name: *const c_char,
1359    ) -> &'a Value;
1360    pub(crate) fn LLVMBuildNSWAdd<'a>(
1361        B: &Builder<'a>,
1362        LHS: &'a Value,
1363        RHS: &'a Value,
1364        Name: *const c_char,
1365    ) -> &'a Value;
1366    pub(crate) fn LLVMBuildNUWAdd<'a>(
1367        B: &Builder<'a>,
1368        LHS: &'a Value,
1369        RHS: &'a Value,
1370        Name: *const c_char,
1371    ) -> &'a Value;
1372    pub(crate) fn LLVMBuildNSWSub<'a>(
1373        B: &Builder<'a>,
1374        LHS: &'a Value,
1375        RHS: &'a Value,
1376        Name: *const c_char,
1377    ) -> &'a Value;
1378    pub(crate) fn LLVMBuildNUWSub<'a>(
1379        B: &Builder<'a>,
1380        LHS: &'a Value,
1381        RHS: &'a Value,
1382        Name: *const c_char,
1383    ) -> &'a Value;
1384    pub(crate) fn LLVMBuildNSWMul<'a>(
1385        B: &Builder<'a>,
1386        LHS: &'a Value,
1387        RHS: &'a Value,
1388        Name: *const c_char,
1389    ) -> &'a Value;
1390    pub(crate) fn LLVMBuildNUWMul<'a>(
1391        B: &Builder<'a>,
1392        LHS: &'a Value,
1393        RHS: &'a Value,
1394        Name: *const c_char,
1395    ) -> &'a Value;
1396    pub(crate) fn LLVMBuildAnd<'a>(
1397        B: &Builder<'a>,
1398        LHS: &'a Value,
1399        RHS: &'a Value,
1400        Name: *const c_char,
1401    ) -> &'a Value;
1402    pub(crate) fn LLVMBuildOr<'a>(
1403        B: &Builder<'a>,
1404        LHS: &'a Value,
1405        RHS: &'a Value,
1406        Name: *const c_char,
1407    ) -> &'a Value;
1408    pub(crate) fn LLVMBuildXor<'a>(
1409        B: &Builder<'a>,
1410        LHS: &'a Value,
1411        RHS: &'a Value,
1412        Name: *const c_char,
1413    ) -> &'a Value;
1414    pub(crate) fn LLVMBuildNeg<'a>(B: &Builder<'a>, V: &'a Value, Name: *const c_char)
1415    -> &'a Value;
1416    pub(crate) fn LLVMBuildFNeg<'a>(
1417        B: &Builder<'a>,
1418        V: &'a Value,
1419        Name: *const c_char,
1420    ) -> &'a Value;
1421    pub(crate) fn LLVMBuildNot<'a>(B: &Builder<'a>, V: &'a Value, Name: *const c_char)
1422    -> &'a Value;
1423
1424    // Extra flags on arithmetic
1425    pub(crate) fn LLVMSetIsDisjoint(Instr: &Value, IsDisjoint: Bool);
1426    pub(crate) fn LLVMSetNUW(ArithInst: &Value, HasNUW: Bool);
1427    pub(crate) fn LLVMSetNSW(ArithInst: &Value, HasNSW: Bool);
1428
1429    // Memory
1430    pub(crate) fn LLVMBuildAlloca<'a>(
1431        B: &Builder<'a>,
1432        Ty: &'a Type,
1433        Name: *const c_char,
1434    ) -> &'a Value;
1435    pub(crate) fn LLVMBuildLoad2<'a>(
1436        B: &Builder<'a>,
1437        Ty: &'a Type,
1438        PointerVal: &'a Value,
1439        Name: *const c_char,
1440    ) -> &'a Value;
1441
1442    pub(crate) fn LLVMBuildStore<'a>(B: &Builder<'a>, Val: &'a Value, Ptr: &'a Value) -> &'a Value;
1443
1444    pub(crate) fn LLVMBuildGEPWithNoWrapFlags<'a>(
1445        B: &Builder<'a>,
1446        Ty: &'a Type,
1447        Pointer: &'a Value,
1448        Indices: *const &'a Value,
1449        NumIndices: c_uint,
1450        Name: *const c_char,
1451        Flags: GEPNoWrapFlags,
1452    ) -> &'a Value;
1453
1454    // Casts
1455    pub(crate) fn LLVMBuildTrunc<'a>(
1456        B: &Builder<'a>,
1457        Val: &'a Value,
1458        DestTy: &'a Type,
1459        Name: *const c_char,
1460    ) -> &'a Value;
1461    pub(crate) fn LLVMBuildZExt<'a>(
1462        B: &Builder<'a>,
1463        Val: &'a Value,
1464        DestTy: &'a Type,
1465        Name: *const c_char,
1466    ) -> &'a Value;
1467    pub(crate) fn LLVMBuildSExt<'a>(
1468        B: &Builder<'a>,
1469        Val: &'a Value,
1470        DestTy: &'a Type,
1471        Name: *const c_char,
1472    ) -> &'a Value;
1473    pub(crate) fn LLVMBuildFPToUI<'a>(
1474        B: &Builder<'a>,
1475        Val: &'a Value,
1476        DestTy: &'a Type,
1477        Name: *const c_char,
1478    ) -> &'a Value;
1479    pub(crate) fn LLVMBuildFPToSI<'a>(
1480        B: &Builder<'a>,
1481        Val: &'a Value,
1482        DestTy: &'a Type,
1483        Name: *const c_char,
1484    ) -> &'a Value;
1485    pub(crate) fn LLVMBuildUIToFP<'a>(
1486        B: &Builder<'a>,
1487        Val: &'a Value,
1488        DestTy: &'a Type,
1489        Name: *const c_char,
1490    ) -> &'a Value;
1491    pub(crate) fn LLVMBuildSIToFP<'a>(
1492        B: &Builder<'a>,
1493        Val: &'a Value,
1494        DestTy: &'a Type,
1495        Name: *const c_char,
1496    ) -> &'a Value;
1497    pub(crate) fn LLVMBuildFPTrunc<'a>(
1498        B: &Builder<'a>,
1499        Val: &'a Value,
1500        DestTy: &'a Type,
1501        Name: *const c_char,
1502    ) -> &'a Value;
1503    pub(crate) fn LLVMBuildFPExt<'a>(
1504        B: &Builder<'a>,
1505        Val: &'a Value,
1506        DestTy: &'a Type,
1507        Name: *const c_char,
1508    ) -> &'a Value;
1509    pub(crate) fn LLVMBuildPtrToInt<'a>(
1510        B: &Builder<'a>,
1511        Val: &'a Value,
1512        DestTy: &'a Type,
1513        Name: *const c_char,
1514    ) -> &'a Value;
1515    pub(crate) fn LLVMBuildIntToPtr<'a>(
1516        B: &Builder<'a>,
1517        Val: &'a Value,
1518        DestTy: &'a Type,
1519        Name: *const c_char,
1520    ) -> &'a Value;
1521    pub(crate) fn LLVMBuildBitCast<'a>(
1522        B: &Builder<'a>,
1523        Val: &'a Value,
1524        DestTy: &'a Type,
1525        Name: *const c_char,
1526    ) -> &'a Value;
1527    pub(crate) fn LLVMBuildPointerCast<'a>(
1528        B: &Builder<'a>,
1529        Val: &'a Value,
1530        DestTy: &'a Type,
1531        Name: *const c_char,
1532    ) -> &'a Value;
1533    pub(crate) fn LLVMBuildIntCast2<'a>(
1534        B: &Builder<'a>,
1535        Val: &'a Value,
1536        DestTy: &'a Type,
1537        IsSigned: Bool,
1538        Name: *const c_char,
1539    ) -> &'a Value;
1540
1541    // Comparisons
1542    pub(crate) fn LLVMBuildICmp<'a>(
1543        B: &Builder<'a>,
1544        Op: c_uint,
1545        LHS: &'a Value,
1546        RHS: &'a Value,
1547        Name: *const c_char,
1548    ) -> &'a Value;
1549    pub(crate) fn LLVMBuildFCmp<'a>(
1550        B: &Builder<'a>,
1551        Op: c_uint,
1552        LHS: &'a Value,
1553        RHS: &'a Value,
1554        Name: *const c_char,
1555    ) -> &'a Value;
1556
1557    // Miscellaneous instructions
1558    pub(crate) fn LLVMBuildPhi<'a>(B: &Builder<'a>, Ty: &'a Type, Name: *const c_char)
1559    -> &'a Value;
1560    pub(crate) fn LLVMBuildSelect<'a>(
1561        B: &Builder<'a>,
1562        If: &'a Value,
1563        Then: &'a Value,
1564        Else: &'a Value,
1565        Name: *const c_char,
1566    ) -> &'a Value;
1567    pub(crate) fn LLVMBuildVAArg<'a>(
1568        B: &Builder<'a>,
1569        list: &'a Value,
1570        Ty: &'a Type,
1571        Name: *const c_char,
1572    ) -> &'a Value;
1573    pub(crate) fn LLVMBuildExtractElement<'a>(
1574        B: &Builder<'a>,
1575        VecVal: &'a Value,
1576        Index: &'a Value,
1577        Name: *const c_char,
1578    ) -> &'a Value;
1579    pub(crate) fn LLVMBuildInsertElement<'a>(
1580        B: &Builder<'a>,
1581        VecVal: &'a Value,
1582        EltVal: &'a Value,
1583        Index: &'a Value,
1584        Name: *const c_char,
1585    ) -> &'a Value;
1586    pub(crate) fn LLVMBuildShuffleVector<'a>(
1587        B: &Builder<'a>,
1588        V1: &'a Value,
1589        V2: &'a Value,
1590        Mask: &'a Value,
1591        Name: *const c_char,
1592    ) -> &'a Value;
1593    pub(crate) fn LLVMBuildExtractValue<'a>(
1594        B: &Builder<'a>,
1595        AggVal: &'a Value,
1596        Index: c_uint,
1597        Name: *const c_char,
1598    ) -> &'a Value;
1599    pub(crate) fn LLVMBuildInsertValue<'a>(
1600        B: &Builder<'a>,
1601        AggVal: &'a Value,
1602        EltVal: &'a Value,
1603        Index: c_uint,
1604        Name: *const c_char,
1605    ) -> &'a Value;
1606
1607    // Atomic Operations
1608    pub(crate) fn LLVMBuildAtomicCmpXchg<'a>(
1609        B: &Builder<'a>,
1610        LHS: &'a Value,
1611        CMP: &'a Value,
1612        RHS: &'a Value,
1613        Order: AtomicOrdering,
1614        FailureOrder: AtomicOrdering,
1615        SingleThreaded: Bool,
1616    ) -> &'a Value;
1617
1618    pub(crate) fn LLVMSetWeak(CmpXchgInst: &Value, IsWeak: Bool);
1619
1620    pub(crate) fn LLVMBuildAtomicRMW<'a>(
1621        B: &Builder<'a>,
1622        Op: AtomicRmwBinOp,
1623        LHS: &'a Value,
1624        RHS: &'a Value,
1625        Order: AtomicOrdering,
1626        SingleThreaded: Bool,
1627    ) -> &'a Value;
1628
1629    pub(crate) fn LLVMBuildFence<'a>(
1630        B: &Builder<'a>,
1631        Order: AtomicOrdering,
1632        SingleThreaded: Bool,
1633        Name: *const c_char,
1634    ) -> &'a Value;
1635
1636    /// Writes a module to the specified path. Returns 0 on success.
1637    pub(crate) fn LLVMWriteBitcodeToFile(M: &Module, Path: *const c_char) -> c_int;
1638
1639    /// Creates a legacy pass manager -- only used for final codegen.
1640    pub(crate) fn LLVMCreatePassManager<'a>() -> &'a mut PassManager<'a>;
1641
1642    pub(crate) fn LLVMAddAnalysisPasses<'a>(T: &'a TargetMachine, PM: &PassManager<'a>);
1643
1644    pub(crate) fn LLVMGetHostCPUFeatures() -> *mut c_char;
1645
1646    pub(crate) fn LLVMDisposeMessage(message: *mut c_char);
1647
1648    pub(crate) fn LLVMIsMultithreaded() -> Bool;
1649
1650    pub(crate) fn LLVMStructCreateNamed(C: &Context, Name: *const c_char) -> &Type;
1651
1652    pub(crate) fn LLVMStructSetBody<'a>(
1653        StructTy: &'a Type,
1654        ElementTypes: *const &'a Type,
1655        ElementCount: c_uint,
1656        Packed: Bool,
1657    );
1658
1659    pub(crate) fn LLVMCountStructElementTypes(StructTy: &Type) -> c_uint;
1660    pub(crate) fn LLVMGetStructElementTypes<'a>(StructTy: &'a Type, Dest: *mut &'a Type);
1661
1662    pub(crate) safe fn LLVMMetadataAsValue<'a>(C: &'a Context, MD: &'a Metadata) -> &'a Value;
1663
1664    pub(crate) safe fn LLVMSetUnnamedAddress(Global: &Value, UnnamedAddr: UnnamedAddr);
1665
1666    pub(crate) fn LLVMIsAConstantInt(value_ref: &Value) -> Option<&ConstantInt>;
1667
1668    pub(crate) fn LLVMGetOrInsertComdat(M: &Module, Name: *const c_char) -> &Comdat;
1669    pub(crate) fn LLVMSetComdat(V: &Value, C: &Comdat);
1670
1671    pub(crate) fn LLVMCreateOperandBundle(
1672        Tag: *const c_char,
1673        TagLen: size_t,
1674        Args: *const &'_ Value,
1675        NumArgs: c_uint,
1676    ) -> *mut OperandBundle<'_>;
1677    pub(crate) fn LLVMDisposeOperandBundle(Bundle: ptr::NonNull<OperandBundle<'_>>);
1678
1679    pub(crate) fn LLVMBuildCallWithOperandBundles<'a>(
1680        B: &Builder<'a>,
1681        Ty: &'a Type,
1682        Fn: &'a Value,
1683        Args: *const &'a Value,
1684        NumArgs: c_uint,
1685        Bundles: *const &OperandBundle<'a>,
1686        NumBundles: c_uint,
1687        Name: *const c_char,
1688    ) -> &'a Value;
1689    pub(crate) fn LLVMBuildInvokeWithOperandBundles<'a>(
1690        B: &Builder<'a>,
1691        Ty: &'a Type,
1692        Fn: &'a Value,
1693        Args: *const &'a Value,
1694        NumArgs: c_uint,
1695        Then: &'a BasicBlock,
1696        Catch: &'a BasicBlock,
1697        Bundles: *const &OperandBundle<'a>,
1698        NumBundles: c_uint,
1699        Name: *const c_char,
1700    ) -> &'a Value;
1701    pub(crate) fn LLVMBuildCallBr<'a>(
1702        B: &Builder<'a>,
1703        Ty: &'a Type,
1704        Fn: &'a Value,
1705        DefaultDest: &'a BasicBlock,
1706        IndirectDests: *const &'a BasicBlock,
1707        NumIndirectDests: c_uint,
1708        Args: *const &'a Value,
1709        NumArgs: c_uint,
1710        Bundles: *const &OperandBundle<'a>,
1711        NumBundles: c_uint,
1712        Name: *const c_char,
1713    ) -> &'a Value;
1714}
1715
1716#[cfg(feature = "llvm_offload")]
1717pub(crate) use self::Offload::*;
1718
1719#[cfg(feature = "llvm_offload")]
1720mod Offload {
1721    use super::*;
1722    unsafe extern "C" {
1723        /// Processes the module and writes it in an offload compatible way into a "device.bin" file.
1724        pub(crate) fn LLVMRustBundleImages<'a>(
1725            M: &'a Module,
1726            TM: &'a TargetMachine,
1727            device_bin: *const c_char,
1728        ) -> bool;
1729        pub(crate) unsafe fn LLVMRustOffloadEmbedBufferInModule<'a>(
1730            _M: &'a Module,
1731            _device_bin: *const c_char,
1732        ) -> bool;
1733        pub(crate) fn LLVMRustOffloadMapper<'a>(
1734            OldFn: &'a Value,
1735            NewFn: &'a Value,
1736            RebuiltArgs: *const &Value,
1737        );
1738    }
1739}
1740
1741#[cfg(not(feature = "llvm_offload"))]
1742pub(crate) use self::Offload_fallback::*;
1743
1744#[cfg(not(feature = "llvm_offload"))]
1745mod Offload_fallback {
1746    use super::*;
1747    /// Processes the module and writes it in an offload compatible way into a "device.bin" file.
1748    /// Marked as unsafe to match the real offload wrapper which is unsafe due to FFI.
1749    #[allow(unused_unsafe)]
1750    pub(crate) unsafe fn LLVMRustBundleImages<'a>(
1751        _M: &'a Module,
1752        _TM: &'a TargetMachine,
1753        _device_bin: *const c_char,
1754    ) -> bool {
1755        {
    ::core::panicking::panic_fmt(format_args!("not implemented: {0}",
            format_args!("This rustc version was not built with LLVM Offload support!")));
};unimplemented!("This rustc version was not built with LLVM Offload support!");
1756    }
1757    pub(crate) unsafe fn LLVMRustOffloadEmbedBufferInModule<'a>(
1758        _M: &'a Module,
1759        _device_bin: *const c_char,
1760    ) -> bool {
1761        {
    ::core::panicking::panic_fmt(format_args!("not implemented: {0}",
            format_args!("This rustc version was not built with LLVM Offload support!")));
};unimplemented!("This rustc version was not built with LLVM Offload support!");
1762    }
1763    #[allow(unused_unsafe)]
1764    pub(crate) unsafe fn LLVMRustOffloadMapper<'a>(
1765        _OldFn: &'a Value,
1766        _NewFn: &'a Value,
1767        _RebuiltArgs: *const &Value,
1768    ) {
1769        {
    ::core::panicking::panic_fmt(format_args!("not implemented: {0}",
            format_args!("This rustc version was not built with LLVM Offload support!")));
};unimplemented!("This rustc version was not built with LLVM Offload support!");
1770    }
1771}
1772
1773// FFI bindings for `DIBuilder` functions in the LLVM-C API.
1774// Try to keep these in the same order as in `llvm/include/llvm-c/DebugInfo.h`.
1775//
1776// FIXME(#134001): Audit all `Option` parameters, especially in lists, to check
1777// that they really are nullable on the C/C++ side. LLVM doesn't appear to
1778// actually document which ones are nullable.
1779unsafe extern "C" {
1780    pub(crate) fn LLVMCreateDIBuilder<'ll>(M: &'ll Module) -> *mut DIBuilder<'ll>;
1781    pub(crate) fn LLVMDisposeDIBuilder<'ll>(Builder: ptr::NonNull<DIBuilder<'ll>>);
1782
1783    pub(crate) fn LLVMDIBuilderFinalize<'ll>(Builder: &DIBuilder<'ll>);
1784
1785    pub(crate) fn LLVMDIBuilderCreateNameSpace<'ll>(
1786        Builder: &DIBuilder<'ll>,
1787        ParentScope: Option<&'ll Metadata>,
1788        Name: *const c_uchar, // See "PTR_LEN_STR".
1789        NameLen: size_t,
1790        ExportSymbols: llvm::Bool,
1791    ) -> &'ll Metadata;
1792
1793    pub(crate) fn LLVMDIBuilderCreateLexicalBlock<'ll>(
1794        Builder: &DIBuilder<'ll>,
1795        Scope: &'ll Metadata,
1796        File: &'ll Metadata,
1797        Line: c_uint,
1798        Column: c_uint,
1799    ) -> &'ll Metadata;
1800
1801    pub(crate) fn LLVMDIBuilderCreateLexicalBlockFile<'ll>(
1802        Builder: &DIBuilder<'ll>,
1803        Scope: &'ll Metadata,
1804        File: &'ll Metadata,
1805        Discriminator: c_uint, // (optional "DWARF path discriminator"; default is 0)
1806    ) -> &'ll Metadata;
1807
1808    pub(crate) fn LLVMDIBuilderCreateDebugLocation<'ll>(
1809        Ctx: &'ll Context,
1810        Line: c_uint,
1811        Column: c_uint,
1812        Scope: &'ll Metadata,
1813        InlinedAt: Option<&'ll Metadata>,
1814    ) -> &'ll Metadata;
1815
1816    pub(crate) fn LLVMDIBuilderCreateSubroutineType<'ll>(
1817        Builder: &DIBuilder<'ll>,
1818        File: Option<&'ll Metadata>, // (ignored and has no effect)
1819        ParameterTypes: *const Option<&'ll Metadata>,
1820        NumParameterTypes: c_uint,
1821        Flags: DIFlags, // (default is `DIFlags::DIFlagZero`)
1822    ) -> &'ll Metadata;
1823
1824    pub(crate) fn LLVMDIBuilderCreateEnumeratorOfArbitraryPrecision<'ll>(
1825        Builder: &DIBuilder<'ll>,
1826        Name: *const c_uchar, // See "PTR_LEN_STR".
1827        NameLen: size_t,
1828        SizeInBits: u64,
1829        Words: *const u64, // LLVM computes `NumWords = (SizeInBits + 63) / 64`.
1830        IsUnsigned: llvm::Bool,
1831    ) -> &'ll Metadata;
1832
1833    pub(crate) fn LLVMDIBuilderCreateUnionType<'ll>(
1834        Builder: &DIBuilder<'ll>,
1835        Scope: Option<&'ll Metadata>,
1836        Name: *const c_uchar, // See "PTR_LEN_STR".
1837        NameLen: size_t,
1838        File: &'ll Metadata,
1839        LineNumber: c_uint,
1840        SizeInBits: u64,
1841        AlignInBits: u32,
1842        Flags: DIFlags,
1843        Elements: *const Option<&'ll Metadata>,
1844        NumElements: c_uint,
1845        RunTimeLang: c_uint, // (optional Objective-C runtime version; default is 0)
1846        UniqueId: *const c_uchar, // See "PTR_LEN_STR".
1847        UniqueIdLen: size_t,
1848    ) -> &'ll Metadata;
1849
1850    pub(crate) fn LLVMDIBuilderCreateArrayType<'ll>(
1851        Builder: &DIBuilder<'ll>,
1852        Size: u64,
1853        Align: u32,
1854        Ty: &'ll Metadata,
1855        Subscripts: *const &'ll Metadata,
1856        NumSubscripts: c_uint,
1857    ) -> &'ll Metadata;
1858
1859    pub(crate) fn LLVMDIBuilderCreateBasicType<'ll>(
1860        Builder: &DIBuilder<'ll>,
1861        Name: *const c_uchar, // See "PTR_LEN_STR".
1862        NameLen: size_t,
1863        SizeInBits: u64,
1864        Encoding: c_uint, // (`LLVMDWARFTypeEncoding`)
1865        Flags: DIFlags,   // (default is `DIFlags::DIFlagZero`)
1866    ) -> &'ll Metadata;
1867
1868    pub(crate) fn LLVMDIBuilderCreatePointerType<'ll>(
1869        Builder: &DIBuilder<'ll>,
1870        PointeeTy: &'ll Metadata,
1871        SizeInBits: u64,
1872        AlignInBits: u32,
1873        AddressSpace: c_uint, // (optional DWARF address space; default is 0)
1874        Name: *const c_uchar, // See "PTR_LEN_STR".
1875        NameLen: size_t,
1876    ) -> &'ll Metadata;
1877
1878    pub(crate) fn LLVMDIBuilderCreateStructType<'ll>(
1879        Builder: &DIBuilder<'ll>,
1880        Scope: Option<&'ll Metadata>,
1881        Name: *const c_uchar, // See "PTR_LEN_STR".
1882        NameLen: size_t,
1883        File: &'ll Metadata,
1884        LineNumber: c_uint,
1885        SizeInBits: u64,
1886        AlignInBits: u32,
1887        Flags: DIFlags,
1888        DerivedFrom: Option<&'ll Metadata>,
1889        Elements: *const Option<&'ll Metadata>,
1890        NumElements: c_uint,
1891        RunTimeLang: c_uint, // (optional Objective-C runtime version; default is 0)
1892        VTableHolder: Option<&'ll Metadata>,
1893        UniqueId: *const c_uchar, // See "PTR_LEN_STR".
1894        UniqueIdLen: size_t,
1895    ) -> &'ll Metadata;
1896
1897    pub(crate) fn LLVMDIBuilderCreateMemberType<'ll>(
1898        Builder: &DIBuilder<'ll>,
1899        Scope: &'ll Metadata,
1900        Name: *const c_uchar, // See "PTR_LEN_STR".
1901        NameLen: size_t,
1902        File: &'ll Metadata,
1903        LineNo: c_uint,
1904        SizeInBits: u64,
1905        AlignInBits: u32,
1906        OffsetInBits: u64,
1907        Flags: DIFlags,
1908        Ty: &'ll Metadata,
1909    ) -> &'ll Metadata;
1910
1911    pub(crate) fn LLVMDIBuilderCreateStaticMemberType<'ll>(
1912        Builder: &DIBuilder<'ll>,
1913        Scope: &'ll Metadata,
1914        Name: *const c_uchar, // See "PTR_LEN_STR".
1915        NameLen: size_t,
1916        File: &'ll Metadata,
1917        LineNumber: c_uint,
1918        Type: &'ll Metadata,
1919        Flags: DIFlags,
1920        ConstantVal: Option<&'ll Value>,
1921        AlignInBits: u32,
1922    ) -> &'ll Metadata;
1923
1924    /// Creates a "qualified type" in the C/C++ sense, by adding modifiers
1925    /// like `const` or `volatile`.
1926    pub(crate) fn LLVMDIBuilderCreateQualifiedType<'ll>(
1927        Builder: &DIBuilder<'ll>,
1928        Tag: c_uint, // (DWARF tag, e.g. `DW_TAG_const_type`)
1929        Type: &'ll Metadata,
1930    ) -> &'ll Metadata;
1931
1932    pub(crate) fn LLVMDIBuilderCreateTypedef<'ll>(
1933        Builder: &DIBuilder<'ll>,
1934        Type: &'ll Metadata,
1935        Name: *const c_uchar, // See "PTR_LEN_STR".
1936        NameLen: size_t,
1937        File: &'ll Metadata,
1938        LineNo: c_uint,
1939        Scope: Option<&'ll Metadata>,
1940        AlignInBits: u32, // (optional; default is 0)
1941    ) -> &'ll Metadata;
1942
1943    pub(crate) fn LLVMDIBuilderGetOrCreateSubrange<'ll>(
1944        Builder: &DIBuilder<'ll>,
1945        LowerBound: i64,
1946        Count: i64,
1947    ) -> &'ll Metadata;
1948
1949    pub(crate) fn LLVMDIBuilderGetOrCreateArray<'ll>(
1950        Builder: &DIBuilder<'ll>,
1951        Data: *const Option<&'ll Metadata>,
1952        NumElements: size_t,
1953    ) -> &'ll Metadata;
1954
1955    pub(crate) fn LLVMDIBuilderCreateExpression<'ll>(
1956        Builder: &DIBuilder<'ll>,
1957        Addr: *const u64,
1958        Length: size_t,
1959    ) -> &'ll Metadata;
1960
1961    pub(crate) fn LLVMDIBuilderCreateGlobalVariableExpression<'ll>(
1962        Builder: &DIBuilder<'ll>,
1963        Scope: Option<&'ll Metadata>,
1964        Name: *const c_uchar, // See "PTR_LEN_STR".
1965        NameLen: size_t,
1966        Linkage: *const c_uchar, // See "PTR_LEN_STR".
1967        LinkLen: size_t,
1968        File: &'ll Metadata,
1969        LineNo: c_uint,
1970        Ty: &'ll Metadata,
1971        LocalToUnit: llvm::Bool,
1972        Expr: &'ll Metadata,
1973        Decl: Option<&'ll Metadata>,
1974        AlignInBits: u32,
1975    ) -> &'ll Metadata;
1976
1977    pub(crate) fn LLVMDIBuilderInsertDeclareRecordAtEnd<'ll>(
1978        Builder: &DIBuilder<'ll>,
1979        Storage: &'ll Value,
1980        VarInfo: &'ll Metadata,
1981        Expr: &'ll Metadata,
1982        DebugLoc: &'ll Metadata,
1983        Block: &'ll BasicBlock,
1984    ) -> &'ll DbgRecord;
1985
1986    pub(crate) fn LLVMDIBuilderInsertDbgValueRecordAtEnd<'ll>(
1987        Builder: &DIBuilder<'ll>,
1988        Val: &'ll Value,
1989        VarInfo: &'ll Metadata,
1990        Expr: &'ll Metadata,
1991        DebugLoc: &'ll Metadata,
1992        Block: &'ll BasicBlock,
1993    ) -> &'ll DbgRecord;
1994
1995    pub(crate) fn LLVMDIBuilderCreateAutoVariable<'ll>(
1996        Builder: &DIBuilder<'ll>,
1997        Scope: &'ll Metadata,
1998        Name: *const c_uchar, // See "PTR_LEN_STR".
1999        NameLen: size_t,
2000        File: &'ll Metadata,
2001        LineNo: c_uint,
2002        Ty: &'ll Metadata,
2003        AlwaysPreserve: llvm::Bool, // "If true, this descriptor will survive optimizations."
2004        Flags: DIFlags,
2005        AlignInBits: u32,
2006    ) -> &'ll Metadata;
2007
2008    pub(crate) fn LLVMDIBuilderCreateParameterVariable<'ll>(
2009        Builder: &DIBuilder<'ll>,
2010        Scope: &'ll Metadata,
2011        Name: *const c_uchar, // See "PTR_LEN_STR".
2012        NameLen: size_t,
2013        ArgNo: c_uint,
2014        File: &'ll Metadata,
2015        LineNo: c_uint,
2016        Ty: &'ll Metadata,
2017        AlwaysPreserve: llvm::Bool, // "If true, this descriptor will survive optimizations."
2018        Flags: DIFlags,
2019    ) -> &'ll Metadata;
2020}
2021
2022#[link(name = "llvm-wrapper", kind = "static")]
2023unsafe extern "C" {
2024    pub(crate) fn LLVMRustInstallErrorHandlers();
2025    pub(crate) fn LLVMRustDisableSystemDialogsOnCrash();
2026
2027    // Operations on all values
2028    /// FIXME: After dropping LLVM 21, migrate to LLVM-C's `LLVMGlobalAddMetadata`.
2029    pub(crate) fn LLVMRustGlobalAddMetadata<'a>(
2030        Val: &'a Value,
2031        KindID: MetadataKindId,
2032        Metadata: &'a Metadata,
2033    );
2034    pub(crate) fn LLVMRustIsNonGVFunctionPointerTy(Val: &Value) -> bool;
2035    pub(crate) fn LLVMRustStripPointerCasts<'a>(Val: &'a Value) -> &'a Value;
2036
2037    // Operations on scalar constants
2038    pub(crate) fn LLVMRustConstIntGetZExtValue(ConstantVal: &ConstantInt, Value: &mut u64) -> bool;
2039    pub(crate) fn LLVMRustConstInt128Get(
2040        ConstantVal: &ConstantInt,
2041        SExt: bool,
2042        high: &mut u64,
2043        low: &mut u64,
2044    ) -> bool;
2045
2046    // Operations on global variables, functions, and aliases (globals)
2047    pub(crate) fn LLVMRustSetDSOLocal(Global: &Value, is_dso_local: bool);
2048
2049    // Operations on global variables
2050    pub(crate) fn LLVMRustGetOrInsertGlobal<'a>(
2051        M: &'a Module,
2052        Name: *const c_char,
2053        NameLen: size_t,
2054        T: &'a Type,
2055    ) -> &'a Value;
2056    pub(crate) fn LLVMRustGetOrInsertGlobalInAddrspace<'a>(
2057        M: &'a Module,
2058        Name: *const c_char,
2059        NameLen: size_t,
2060        T: &'a Type,
2061        AddressSpace: c_uint,
2062    ) -> &'a Value;
2063    pub(crate) fn LLVMRustGetNamedValue(
2064        M: &Module,
2065        Name: *const c_char,
2066        NameLen: size_t,
2067    ) -> Option<&Value>;
2068
2069    // Operations on attributes
2070    pub(crate) fn LLVMRustCreateAttrNoValue(C: &Context, attr: AttributeKind) -> &Attribute;
2071    pub(crate) fn LLVMRustCreateAlignmentAttr(C: &Context, bytes: u64) -> &Attribute;
2072    pub(crate) fn LLVMRustCreateDereferenceableAttr(C: &Context, bytes: u64) -> &Attribute;
2073    pub(crate) fn LLVMRustCreateDereferenceableOrNullAttr(C: &Context, bytes: u64) -> &Attribute;
2074    pub(crate) fn LLVMRustCreateByValAttr<'a>(C: &'a Context, ty: &'a Type) -> &'a Attribute;
2075    pub(crate) fn LLVMRustCreateStructRetAttr<'a>(C: &'a Context, ty: &'a Type) -> &'a Attribute;
2076    pub(crate) fn LLVMRustCreateElementTypeAttr<'a>(C: &'a Context, ty: &'a Type) -> &'a Attribute;
2077    pub(crate) fn LLVMRustCreateUWTableAttr(C: &Context, async_: bool) -> &Attribute;
2078    pub(crate) fn LLVMRustCreateAllocSizeAttr(C: &Context, size_arg: u32) -> &Attribute;
2079    pub(crate) fn LLVMRustCreateAllocKindAttr(C: &Context, size_arg: u64) -> &Attribute;
2080    pub(crate) fn LLVMRustCreateMemoryEffectsAttr(
2081        C: &Context,
2082        effects: MemoryEffects,
2083    ) -> &Attribute;
2084    /// ## Safety
2085    /// - Each of `LowerWords` and `UpperWords` must point to an array that is
2086    ///   long enough to fully define an integer of size `NumBits`, i.e. each
2087    ///   pointer must point to `NumBits.div_ceil(64)` elements or more.
2088    /// - The implementation will make its own copy of the pointed-to `u64`
2089    ///   values, so the pointers only need to outlive this function call.
2090    pub(crate) fn LLVMRustCreateRangeAttribute(
2091        C: &Context,
2092        NumBits: c_uint,
2093        LowerWords: *const u64,
2094        UpperWords: *const u64,
2095    ) -> &Attribute;
2096
2097    // Operations on functions
2098    /// FIXME: After dropping LLVM 21, migrate to LLVM-C's `LLVMGetOrInsertFunction`.
2099    pub(crate) fn LLVMRustGetOrInsertFunction<'a>(
2100        M: &'a Module,
2101        Name: *const c_char,
2102        NameLen: size_t,
2103        FunctionTy: &'a Type,
2104    ) -> &'a Value;
2105    pub(crate) fn LLVMRustAddFunctionAttributes<'a>(
2106        Fn: &'a Value,
2107        index: c_uint,
2108        Attrs: *const &'a Attribute,
2109        AttrsLen: size_t,
2110    );
2111
2112    // Operations on call sites
2113    pub(crate) fn LLVMRustAddCallSiteAttributes<'a>(
2114        Instr: &'a Value,
2115        index: c_uint,
2116        Attrs: *const &'a Attribute,
2117        AttrsLen: size_t,
2118    );
2119
2120    pub(crate) fn LLVMRustSetFastMath(Instr: &Value);
2121    pub(crate) fn LLVMRustSetAlgebraicMath(Instr: &Value);
2122    pub(crate) fn LLVMRustSetAllowReassoc(Instr: &Value);
2123    pub(crate) fn LLVMRustSetNoSignedZeros(Instr: &Value);
2124
2125    // Miscellaneous instructions
2126    pub(crate) fn LLVMRustBuildMemCpy<'a>(
2127        B: &Builder<'a>,
2128        Dst: &'a Value,
2129        DstAlign: c_uint,
2130        Src: &'a Value,
2131        SrcAlign: c_uint,
2132        Size: &'a Value,
2133        IsVolatile: bool,
2134    ) -> &'a Value;
2135    pub(crate) fn LLVMRustBuildMemMove<'a>(
2136        B: &Builder<'a>,
2137        Dst: &'a Value,
2138        DstAlign: c_uint,
2139        Src: &'a Value,
2140        SrcAlign: c_uint,
2141        Size: &'a Value,
2142        IsVolatile: bool,
2143    ) -> &'a Value;
2144    pub(crate) fn LLVMRustBuildMemSet<'a>(
2145        B: &Builder<'a>,
2146        Dst: &'a Value,
2147        DstAlign: c_uint,
2148        Val: &'a Value,
2149        Size: &'a Value,
2150        IsVolatile: bool,
2151    ) -> &'a Value;
2152
2153    pub(crate) fn LLVMRustBuildVScale<'a>(B: &Builder<'a>, Ty: &'a Type) -> &'a Value;
2154
2155    pub(crate) fn LLVMRustTimeTraceProfilerInitialize();
2156
2157    pub(crate) fn LLVMRustTimeTraceProfilerFinishThread();
2158
2159    pub(crate) fn LLVMRustTimeTraceProfilerFinish(FileName: *const c_char);
2160
2161    /// Returns a string describing the last error caused by an LLVMRust* call.
2162    pub(crate) fn LLVMRustGetLastError() -> *const c_char;
2163
2164    /// Prints the timing information collected by `-Ztime-llvm-passes`.
2165    pub(crate) fn LLVMRustPrintPassTimings(OutStr: &RustString);
2166
2167    /// Prints the statistics collected by `-Zprint-codegen-stats`.
2168    pub(crate) fn LLVMRustPrintStatistics(OutStr: &RustString);
2169
2170    /// Save the statistics collected by `-Zprint-codegen-stats-json`
2171    pub(crate) fn LLVMRustPrintStatisticsJSON(OutStr: &RustString);
2172
2173    pub(crate) fn LLVMRustInlineAsmVerify(
2174        Ty: &Type,
2175        Constraints: *const c_uchar, // See "PTR_LEN_STR".
2176        ConstraintsLen: size_t,
2177    ) -> bool;
2178
2179    /// A list of pointer-length strings is passed as two pointer-length slices,
2180    /// one slice containing pointers and one slice containing their corresponding
2181    /// lengths. The implementation will check that both slices have the same length.
2182    pub(crate) fn LLVMRustCoverageWriteFilenamesToBuffer(
2183        Filenames: *const *const c_uchar, // See "PTR_LEN_STR".
2184        FilenamesLen: size_t,
2185        Lengths: *const size_t,
2186        LengthsLen: size_t,
2187        BufferOut: &RustString,
2188    );
2189
2190    pub(crate) fn LLVMRustCoverageWriteFunctionMappingsToBuffer(
2191        VirtualFileMappingIDs: *const c_uint,
2192        NumVirtualFileMappingIDs: size_t,
2193        Expressions: *const crate::coverageinfo::ffi::CounterExpression,
2194        NumExpressions: size_t,
2195        CodeRegions: *const crate::coverageinfo::ffi::CodeRegion,
2196        NumCodeRegions: size_t,
2197        ExpansionRegions: *const crate::coverageinfo::ffi::ExpansionRegion,
2198        NumExpansionRegions: size_t,
2199        BranchRegions: *const crate::coverageinfo::ffi::BranchRegion,
2200        NumBranchRegions: size_t,
2201        BufferOut: &RustString,
2202    );
2203
2204    pub(crate) fn LLVMRustCoverageCreatePGOFuncNameVar(
2205        F: &Value,
2206        FuncName: *const c_uchar, // See "PTR_LEN_STR".
2207        FuncNameLen: size_t,
2208    ) -> &Value;
2209    pub(crate) fn LLVMRustCoverageHashBytes(
2210        Bytes: *const c_uchar, // See "PTR_LEN_STR".
2211        NumBytes: size_t,
2212    ) -> u64;
2213
2214    pub(crate) safe fn LLVMRustCoverageWriteCovmapSectionNameToString(
2215        M: &Module,
2216        OutStr: &RustString,
2217    );
2218    pub(crate) safe fn LLVMRustCoverageWriteCovfunSectionNameToString(
2219        M: &Module,
2220        OutStr: &RustString,
2221    );
2222    pub(crate) safe fn LLVMRustCoverageWriteCovmapVarNameToString(OutStr: &RustString);
2223
2224    pub(crate) safe fn LLVMRustCoverageMappingVersion() -> u32;
2225    pub(crate) fn LLVMRustDebugMetadataVersion() -> u32;
2226    pub(crate) fn LLVMRustVersionMajor() -> u32;
2227    pub(crate) fn LLVMRustVersionMinor() -> u32;
2228    pub(crate) fn LLVMRustVersionPatch() -> u32;
2229
2230    /// Add LLVM module flags.
2231    ///
2232    /// In order for Rust-C LTO to work, module flags must be compatible with Clang. What
2233    /// "compatible" means depends on the merge behaviors involved.
2234    pub(crate) fn LLVMRustAddModuleFlagU32(
2235        M: &Module,
2236        MergeBehavior: ModuleFlagMergeBehavior,
2237        Name: *const c_char,
2238        NameLen: size_t,
2239        Value: u32,
2240    );
2241
2242    pub(crate) fn LLVMRustAddModuleFlagString(
2243        M: &Module,
2244        MergeBehavior: ModuleFlagMergeBehavior,
2245        Name: *const c_char,
2246        NameLen: size_t,
2247        Value: *const c_char,
2248        ValueLen: size_t,
2249    );
2250
2251    /// We can't use LLVM-C's `LLVMDIBuilderCreateCompileUnit` because it hardcodes
2252    /// `DICompileUnit::DebugNameTableKind::Default`, but we want to be able to
2253    /// pass other values.
2254    pub(crate) fn LLVMRustDIBuilderCreateCompileUnit<'a>(
2255        Builder: &DIBuilder<'a>,
2256        Lang: c_uint,
2257        File: &'a DIFile,
2258        Producer: *const c_char,
2259        ProducerLen: size_t,
2260        isOptimized: bool,
2261        Flags: *const c_char,
2262        RuntimeVer: c_uint,
2263        SplitName: *const c_char,
2264        SplitNameLen: size_t,
2265        kind: DebugEmissionKind,
2266        DWOId: u64,
2267        SplitDebugInlining: bool,
2268        DebugNameTableKind: DebugNameTableKind,
2269    ) -> &'a DIDescriptor;
2270
2271    /// We can't use LLVM-C's `LLVMDIBuilderCreateFileWithChecksum` because it
2272    /// _requires_ a checksum, but we sometimes don't provide one.
2273    pub(crate) fn LLVMRustDIBuilderCreateFile<'a>(
2274        Builder: &DIBuilder<'a>,
2275        Filename: *const c_char,
2276        FilenameLen: size_t,
2277        Directory: *const c_char,
2278        DirectoryLen: size_t,
2279        CSKind: ChecksumKind,
2280        Checksum: *const c_char,
2281        ChecksumLen: size_t,
2282        Source: *const c_char,
2283        SourceLen: size_t,
2284    ) -> &'a DIFile;
2285
2286    /// We can't use LLVM-C's `LLVMDIBuilderCreateFunction` because it only
2287    /// supports a subset of `DISubprogram::DISPFlags`.
2288    pub(crate) fn LLVMRustDIBuilderCreateFunction<'a>(
2289        Builder: &DIBuilder<'a>,
2290        Scope: &'a DIDescriptor,
2291        Name: *const c_char,
2292        NameLen: size_t,
2293        LinkageName: *const c_char,
2294        LinkageNameLen: size_t,
2295        File: &'a DIFile,
2296        LineNo: c_uint,
2297        Ty: &'a DIType,
2298        ScopeLine: c_uint,
2299        Flags: DIFlags,
2300        SPFlags: DISPFlags,
2301        MaybeFn: Option<&'a Value>,
2302        TParam: &'a DIArray,
2303        Decl: Option<&'a DIDescriptor>,
2304    ) -> &'a DISubprogram;
2305
2306    /// As of LLVM 22 there is no corresponding LLVM-C function.
2307    pub(crate) fn LLVMRustDIBuilderCreateMethod<'a>(
2308        Builder: &DIBuilder<'a>,
2309        Scope: &'a DIDescriptor,
2310        Name: *const c_char,
2311        NameLen: size_t,
2312        LinkageName: *const c_char,
2313        LinkageNameLen: size_t,
2314        File: &'a DIFile,
2315        LineNo: c_uint,
2316        Ty: &'a DIType,
2317        Flags: DIFlags,
2318        SPFlags: DISPFlags,
2319        TParam: &'a DIArray,
2320    ) -> &'a DISubprogram;
2321
2322    /// As of LLVM 22 there is no corresponding LLVM-C function.
2323    pub(crate) fn LLVMRustDIBuilderCreateVariantMemberType<'a>(
2324        Builder: &DIBuilder<'a>,
2325        Scope: &'a DIScope,
2326        Name: *const c_char,
2327        NameLen: size_t,
2328        File: &'a DIFile,
2329        LineNumber: c_uint,
2330        SizeInBits: u64,
2331        AlignInBits: u32,
2332        OffsetInBits: u64,
2333        Discriminant: Option<&'a Value>,
2334        Flags: DIFlags,
2335        Ty: &'a DIType,
2336    ) -> &'a DIType;
2337
2338    /// As of LLVM 22 there is no corresponding LLVM-C function.
2339    pub(crate) fn LLVMRustDIBuilderCreateEnumerationType<'a>(
2340        Builder: &DIBuilder<'a>,
2341        Scope: &'a DIScope,
2342        Name: *const c_char,
2343        NameLen: size_t,
2344        File: &'a DIFile,
2345        LineNumber: c_uint,
2346        SizeInBits: u64,
2347        AlignInBits: u32,
2348        Elements: &'a DIArray,
2349        ClassType: &'a DIType,
2350        IsScoped: bool,
2351    ) -> &'a DIType;
2352
2353    /// As of LLVM 22 there is no corresponding LLVM-C function.
2354    pub(crate) fn LLVMRustDIBuilderCreateVariantPart<'a>(
2355        Builder: &DIBuilder<'a>,
2356        Scope: &'a DIScope,
2357        Name: *const c_char,
2358        NameLen: size_t,
2359        File: &'a DIFile,
2360        LineNo: c_uint,
2361        SizeInBits: u64,
2362        AlignInBits: u32,
2363        Flags: DIFlags,
2364        Discriminator: Option<&'a DIDerivedType>,
2365        Elements: &'a DIArray,
2366        UniqueId: *const c_char,
2367        UniqueIdLen: size_t,
2368    ) -> &'a DIDerivedType;
2369
2370    /// As of LLVM 22 there is no corresponding LLVM-C function.
2371    pub(crate) fn LLVMRustDIBuilderCreateTemplateTypeParameter<'a>(
2372        Builder: &DIBuilder<'a>,
2373        Scope: Option<&'a DIScope>,
2374        Name: *const c_char,
2375        NameLen: size_t,
2376        Ty: &'a DIType,
2377    ) -> &'a DITemplateTypeParameter;
2378
2379    /// We can't use LLVM-C's `LLVMReplaceArrays` because it doesn't take a
2380    /// `Params` argument.
2381    pub(crate) fn LLVMRustDICompositeTypeReplaceArrays<'a>(
2382        Builder: &DIBuilder<'a>,
2383        CompositeType: &'a DIType,
2384        Elements: Option<&'a DIArray>,
2385        Params: Option<&'a DIArray>,
2386    );
2387
2388    /// We can't use LLVM-C's `LLVMDIBuilderGetOrCreateSubrange` because it doesn't
2389    /// call the overload that takes a `Metadata` upper bound.
2390    pub(crate) fn LLVMRustDIGetOrCreateSubrange<'a>(
2391        Builder: &DIBuilder<'a>,
2392        CountNode: Option<&'a Metadata>,
2393        LB: &'a Metadata,
2394        UB: &'a Metadata,
2395        Stride: Option<&'a Metadata>,
2396    ) -> &'a Metadata;
2397
2398    /// We can't use LLVM-C's `LLVMDIBuilderCreateVectorType` because it doesn't
2399    /// take a `BitStride` argument.
2400    pub(crate) fn LLVMRustDICreateVectorType<'a>(
2401        Builder: &DIBuilder<'a>,
2402        Size: u64,
2403        AlignInBits: u32,
2404        Type: &'a DIType,
2405        Subscripts: &'a DIArray,
2406        BitStride: Option<&'a Metadata>,
2407    ) -> &'a Metadata;
2408
2409    /// As of LLVM 22 there is no corresponding LLVM-C function.
2410    pub(crate) fn LLVMRustDILocationCloneWithBaseDiscriminator<'a>(
2411        Location: &'a DILocation,
2412        BD: c_uint,
2413    ) -> Option<&'a DILocation>;
2414
2415    pub(crate) fn LLVMRustWriteTypeToString(Type: &Type, s: &RustString);
2416    pub(crate) fn LLVMRustWriteValueToString(value_ref: &Value, s: &RustString);
2417
2418    pub(crate) fn LLVMRustHasFeature(T: &TargetMachine, s: *const c_char) -> bool;
2419    pub(crate) fn LLVMRustTargetHasMnemonic(T: &TargetMachine, s: *const c_char) -> bool;
2420
2421    pub(crate) fn LLVMRustPrintTargetCPUs(TM: &TargetMachine, OutStr: &RustString);
2422    pub(crate) fn LLVMRustGetTargetFeaturesCount(T: &TargetMachine) -> size_t;
2423    pub(crate) fn LLVMRustGetTargetFeature(
2424        T: &TargetMachine,
2425        Index: size_t,
2426        Feature: &mut *const c_char,
2427        Desc: &mut *const c_char,
2428    );
2429
2430    pub(crate) fn LLVMRustGetHostCPUName(LenOut: &mut size_t) -> *const u8;
2431
2432    // This function makes copies of pointed to data, so the data's lifetime may end after this
2433    // function returns.
2434    pub(crate) fn LLVMRustCreateTargetMachine(
2435        Triple: *const c_char,
2436        CPU: *const c_char,
2437        Features: *const c_char,
2438        Abi: *const c_char,
2439        Model: CodeModel,
2440        Reloc: RelocModel,
2441        Level: CodeGenOptLevel,
2442        FloatABIType: FloatAbi,
2443        FunctionSections: bool,
2444        DataSections: bool,
2445        UniqueSectionNames: bool,
2446        TrapUnreachable: bool,
2447        Singlethread: bool,
2448        VerboseAsm: bool,
2449        EmitStackSizeSection: bool,
2450        RelaxELFRelocations: bool,
2451        UseInitArray: bool,
2452        SplitDwarfFile: *const c_char,
2453        OutputObjFile: *const c_char,
2454        DebugInfoCompression: CompressionKind,
2455        UseEmulatedTls: bool,
2456        UseWasmEH: bool,
2457        LargeDataThreshold: u64,
2458    ) -> *mut TargetMachine;
2459
2460    pub(crate) fn LLVMRustAddLibraryInfo<'a>(
2461        T: &TargetMachine,
2462        PM: &PassManager<'a>,
2463        M: &'a Module,
2464        DisableSimplifyLibCalls: bool,
2465    );
2466    pub(crate) fn LLVMRustWriteOutputFile<'a>(
2467        T: &'a TargetMachine,
2468        PM: *mut PassManager<'a>,
2469        M: &'a Module,
2470        Output: *const c_char,
2471        DwoOutput: *const c_char,
2472        FileType: FileType,
2473        VerifyIR: bool,
2474    ) -> LLVMRustResult;
2475    pub(crate) fn LLVMRustOptimize<'a>(
2476        M: &'a Module,
2477        TM: &'a TargetMachine,
2478        OptLevel: PassBuilderOptLevel,
2479        OptStage: OptStage,
2480        IsLinkerPluginLTO: bool,
2481        NoPrepopulatePasses: bool,
2482        VerifyIR: bool,
2483        LintIR: bool,
2484        ThinLTOBuffer: Option<&mut Option<crate::back::lto::Buffer>>,
2485        ThinLTOSummaryBuffer: Option<&mut Option<crate::back::lto::Buffer>>,
2486        MergeFunctions: bool,
2487        UnrollLoops: bool,
2488        SLPVectorize: bool,
2489        LoopVectorize: bool,
2490        DisableSimplifyLibCalls: bool,
2491        EmitLifetimeMarkers: bool,
2492        RunEnzyme: *const c_void,
2493        PrintBeforeEnzyme: bool,
2494        PrintAfterEnzyme: bool,
2495        PrintPasses: bool,
2496        SanitizerOptions: Option<&SanitizerOptions>,
2497        PGOGenPath: *const c_char,
2498        PGOUsePath: *const c_char,
2499        InstrumentCoverage: bool,
2500        InstrProfileOutput: *const c_char,
2501        PGOSampleUsePath: *const c_char,
2502        DebugInfoForProfiling: bool,
2503        llvm_selfprofiler: *mut c_void,
2504        begin_callback: SelfProfileBeforePassCallback,
2505        end_callback: SelfProfileAfterPassCallback,
2506        PostEnzymePasses: *const c_char,
2507        PostEnzymePassesLen: size_t,
2508        ExtraPasses: *const c_char,
2509        ExtraPassesLen: size_t,
2510        LLVMPlugins: *const c_char,
2511        LLVMPluginsLen: size_t,
2512    ) -> LLVMRustResult;
2513    pub(crate) fn LLVMRustPrintModule(
2514        M: &Module,
2515        Output: *const c_char,
2516        Demangle: extern "C" fn(*const c_char, size_t, *mut c_char, size_t) -> size_t,
2517    ) -> LLVMRustResult;
2518    pub(crate) fn LLVMRustSetLLVMOptions(Argc: c_int, Argv: *const *const c_char);
2519    pub(crate) fn LLVMRustPrintPasses();
2520    pub(crate) fn LLVMRustSetNormalizedTarget(M: &Module, triple: *const c_char);
2521    pub(crate) fn LLVMRustRunRestrictionPass(M: &Module, syms: *const *const c_char, len: size_t);
2522
2523    pub(crate) fn LLVMRustWriteTwineToString(T: &Twine, s: &RustString);
2524
2525    pub(crate) fn LLVMRustUnpackOptimizationDiagnostic<'a>(
2526        DI: &'a DiagnosticInfo,
2527        pass_name_out: &RustString,
2528        function_out: &mut Option<&'a Value>,
2529        loc_line_out: &mut c_uint,
2530        loc_column_out: &mut c_uint,
2531        loc_filename_out: &RustString,
2532        message_out: &RustString,
2533    );
2534
2535    pub(crate) fn LLVMRustUnpackInlineAsmDiagnostic<'a>(
2536        DI: &'a DiagnosticInfo,
2537        level_out: &mut DiagnosticLevel,
2538        cookie_out: &mut u64,
2539        message_out: &mut Option<&'a Twine>,
2540    );
2541
2542    pub(crate) fn LLVMRustWriteDiagnosticInfoToString(DI: &DiagnosticInfo, s: &RustString);
2543    pub(crate) fn LLVMRustGetDiagInfoKind(DI: &DiagnosticInfo) -> DiagnosticKind;
2544
2545    pub(crate) fn LLVMRustGetSMDiagnostic<'a>(
2546        DI: &'a DiagnosticInfo,
2547        cookie_out: &mut u64,
2548    ) -> &'a SMDiagnostic;
2549
2550    pub(crate) fn LLVMRustUnpackSMDiagnostic(
2551        d: &SMDiagnostic,
2552        message_out: &RustString,
2553        buffer_out: &RustString,
2554        level_out: &mut DiagnosticLevel,
2555        loc_out: &mut c_uint,
2556        ranges_out: *mut c_uint,
2557        num_ranges: &mut usize,
2558    ) -> bool;
2559
2560    pub(crate) fn LLVMRustSetDataLayoutFromTargetMachine<'a>(M: &'a Module, TM: &'a TargetMachine);
2561
2562    pub(crate) fn LLVMRustPositionBuilderPastAllocas<'a>(B: &Builder<'a>, Fn: &'a Value);
2563    pub(crate) fn LLVMRustPositionBuilderAtStart<'a>(B: &Builder<'a>, BB: &'a BasicBlock);
2564
2565    pub(crate) fn LLVMRustSetModulePICLevel(M: &Module);
2566    pub(crate) fn LLVMRustSetModulePIELevel(M: &Module);
2567    pub(crate) fn LLVMRustSetModuleCodeModel(M: &Module, Model: CodeModel);
2568    pub(crate) fn LLVMRustBufferPtr(p: &Buffer) -> *const u8;
2569    pub(crate) fn LLVMRustBufferLen(p: &Buffer) -> usize;
2570    pub(crate) fn LLVMRustBufferFree(p: &'static mut Buffer);
2571    pub(crate) fn LLVMRustModuleCost(M: &Module) -> u64;
2572    pub(crate) fn LLVMRustModuleInstructionStats(M: &Module) -> u64;
2573
2574    pub(crate) fn LLVMRustModuleSerialize(M: &Module, is_thin: bool) -> &'static mut Buffer;
2575    pub(crate) fn LLVMRustCreateThinLTOData(
2576        Modules: *const ThinLTOModule,
2577        NumModules: size_t,
2578        PreservedSymbols: *const *const c_char,
2579        PreservedSymbolsLen: size_t,
2580    ) -> Option<&'static mut ThinLTOData>;
2581    pub(crate) fn LLVMRustPrepareThinLTORename(
2582        Data: &ThinLTOData,
2583        Module: &Module,
2584        Target: &TargetMachine,
2585    );
2586    pub(crate) fn LLVMRustPrepareThinLTOResolveWeak(Data: &ThinLTOData, Module: &Module) -> bool;
2587    pub(crate) fn LLVMRustPrepareThinLTOInternalize(Data: &ThinLTOData, Module: &Module) -> bool;
2588    pub(crate) fn LLVMRustPrepareThinLTOImport(
2589        Data: &ThinLTOData,
2590        Module: &Module,
2591        Target: &TargetMachine,
2592    ) -> bool;
2593    pub(crate) fn LLVMRustFreeThinLTOData(Data: &'static mut ThinLTOData);
2594    pub(crate) fn LLVMRustParseBitcodeForLTO(
2595        Context: &Context,
2596        Data: *const u8,
2597        len: usize,
2598        Identifier: *const c_char,
2599    ) -> Option<&Module>;
2600
2601    pub(crate) fn LLVMRustLinkerNew(M: &Module) -> &mut Linker<'_>;
2602    pub(crate) fn LLVMRustLinkerAdd(
2603        linker: &Linker<'_>,
2604        bytecode: *const c_char,
2605        bytecode_len: usize,
2606    ) -> bool;
2607    pub(crate) fn LLVMRustLinkerFree<'a>(linker: &'a mut Linker<'a>);
2608    pub(crate) fn LLVMRustComputeLTOCacheKey(
2609        key_out: &RustString,
2610        mod_id: *const c_char,
2611        data: &ThinLTOData,
2612    );
2613
2614    pub(crate) fn LLVMRustContextGetDiagnosticHandler(
2615        Context: &Context,
2616    ) -> Option<&DiagnosticHandler>;
2617    pub(crate) fn LLVMRustContextSetDiagnosticHandler(
2618        context: &Context,
2619        diagnostic_handler: Option<&DiagnosticHandler>,
2620    );
2621    pub(crate) fn LLVMRustContextConfigureDiagnosticHandler(
2622        context: &Context,
2623        diagnostic_handler_callback: DiagnosticHandlerTy,
2624        diagnostic_handler_context: *mut c_void,
2625        remark_all_passes: bool,
2626        remark_passes: *const *const c_char,
2627        remark_passes_len: usize,
2628        remark_file: *const c_char,
2629        pgo_available: bool,
2630    );
2631
2632    pub(crate) fn LLVMRustGetMangledName(V: &Value, out: &RustString);
2633
2634    pub(crate) fn LLVMRustGetElementTypeArgIndex(CallSite: &Value) -> i32;
2635
2636    pub(crate) safe fn LLVMRustLLVMHasZlibCompression() -> bool;
2637    pub(crate) safe fn LLVMRustLLVMHasZstdCompression() -> bool;
2638
2639    pub(crate) fn LLVMRustGetSymbols(
2640        buf_ptr: *const u8,
2641        buf_len: usize,
2642        state: *mut c_void,
2643        callback: GetSymbolsCallback,
2644        error_callback: GetSymbolsErrorCallback,
2645    ) -> *mut c_void;
2646
2647    pub(crate) fn LLVMRustIs64BitSymbolicFile(buf_ptr: *const u8, buf_len: usize) -> bool;
2648
2649    pub(crate) fn LLVMRustIsECObject(buf_ptr: *const u8, buf_len: usize) -> bool;
2650
2651    pub(crate) fn LLVMRustIsAnyArm64Coff(buf_ptr: *const u8, buf_len: usize) -> bool;
2652
2653    pub(crate) fn LLVMRustSetNoSanitizeAddress(Global: &Value);
2654    pub(crate) fn LLVMRustSetNoSanitizeHWAddress(Global: &Value);
2655
2656    pub(crate) fn LLVMRustConstPtrAuth(
2657        ptr: *const Value,
2658        key: u32,
2659        disc: u64,
2660        addr_diversity: *const Value,
2661        deactivation_symbol: *const Value,
2662    ) -> *const Value;
2663}