From cd10f3ba0d83f34ca978cc4c7a552b72fdd068aa Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Tue, 28 Nov 2023 11:18:39 -0800 Subject: [PATCH 1/2] Flatten cursor.kind() matching in Item::parse down to one match --- bindgen/ir/item.rs | 84 ++++++++++++++++++++++------------------------ 1 file changed, 41 insertions(+), 43 deletions(-) diff --git bindgen/ir/item.rs bindgen/ir/item.rs index 0556452bfa..4f2d361e51 100644 --- third_party/rust/bindgen/ir/item.rs +++ third_party/rust/bindgen/ir/item.rs @@ -1427,53 +1427,52 @@ } } - // Guess how does clang treat extern "C" blocks? - if cursor.kind() == CXCursor_UnexposedDecl { - Err(ParseError::Recurse) - } else { + match cursor.kind() { + // Guess how does clang treat extern "C" blocks? + CXCursor_UnexposedDecl => Err(ParseError::Recurse), + // We allowlist cursors here known to be unhandled, to prevent being // too noisy about this. - match cursor.kind() { - CXCursor_MacroDefinition | - CXCursor_MacroExpansion | - CXCursor_UsingDeclaration | - CXCursor_UsingDirective | - CXCursor_StaticAssert | - CXCursor_FunctionTemplate => { - debug!( - "Unhandled cursor kind {:?}: {:?}", - cursor.kind(), - cursor - ); - } - CXCursor_InclusionDirective => { - let file = cursor.get_included_file_name(); - match file { - None => { - warn!( - "Inclusion of a nameless file in {:?}", - cursor - ); - } - Some(filename) => { - ctx.include_file(filename); - } - } - } - _ => { - // ignore toplevel operator overloads - let spelling = cursor.spelling(); - if !spelling.starts_with("operator") { + CXCursor_MacroDefinition | + CXCursor_MacroExpansion | + CXCursor_UsingDeclaration | + CXCursor_UsingDirective | + CXCursor_StaticAssert | + CXCursor_FunctionTemplate => { + debug!( + "Unhandled cursor kind {:?}: {:?}", + cursor.kind(), + cursor + ); + Err(ParseError::Continue) + } + CXCursor_InclusionDirective => { + let file = cursor.get_included_file_name(); + match file { + None => { warn!( - "Unhandled cursor kind {:?}: {:?}", - cursor.kind(), + "Inclusion of a nameless file in {:?}", cursor ); } + Some(filename) => { + ctx.include_file(filename); + } } + Err(ParseError::Continue) + } + _ => { + // ignore toplevel operator overloads + let spelling = cursor.spelling(); + if !spelling.starts_with("operator") { + warn!( + "Unhandled cursor kind {:?}: {:?}", + cursor.kind(), + cursor + ); + } + Err(ParseError::Continue) } - - Err(ParseError::Continue) } } From 2997017b5a3065b83e9d76f0080d6cb99c94c0c1 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Tue, 28 Nov 2023 11:21:18 -0800 Subject: [PATCH 2/2] Handle CXCursor_LinkageSpec in Clang 18+ --- bindgen/ir/item.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git bindgen/ir/item.rs bindgen/ir/item.rs index 4f2d361e51..dd587b088b 100644 --- third_party/rust/bindgen/ir/item.rs +++ third_party/rust/bindgen/ir/item.rs @@ -1433,8 +1433,11 @@ impl Item { } match cursor.kind() { - // Guess how does clang treat extern "C" blocks? - CXCursor_UnexposedDecl => Err(ParseError::Recurse), + // On Clang 18+, extern "C" is reported accurately as a LinkageSpec. + // Older LLVM treat it as UnexposedDecl. + CXCursor_LinkageSpec | CXCursor_UnexposedDecl => { + Err(ParseError::Recurse) + } // We allowlist cursors here known to be unhandled, to prevent being // too noisy about this. diff --git dom/media/gmp-plugin-openh264/gmp-fake-openh264.cpp dom/media/gmp-plugin-openh264/gmp-fake-openh264.cpp --- dom/media/gmp-plugin-openh264/gmp-fake-openh264.cpp +++ dom/media/gmp-plugin-openh264/gmp-fake-openh264.cpp @@ -97,11 +97,11 @@ uint32_t width_; uint32_t height_; uint8_t y_; uint8_t u_; uint8_t v_; - uint32_t timestamp_; + uint64_t timestamp_; } idr_nalu; }; #pragma pack(pop) #define ENCODED_FRAME_MAGIC 0x004000b8 diff --git dom/media/gtest/TestGMPRemoveAndDelete.cpp dom/media/gtest/TestGMPRemoveAndDelete.cpp --- dom/media/gtest/TestGMPRemoveAndDelete.cpp +++ dom/media/gtest/TestGMPRemoveAndDelete.cpp @@ -359,11 +359,11 @@ uint32_t width_; uint32_t height_; uint8_t y_; uint8_t u_; uint8_t v_; - uint32_t timestamp_; + uint64_t timestamp_; } idr_nalu; }; #pragma pack(pop) GMPVideoFrame* absFrame; diff --git dom/media/webrtc/libwebrtcglue/WebrtcGmpVideoCodec.h dom/media/webrtc/libwebrtcglue/WebrtcGmpVideoCodec.h --- dom/media/webrtc/libwebrtcglue/WebrtcGmpVideoCodec.h +++ dom/media/webrtc/libwebrtcglue/WebrtcGmpVideoCodec.h @@ -300,11 +300,11 @@ struct InputImageData { int64_t timestamp_us; }; // Map rtp time -> input image data - DataMutex> mInputImageMap; + DataMutex> mInputImageMap; MediaEventProducer mInitPluginEvent; MediaEventProducer mReleasePluginEvent; }; diff --git dom/media/webrtc/libwebrtcglue/WebrtcGmpVideoCodec.cpp dom/media/webrtc/libwebrtcglue/WebrtcGmpVideoCodec.cpp --- dom/media/webrtc/libwebrtcglue/WebrtcGmpVideoCodec.cpp +++ dom/media/webrtc/libwebrtcglue/WebrtcGmpVideoCodec.cpp @@ -538,11 +538,11 @@ return; } webrtc::VideoFrameType ft; GmpFrameTypeToWebrtcFrameType(aEncodedFrame->FrameType(), &ft); - uint32_t timestamp = (aEncodedFrame->TimeStamp() * 90ll + 999) / 1000; + uint64_t timestamp = (aEncodedFrame->TimeStamp() * 90ll + 999) / 1000; GMP_LOG_DEBUG("GMP Encoded: %" PRIu64 ", type %d, len %d", aEncodedFrame->TimeStamp(), aEncodedFrame->BufferType(), aEncodedFrame->Size());