Skip to content

repr(C,packed(4)) type generated that transitively contains repr(align(4)), causing a build error #1556

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Closed
Lokathor opened this issue May 2, 2019 · 3 comments

Comments

@Lokathor
Copy link
Contributor

Lokathor commented May 2, 2019

So I've got some sdl2 bindings of my own that currently binds only SDL.h, and I tried to add the SDL_syswm.h file to the bindings. However, when I did the following rust ended up being generated:

#[repr(C, packed(4))]
#[derive(Copy, Clone)]
pub struct _IMAGE_TLS_DIRECTORY64 {
  pub StartAddressOfRawData: ULONGLONG,
  pub EndAddressOfRawData: ULONGLONG,
  pub AddressOfIndex: ULONGLONG,
  pub AddressOfCallBacks: ULONGLONG,
  pub SizeOfZeroFill: DWORD,
  pub __bindgen_anon_1: _IMAGE_TLS_DIRECTORY64__bindgen_ty_1,
}
#[repr(C)]
#[derive(Copy, Clone)]
pub union _IMAGE_TLS_DIRECTORY64__bindgen_ty_1 {
  pub Characteristics: DWORD,
  pub __bindgen_anon_1: _IMAGE_TLS_DIRECTORY64__bindgen_ty_1__bindgen_ty_1,
  _bindgen_union_align: u32,
}
#[repr(C)]
#[repr(align(4))]
#[derive(Debug, Default, Copy, Clone, PartialEq)]
pub struct _IMAGE_TLS_DIRECTORY64__bindgen_ty_1__bindgen_ty_1 {
  pub _bitfield_1: __BindgenBitfieldUnit<[u8; 4usize], u32>,
}

Unfortunately this is actually an illegal setup

D:\dev\fermium>cargo build
   Compiling fermium v0.0.7 (D:\dev\fermium)
error[E0588]: packed type cannot transitively contain a `[repr(align)]` type
     --> D:\dev\fermium\target\debug\build\fermium-3d250ea95a1b04df\out/bindings.rs:62015:1
      |
62015 | / pub struct _IMAGE_TLS_DIRECTORY64 {
62016 | |   pub StartAddressOfRawData: ULONGLONG,
62017 | |   pub EndAddressOfRawData: ULONGLONG,
62018 | |   pub AddressOfIndex: ULONGLONG,
...     |
62021 | |   pub __bindgen_anon_1: _IMAGE_TLS_DIRECTORY64__bindgen_ty_1,
62022 | | }
      | |_^

error: aborting due to previous error

For more information about this error, try `rustc --explain E0588`.
error: Could not compile `fermium`.

And so I come here, and I'm not sure how to move forward.

Is this a bug in bindgen not computing the alignment setup properly? Should I just blacklist the type from being generated? Something else?

@emilio
Copy link
Contributor

emilio commented May 2, 2019

What's the C code for those? Looks like they come from some windows headers... This needs rust compiler work, otherwise there isn't going to be a sane way of getting this right. rust-lang/rust#59154 tracks that.

This is basically #1538 (so closing as a dupe of that). Depending on use-case, workaround can be either flag that struct as opaque (with opaque_type) or blacklist it if it's not used at all.

@emilio emilio closed this as completed May 2, 2019
@Wenzel
Copy link

Wenzel commented Jul 31, 2019

Hi, I had the same issue compiling windows.h.
If I compile my hyper-v-sys crate without function whitelisting, it fails with this error:
error_bindgen

I can show the generated bindings also, but I guess it's an issue with the Rust compiler, as you said.

Thanks.

@ales-tsurko
Copy link

ales-tsurko commented Jul 14, 2020

For those, who face this issue, here is the list of the blacklisted types and functions, which worked for me:

...
            .blacklist_type("LPMONITORINFOEXA?W?")
            .blacklist_type("LPTOP_LEVEL_EXCEPTION_FILTER")
            .blacklist_type("MONITORINFOEXA?W?")
            .blacklist_type("PEXCEPTION_FILTER")
            .blacklist_type("PEXCEPTION_ROUTINE")
            .blacklist_type("PSLIST_HEADER")
            .blacklist_type("PTOP_LEVEL_EXCEPTION_FILTER")
            .blacklist_type("PVECTORED_EXCEPTION_HANDLER")
            .blacklist_type("_?L?P?CONTEXT")
            .blacklist_type("_?L?P?EXCEPTION_POINTERS")
            .blacklist_type("_?P?DISPATCHER_CONTEXT")
            .blacklist_type("_?P?EXCEPTION_REGISTRATION_RECORD")
            .blacklist_type("_?P?IMAGE_TLS_DIRECTORY.*")
            .blacklist_type("_?P?NT_TIB")
            .blacklist_type("tagMONITORINFOEXA")
            .blacklist_type("tagMONITORINFOEXW")
            .blacklist_function("AddVectoredContinueHandler")
            .blacklist_function("AddVectoredExceptionHandler")
            .blacklist_function("CopyContext")
            .blacklist_function("GetThreadContext")
            .blacklist_function("GetXStateFeaturesMask")
            .blacklist_function("InitializeContext")
            .blacklist_function("InitializeContext2")
            .blacklist_function("InitializeSListHead")
            .blacklist_function("InterlockedFlushSList")
            .blacklist_function("InterlockedPopEntrySList")
            .blacklist_function("InterlockedPushEntrySList")
            .blacklist_function("InterlockedPushListSListEx")
            .blacklist_function("LocateXStateFeature")
            .blacklist_function("QueryDepthSList")
            .blacklist_function("RaiseFailFastException")
            .blacklist_function("RtlCaptureContext")
            .blacklist_function("RtlCaptureContext2")
            .blacklist_function("RtlFirstEntrySList")
            .blacklist_function("RtlInitializeSListHead")
            .blacklist_function("RtlInterlockedFlushSList")
            .blacklist_function("RtlInterlockedPopEntrySList")
            .blacklist_function("RtlInterlockedPushEntrySList")
            .blacklist_function("RtlInterlockedPushListSListEx")
            .blacklist_function("RtlQueryDepthSList")
            .blacklist_function("RtlRestoreContext")
            .blacklist_function("RtlUnwindEx")
            .blacklist_function("RtlVirtualUnwind")
            .blacklist_function("SetThreadContext")
            .blacklist_function("SetUnhandledExceptionFilter")
            .blacklist_function("SetXStateFeaturesMask")
            .blacklist_function("UnhandledExceptionFilter")
            .blacklist_function("__C_specific_handler")
...

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants