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