From c5afc65491bd35fe2d69d51b4ded83b1b814bb78 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Tue, 15 Jul 2025 14:32:13 +0200 Subject: [PATCH] Rust: run codegen again --- rust/extractor/src/generated/.generated.list | 2 +- rust/extractor/src/generated/top.rs | 161 ++++++++++-------- rust/extractor/src/translate/generated.rs | 1 + rust/ql/.generated.list | 12 +- rust/ql/lib/codeql/rust/elements/AsmExpr.qll | 1 + .../elements/internal/generated/AsmExpr.qll | 3 +- .../internal/generated/ParentChild.qll | 51 +++--- .../rust/elements/internal/generated/Raw.qll | 58 +++---- .../elements/internal/generated/Synth.qll | 8 +- rust/ql/lib/rust.dbscheme | 51 +++--- .../generated/AsmExpr/AsmExpr.ql | 14 ++ rust/schema/ast.py | 2 +- 12 files changed, 209 insertions(+), 155 deletions(-) diff --git a/rust/extractor/src/generated/.generated.list b/rust/extractor/src/generated/.generated.list index 4dcfb5380e1..832ebc8a834 100644 --- a/rust/extractor/src/generated/.generated.list +++ b/rust/extractor/src/generated/.generated.list @@ -1,2 +1,2 @@ mod.rs 4bcb9def847469aae9d8649461546b7c21ec97cf6e63d3cf394e339915ce65d7 4bcb9def847469aae9d8649461546b7c21ec97cf6e63d3cf394e339915ce65d7 -top.rs 409eb2e5fb18cb360a7d255fc2d7926a78bcd2d3c9f8dcdfce0419cea49d1489 409eb2e5fb18cb360a7d255fc2d7926a78bcd2d3c9f8dcdfce0419cea49d1489 +top.rs 0fc473b83d7cd550396b5c147829487fa7264121b6823fd371b78f55e48935b0 0fc473b83d7cd550396b5c147829487fa7264121b6823fd371b78f55e48935b0 diff --git a/rust/extractor/src/generated/top.rs b/rust/extractor/src/generated/top.rs index 278f4e59ab9..0b658d2aebb 100644 --- a/rust/extractor/src/generated/top.rs +++ b/rust/extractor/src/generated/top.rs @@ -3615,73 +3615,6 @@ impl From> for trap::Label { } } -#[derive(Debug)] -pub struct AsmExpr { - pub id: trap::TrapId, - pub asm_pieces: Vec>, - pub attrs: Vec>, - pub template: Vec>, -} - -impl trap::TrapEntry for AsmExpr { - fn extract_id(&mut self) -> trap::TrapId { - std::mem::replace(&mut self.id, trap::TrapId::Star) - } - - fn emit(self, id: trap::Label, out: &mut trap::Writer) { - out.add_tuple("asm_exprs", vec![id.into()]); - for (i, v) in self.asm_pieces.into_iter().enumerate() { - out.add_tuple("asm_expr_asm_pieces", vec![id.into(), i.into(), v.into()]); - } - for (i, v) in self.attrs.into_iter().enumerate() { - out.add_tuple("asm_expr_attrs", vec![id.into(), i.into(), v.into()]); - } - for (i, v) in self.template.into_iter().enumerate() { - out.add_tuple("asm_expr_templates", vec![id.into(), i.into(), v.into()]); - } - } -} - -impl trap::TrapClass for AsmExpr { - fn class_name() -> &'static str { "AsmExpr" } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme AsmExpr is a subclass of Expr - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme AsmExpr is a subclass of AstNode - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme AsmExpr is a subclass of Locatable - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme AsmExpr is a subclass of Element - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - #[derive(Debug)] pub struct AsmLabel { pub id: trap::TrapId, @@ -8831,6 +8764,100 @@ impl From> for trap::Label { } } +#[derive(Debug)] +pub struct AsmExpr { + pub id: trap::TrapId, + pub asm_pieces: Vec>, + pub attrs: Vec>, + pub template: Vec>, +} + +impl trap::TrapEntry for AsmExpr { + fn extract_id(&mut self) -> trap::TrapId { + std::mem::replace(&mut self.id, trap::TrapId::Star) + } + + fn emit(self, id: trap::Label, out: &mut trap::Writer) { + out.add_tuple("asm_exprs", vec![id.into()]); + for (i, v) in self.asm_pieces.into_iter().enumerate() { + out.add_tuple("asm_expr_asm_pieces", vec![id.into(), i.into(), v.into()]); + } + for (i, v) in self.attrs.into_iter().enumerate() { + out.add_tuple("asm_expr_attrs", vec![id.into(), i.into(), v.into()]); + } + for (i, v) in self.template.into_iter().enumerate() { + out.add_tuple("asm_expr_templates", vec![id.into(), i.into(), v.into()]); + } + } +} + +impl trap::TrapClass for AsmExpr { + fn class_name() -> &'static str { "AsmExpr" } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme AsmExpr is a subclass of Expr + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme AsmExpr is a subclass of AstNode + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme AsmExpr is a subclass of Locatable + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme AsmExpr is a subclass of Element + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme AsmExpr is a subclass of Item + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme AsmExpr is a subclass of Stmt + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme AsmExpr is a subclass of Addressable + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + #[derive(Debug)] pub struct AssocItem { _unused: () diff --git a/rust/extractor/src/translate/generated.rs b/rust/extractor/src/translate/generated.rs index 787ce71bf2a..3b9be2e1915 100644 --- a/rust/extractor/src/translate/generated.rs +++ b/rust/extractor/src/translate/generated.rs @@ -212,6 +212,7 @@ impl Translator<'_> { return Some(label); } let label = match node { + ast::Item::AsmExpr(inner) => self.emit_asm_expr(inner).map(Into::into), ast::Item::Const(inner) => self.emit_const(inner).map(Into::into), ast::Item::Enum(inner) => self.emit_enum(inner).map(Into::into), ast::Item::ExternBlock(inner) => self.emit_extern_block(inner).map(Into::into), diff --git a/rust/ql/.generated.list b/rust/ql/.generated.list index 1d2b69ce32e..4cf3e6ab073 100644 --- a/rust/ql/.generated.list +++ b/rust/ql/.generated.list @@ -10,7 +10,7 @@ lib/codeql/rust/elements/ArrayTypeRepr.qll a3e61c99567893aa26c610165696e54d11c16 lib/codeql/rust/elements/AsmClobberAbi.qll eb5628916f41ab47e333b4528fba3fb80caecd2805fb20ba4f5c8d59c9677f14 636fce6b3a7f04141d0d3a53734d08a188a45bcc04f755bb66746d4f0a13fa72 lib/codeql/rust/elements/AsmConst.qll f408468624dd0c80c6dcf62d17e65a94cd477a5a760be1b5fdd07c8189a3b4ea e4159073b3ee6d247e8962ce925da55ea39ee2cd1649f8b785a92aea17dbf144 lib/codeql/rust/elements/AsmDirSpec.qll 0c439c031c9f60596373aee8ae2ee70068582548ae365a3c7c19c8b5e2b030d2 0127b08b99bd8725cb6273c1a930aef4434897f23611cfc4ec2dd1b7c9d7e3d0 -lib/codeql/rust/elements/AsmExpr.qll 33a9a873ba05235dd80103ed22555eee220a4c0cb86605d0f76bcda316605449 c8a99b7bd55aac41e56d05cd5a52692f1d835ed3e1a1bd029bb41d8e2b81b240 +lib/codeql/rust/elements/AsmExpr.qll 0a477c401583a778ea6736070eaf8959f9312135e863e45fafb6c160da2e8f1b 0447b2438c694f9e9bd2629abb66281724d27b17e534fa8e9a19b2ea30af18d2 lib/codeql/rust/elements/AsmLabel.qll 5fa3401c49329ddc845bd95d5f498a455202f685e962dfec9bc91550577da800 f54fe1dcd3c76f36e6abc7b56dc5d6f5b1c30d0fb434db21dd8a1ce731fc6abf lib/codeql/rust/elements/AsmOperand.qll 3987a289233fe09f41f20b27939655cc72fa46847969a55cca6d6393f906969a 8810ff2a64f29d1441a449f5fd74bdc1107782172c7a21baaeb48a40930b7d5a lib/codeql/rust/elements/AsmOperandExpr.qll 72d4455cf742dc977b0a33ea21539422aaf2263f36c6f4420ddcb360ac606a0a 03bd01e81b291c915deb20ce33d5bdf73a709fbc007ab7570490e9a8e7c8604c @@ -469,7 +469,7 @@ lib/codeql/rust/elements/internal/generated/ArrayTypeRepr.qll d1db33bc2c13e5bc6f lib/codeql/rust/elements/internal/generated/AsmClobberAbi.qll 579cabafcf0387a9270112ffa53c0b542c1bfbbebfe5c916ac2e6a9b2453539a 8048f5d8759425c55dc46d8fe502687edc29209e290094e9bcd24ff943c8d801 lib/codeql/rust/elements/internal/generated/AsmConst.qll 26c96fc41f2b517b7756fd602c8b0cd4849c7090013fb3f8a5e290e5eabe80cc f0f1bf3e8ae7e20e1c2ab638428190c58ee242a7d15c480ed9c5f789ce42c9cb lib/codeql/rust/elements/internal/generated/AsmDirSpec.qll 4064e9c98aeebfebf29d013f6280f44548996d6f185b19bf96b1b23384c976b9 2bb0b99d20c0fdd6d54d4a1947a02372b6e4b197fb887ad058290ae97f015953 -lib/codeql/rust/elements/internal/generated/AsmExpr.qll 35df35b391d8bf7ccc53b5ffb1b700984bf423cafc89003cb6e3abd92791a127 0fff4199625c179ab4117cfa9762390a259ea0cba902713efc0f5eb200746b99 +lib/codeql/rust/elements/internal/generated/AsmExpr.qll afabf734bf93040451cb22d22f71ab9b2abb176bd6e0d862f5cc67d687f84e4c 7e35b3bc93b5e6f6b7259f3261234421eb5778a47192bc0f5e54d062d3bc8dde lib/codeql/rust/elements/internal/generated/AsmLabel.qll 3e97e64f0682709f05464218e0182f64537e08079b0f276738c83eae92c22d25 3ce70364762bc8c0eeb13940406a0613a815a0ae68b24f7e3a1a649a6fe05c89 lib/codeql/rust/elements/internal/generated/AsmOperand.qll a18ddb65ba0de6b61fb73e6a39398a127ccd4180b12fea43398e1e8f3e829ecd 22d2162566bcf18e8bb39eac9c1de0ae563013767ef5efebff6d844cb4038cae lib/codeql/rust/elements/internal/generated/AsmOperandExpr.qll 6ec1db45e8523331d516263476bbda1006251ce137c2cd324d9b6c6fabf358df b6278d4e605fb5422ab1e563649da793bacf28cd587328f9cc36ca57799510d0 @@ -578,7 +578,7 @@ lib/codeql/rust/elements/internal/generated/ParamList.qll eaa0cd4402d3665013d47e lib/codeql/rust/elements/internal/generated/ParenExpr.qll 812d2ff65079277f39f15c084657a955a960a7c1c0e96dd60472a58d56b945eb eb8c607f43e1fcbb41f37a10de203a1db806690e10ff4f04d48ed874189cb0eb lib/codeql/rust/elements/internal/generated/ParenPat.qll 24f9dc7fce75827d6fddb856cd48f80168143151b27295c0bab6db5a06567a09 ebadbc6f5498e9ed754b39893ce0763840409a0721036a25b56e1ead7dcc09aa lib/codeql/rust/elements/internal/generated/ParenTypeRepr.qll 03f5c5b96a37adeb845352d7fcea3e098da9050e534972d14ac0f70d60a2d776 ed3d6e5d02086523087adebce4e89e35461eb95f2a66d1d4100fe23fc691b126 -lib/codeql/rust/elements/internal/generated/ParentChild.qll 3657258593982c34cb5934cf51fe21a0749af3161890b43c20f2b327d89ecf77 83509d01d5735e297057327be7fbb837a4633604cf6641ba34bb4825798187da +lib/codeql/rust/elements/internal/generated/ParentChild.qll c7958f4e110f4afb810b06946309bf766305cc4d92c92695ae8f06b3f321ddcd 8150b0550b639cffc7c989c32fc3951fad32ec82ad838f359527a473bdb95a3f lib/codeql/rust/elements/internal/generated/ParenthesizedArgList.qll d901fdc8142a5b8847cc98fc2afcfd16428b8ace4fbffb457e761b5fd3901a77 5dbb0aea5a13f937da666ccb042494af8f11e776ade1459d16b70a4dd193f9fb lib/codeql/rust/elements/internal/generated/Pat.qll 3605ac062be2f294ee73336e9669027b8b655f4ad55660e1eab35266275154ee 7f9400db2884d336dd1d21df2a8093759c2a110be9bf6482ce8e80ae0fd74ed4 lib/codeql/rust/elements/internal/generated/Path.qll 9b12afb46fc5a9ad3a811b05472621bbecccb900c47504feb7f29d96b28421ca bcacbffc36fb3e0c9b26523b5963af0ffa9fd6b19f00a2a31bdb2316071546bd @@ -593,7 +593,7 @@ lib/codeql/rust/elements/internal/generated/PtrTypeRepr.qll 8d0ea4f6c7f8203340bf lib/codeql/rust/elements/internal/generated/PureSynthConstructors.qll e5b8e69519012bbaae29dcb82d53f7f7ecce368c0358ec27ef6180b228a0057f e5b8e69519012bbaae29dcb82d53f7f7ecce368c0358ec27ef6180b228a0057f lib/codeql/rust/elements/internal/generated/RangeExpr.qll 23cca03bf43535f33b22a38894f70d669787be4e4f5b8fe5c8f7b964d30e9027 18624cef6c6b679eeace2a98737e472432e0ead354cca02192b4d45330f047c9 lib/codeql/rust/elements/internal/generated/RangePat.qll 80826a6a6868a803aa2372e31c52a03e1811a3f1f2abdb469f91ca0bfdd9ecb6 34ee1e208c1690cba505dff2c588837c0cd91e185e2a87d1fe673191962276a9 -lib/codeql/rust/elements/internal/generated/Raw.qll f5b37458fb9c16829da761323deab22b440c3cb5bf915e07ee3eb2315251020e 0198c8d6ac310f107e4685f6dc0bd2eb58800af41ab4ac4c15c42d8d575f4b0a +lib/codeql/rust/elements/internal/generated/Raw.qll 7448186873413f4aa7762c990c1c699e3a379280f0260bc76524386aefe567f1 07acbe3eabaa87147757989e8616046fff218669677e7d3d6465fbda639519e1 lib/codeql/rust/elements/internal/generated/RefExpr.qll 7d995884e3dc1c25fc719f5d7253179344d63650e217e9ff6530285fe7a57f64 f2c3c12551deea4964b66553fb9b6423ee16fec53bd63db4796191aa60dc6c66 lib/codeql/rust/elements/internal/generated/RefPat.qll 456ede39837463ee22a630ec7ab6c8630d3664a8ea206fcc6e4f199e92fa564c 5622062765f32930465ba6b170e986706f159f6070f48adee3c20e24e8df4e05 lib/codeql/rust/elements/internal/generated/RefTypeRepr.qll 5b0663a6d234572fb3e467e276d019415caa95ef006438cc59b7af4e1783161e 0e27c8a8f0e323c0e4d6db01fca821bf07c0864d293cdf96fa891b10820c1e4b @@ -619,7 +619,7 @@ lib/codeql/rust/elements/internal/generated/StructFieldList.qll 5da528a51a6a5db9 lib/codeql/rust/elements/internal/generated/StructPat.qll c76fa005c2fd0448a8803233e1e8818c4123301eb66ac5cf69d0b9eaafc61e98 6e0dffccdce24bca20e87d5ba0f0995c9a1ae8983283e71e7dbfcf6fffc67a58 lib/codeql/rust/elements/internal/generated/StructPatField.qll 5b5c7302dbc4a902ca8e69ff31875c867e295a16a626ba3cef29cd0aa248f179 4e192a0df79947f5cb0d47fdbbba7986137a6a40a1be92ae119873e2fad67edf lib/codeql/rust/elements/internal/generated/StructPatFieldList.qll 1a95a1bd9f64fb18e9571657cf2d02a8b13c747048a1f0f74baf31b91f0392ad fc274e414ff4ed54386046505920de92755ad0b4d39a7523cdffa4830bd53b37 -lib/codeql/rust/elements/internal/generated/Synth.qll 4390996606c436cb34201d7dba9821a0d775d1707e54fbbe24cbf788d1d1d948 8e8077a387c69f7f5e3bdb2754654625c233283eb39eab33a72bde536f139a16 +lib/codeql/rust/elements/internal/generated/Synth.qll 39bd329c2efef8691106070107356da0c336d10cb395aa2129ceb6108db27357 5369b56fe14c1961b38af4288b512dfaf09fc4264efced468af5fc6da403ac04 lib/codeql/rust/elements/internal/generated/SynthConstructors.qll bcc7f617b775ac0c7f04b1cc333ed7cc0bd91f1fabc8baa03c824d1df03f6076 bcc7f617b775ac0c7f04b1cc333ed7cc0bd91f1fabc8baa03c824d1df03f6076 lib/codeql/rust/elements/internal/generated/Token.qll 77a91a25ca5669703cf3a4353b591cef4d72caa6b0b9db07bb9e005d69c848d1 2fdffc4882ed3a6ca9ac6d1fb5f1ac5a471ca703e2ffdc642885fa558d6e373b lib/codeql/rust/elements/internal/generated/TokenTree.qll 1a3c4f5f30659738641abdd28cb793dab3cfde484196b59656fc0a2767e53511 de2ebb210c7759ef7a6f7ee9f805e1cac879221287281775fc80ba34a5492edf @@ -665,7 +665,7 @@ test/extractor-tests/generated/ArrayTypeRepr/ArrayTypeRepr.ql b262300235ab5bf4fe test/extractor-tests/generated/AsmClobberAbi/AsmClobberAbi.ql adfcfcdc6ac2a9a4849ea592e37da4221b6279cf2ea1112d32b6c89fda33e85e 7438490536e27b7173dec731f6925531a0e3fa839639c97a53905ba72d7efbe5 test/extractor-tests/generated/AsmConst/AsmConst.ql 82f322fc8a01f4ccc86b3ecca86a9515313120764c6a3ac00b968e4441625422 62831f204c5c2d0f155152c661f9b5d4a4b685df6e40693106fbef0379378981 test/extractor-tests/generated/AsmDirSpec/AsmDirSpec.ql 518a739c91481f67b27bfd1989d9dcbada12de54901eb6d598c896cd72f1f5fe 4567661eecf475fb05e13749b9250bcec51056b6db5a6ae7df24b7ba5cfb88c2 -test/extractor-tests/generated/AsmExpr/AsmExpr.ql c6c0128b252a13d5acea9a07b3854625aa51ebcce9dd93c11b423c9929d441fb 7618977e43f202af5b7d21b67531c4795bb791abe3cb03ba4077913c430b31d5 +test/extractor-tests/generated/AsmExpr/AsmExpr.ql 2ecffe80979c6b49ec84466c913ef6424e0b1f61cf8a8d6f68ac24744a08eb0e 0bd5ee2a93d75c4daa1698613b5d5a462341d53b99e3da8af81ad51fa15a7f7e test/extractor-tests/generated/AsmLabel/AsmLabel.ql 130bf49dc1f5ae79e3588415b9a4c25dfdcbcac1884db9b2fb802a68e33180e5 c087e47d8953d312488fcc0b1bcbfca02521e3683e2063eaf380d76399bca037 test/extractor-tests/generated/AsmOperandExpr/AsmOperandExpr.ql e866fd4715e78511352bb286c1120cbd52c4d960664d57dd99f0380eb1db7109 081d6a6267a3e251a123099b4c1e7d3c5a3b56e0efe9db7c7db24db1c08b7e0d test/extractor-tests/generated/AsmOperandNamed/AsmOperandNamed.ql fb1eb1f275ad251ba2e0876cf1d097bb33f20d06b0e50f8c01f7c11c71057688 e308567ffd18671cf172853a5c594f0f211d492c7e2fb58be412703d1b342b41 diff --git a/rust/ql/lib/codeql/rust/elements/AsmExpr.qll b/rust/ql/lib/codeql/rust/elements/AsmExpr.qll index 06cee086b3f..a4b588ff985 100644 --- a/rust/ql/lib/codeql/rust/elements/AsmExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/AsmExpr.qll @@ -7,6 +7,7 @@ private import internal.AsmExprImpl import codeql.rust.elements.AsmPiece import codeql.rust.elements.Attr import codeql.rust.elements.Expr +import codeql.rust.elements.Item /** * An inline assembly expression. For example: diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/AsmExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/AsmExpr.qll index 83f756a4c98..95e4d08aa40 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/AsmExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/AsmExpr.qll @@ -10,6 +10,7 @@ import codeql.rust.elements.AsmPiece import codeql.rust.elements.Attr import codeql.rust.elements.Expr import codeql.rust.elements.internal.ExprImpl::Impl as ExprImpl +import codeql.rust.elements.internal.ItemImpl::Impl as ItemImpl /** * INTERNAL: This module contains the fully generated definition of `AsmExpr` and should not @@ -27,7 +28,7 @@ module Generated { * INTERNAL: Do not reference the `Generated::AsmExpr` class directly. * Use the subclass `AsmExpr`, where the following predicates are available. */ - class AsmExpr extends Synth::TAsmExpr, ExprImpl::Expr { + class AsmExpr extends Synth::TAsmExpr, ExprImpl::Expr, ItemImpl::Item { override string getAPrimaryQlClass() { result = "AsmExpr" } /** diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ParentChild.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ParentChild.qll index e2aa343f65d..d0b9c397a77 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ParentChild.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ParentChild.qll @@ -863,27 +863,6 @@ private module Impl { ) } - private Element getImmediateChildOfAsmExpr(AsmExpr e, int index, string partialPredicateCall) { - exists(int n, int nAsmPiece, int nAttr, int nTemplate | - n = 0 and - nAsmPiece = n + 1 + max(int i | i = -1 or exists(e.getAsmPiece(i)) | i) and - nAttr = nAsmPiece + 1 + max(int i | i = -1 or exists(e.getAttr(i)) | i) and - nTemplate = nAttr + 1 + max(int i | i = -1 or exists(e.getTemplate(i)) | i) and - ( - none() - or - result = e.getAsmPiece(index - n) and - partialPredicateCall = "AsmPiece(" + (index - n).toString() + ")" - or - result = e.getAttr(index - nAsmPiece) and - partialPredicateCall = "Attr(" + (index - nAsmPiece).toString() + ")" - or - result = e.getTemplate(index - nAttr) and - partialPredicateCall = "Template(" + (index - nAttr).toString() + ")" - ) - ) - } - private Element getImmediateChildOfAsmLabel(AsmLabel e, int index, string partialPredicateCall) { exists(int n, int nBlockExpr | n = 0 and @@ -2147,6 +2126,32 @@ private module Impl { ) } + private Element getImmediateChildOfAsmExpr(AsmExpr e, int index, string partialPredicateCall) { + exists(int n, int nAttributeMacroExpansion, int nAsmPiece, int nAttr, int nTemplate | + n = 0 and + nAttributeMacroExpansion = n + 1 and + nAsmPiece = nAttributeMacroExpansion + 1 + max(int i | i = -1 or exists(e.getAsmPiece(i)) | i) and + nAttr = nAsmPiece + 1 + max(int i | i = -1 or exists(e.getAttr(i)) | i) and + nTemplate = nAttr + 1 + max(int i | i = -1 or exists(e.getTemplate(i)) | i) and + ( + none() + or + index = n and + result = e.getAttributeMacroExpansion() and + partialPredicateCall = "AttributeMacroExpansion()" + or + result = e.getAsmPiece(index - nAttributeMacroExpansion) and + partialPredicateCall = "AsmPiece(" + (index - nAttributeMacroExpansion).toString() + ")" + or + result = e.getAttr(index - nAsmPiece) and + partialPredicateCall = "Attr(" + (index - nAsmPiece).toString() + ")" + or + result = e.getTemplate(index - nAttr) and + partialPredicateCall = "Template(" + (index - nAttr).toString() + ")" + ) + ) + } + private Element getImmediateChildOfBlockExpr(BlockExpr e, int index, string partialPredicateCall) { exists(int n, int nLabel, int nAttr, int nStmtList | n = 0 and @@ -3153,8 +3158,6 @@ private module Impl { or result = getImmediateChildOfAsmConst(e, index, partialAccessor) or - result = getImmediateChildOfAsmExpr(e, index, partialAccessor) - or result = getImmediateChildOfAsmLabel(e, index, partialAccessor) or result = getImmediateChildOfAsmOperandNamed(e, index, partialAccessor) @@ -3309,6 +3312,8 @@ private module Impl { or result = getImmediateChildOfArrayRepeatExpr(e, index, partialAccessor) or + result = getImmediateChildOfAsmExpr(e, index, partialAccessor) + or result = getImmediateChildOfBlockExpr(e, index, partialAccessor) or result = getImmediateChildOfCallExpr(e, index, partialAccessor) diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll index a8e526e5263..38798573712 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll @@ -1521,35 +1521,6 @@ module Raw { predicate isConst() { asm_const_is_const(this) } } - /** - * INTERNAL: Do not use. - * An inline assembly expression. For example: - * ```rust - * unsafe { - * #[inline(always)] - * builtin # asm("cmp {0}, {1}", in(reg) a, in(reg) b); - * } - * ``` - */ - class AsmExpr extends @asm_expr, Expr { - override string toString() { result = "AsmExpr" } - - /** - * Gets the `index`th asm piece of this asm expression (0-based). - */ - AsmPiece getAsmPiece(int index) { asm_expr_asm_pieces(this, index, result) } - - /** - * Gets the `index`th attr of this asm expression (0-based). - */ - Attr getAttr(int index) { asm_expr_attrs(this, index, result) } - - /** - * Gets the `index`th template of this asm expression (0-based). - */ - Expr getTemplate(int index) { asm_expr_templates(this, index, result) } - } - /** * INTERNAL: Do not use. * A label in an inline assembly block. @@ -3592,6 +3563,35 @@ module Raw { } } + /** + * INTERNAL: Do not use. + * An inline assembly expression. For example: + * ```rust + * unsafe { + * #[inline(always)] + * builtin # asm("cmp {0}, {1}", in(reg) a, in(reg) b); + * } + * ``` + */ + class AsmExpr extends @asm_expr, Expr, Item { + override string toString() { result = "AsmExpr" } + + /** + * Gets the `index`th asm piece of this asm expression (0-based). + */ + AsmPiece getAsmPiece(int index) { asm_expr_asm_pieces(this, index, result) } + + /** + * Gets the `index`th attr of this asm expression (0-based). + */ + Attr getAttr(int index) { asm_expr_attrs(this, index, result) } + + /** + * Gets the `index`th template of this asm expression (0-based). + */ + Expr getTemplate(int index) { asm_expr_templates(this, index, result) } + } + /** * INTERNAL: Do not use. * An associated item in a `Trait` or `Impl`. diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Synth.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Synth.qll index 3d89d74b7e8..3c8b1e87f57 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Synth.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Synth.qll @@ -774,8 +774,8 @@ module Synth { * INTERNAL: Do not use. */ class TItem = - TAdt or TAssocItem or TExternBlock or TExternCrate or TExternItem or TImpl or TMacroDef or - TMacroRules or TModule or TTrait or TTraitAlias or TUse; + TAdt or TAsmExpr or TAssocItem or TExternBlock or TExternCrate or TExternItem or TImpl or + TMacroDef or TMacroRules or TModule or TTrait or TTraitAlias or TUse; /** * INTERNAL: Do not use. @@ -2219,6 +2219,8 @@ module Synth { TItem convertItemFromRaw(Raw::Element e) { result = convertAdtFromRaw(e) or + result = convertAsmExprFromRaw(e) + or result = convertAssocItemFromRaw(e) or result = convertExternBlockFromRaw(e) @@ -3803,6 +3805,8 @@ module Synth { Raw::Element convertItemToRaw(TItem e) { result = convertAdtToRaw(e) or + result = convertAsmExprToRaw(e) + or result = convertAssocItemToRaw(e) or result = convertExternBlockToRaw(e) diff --git a/rust/ql/lib/rust.dbscheme b/rust/ql/lib/rust.dbscheme index 319c933d961..4adb57ee525 100644 --- a/rust/ql/lib/rust.dbscheme +++ b/rust/ql/lib/rust.dbscheme @@ -1272,31 +1272,6 @@ asm_const_is_const( int id: @asm_const ref ); -asm_exprs( - unique int id: @asm_expr -); - -#keyset[id, index] -asm_expr_asm_pieces( - int id: @asm_expr ref, - int index: int ref, - int asm_piece: @asm_piece ref -); - -#keyset[id, index] -asm_expr_attrs( - int id: @asm_expr ref, - int index: int ref, - int attr: @attr ref -); - -#keyset[id, index] -asm_expr_templates( - int id: @asm_expr ref, - int index: int ref, - int template: @expr ref -); - asm_labels( unique int id: @asm_label ); @@ -1905,6 +1880,7 @@ infer_type_reprs( @item = @adt +| @asm_expr | @assoc_item | @extern_block | @extern_crate @@ -2709,6 +2685,31 @@ adt_derive_macro_expansions( int derive_macro_expansion: @macro_items ref ); +asm_exprs( + unique int id: @asm_expr +); + +#keyset[id, index] +asm_expr_asm_pieces( + int id: @asm_expr ref, + int index: int ref, + int asm_piece: @asm_piece ref +); + +#keyset[id, index] +asm_expr_attrs( + int id: @asm_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +asm_expr_templates( + int id: @asm_expr ref, + int index: int ref, + int template: @expr ref +); + @assoc_item = @const | @function diff --git a/rust/ql/test/extractor-tests/generated/AsmExpr/AsmExpr.ql b/rust/ql/test/extractor-tests/generated/AsmExpr/AsmExpr.ql index 11cc082dae0..bedbccdd1be 100644 --- a/rust/ql/test/extractor-tests/generated/AsmExpr/AsmExpr.ql +++ b/rust/ql/test/extractor-tests/generated/AsmExpr/AsmExpr.ql @@ -4,6 +4,20 @@ import TestUtils query predicate instances(AsmExpr x) { toBeTested(x) and not x.isUnknown() } +query predicate getExtendedCanonicalPath(AsmExpr x, string getExtendedCanonicalPath) { + toBeTested(x) and not x.isUnknown() and getExtendedCanonicalPath = x.getExtendedCanonicalPath() +} + +query predicate getCrateOrigin(AsmExpr x, string getCrateOrigin) { + toBeTested(x) and not x.isUnknown() and getCrateOrigin = x.getCrateOrigin() +} + +query predicate getAttributeMacroExpansion(AsmExpr x, MacroItems getAttributeMacroExpansion) { + toBeTested(x) and + not x.isUnknown() and + getAttributeMacroExpansion = x.getAttributeMacroExpansion() +} + query predicate getAsmPiece(AsmExpr x, int index, AsmPiece getAsmPiece) { toBeTested(x) and not x.isUnknown() and getAsmPiece = x.getAsmPiece(index) } diff --git a/rust/schema/ast.py b/rust/schema/ast.py index 137e56f8bac..d5b99753f11 100644 --- a/rust/schema/ast.py +++ b/rust/schema/ast.py @@ -69,7 +69,7 @@ class AsmConst(AsmOperand, ): class AsmDirSpec(AstNode, ): pass -class AsmExpr(Expr, ): +class AsmExpr(Expr, Item, ): asm_pieces: list["AsmPiece"] | child attrs: list["Attr"] | child template: list["Expr"] | child