From 2a2dbe1c4527793a82429142f05ef610380decf5 Mon Sep 17 00:00:00 2001 From: Ghaith Hachem Date: Tue, 6 Aug 2024 08:29:42 +0200 Subject: [PATCH 1/2] Inkwell update to 0.5 --- Cargo.lock | 1227 ++++++++--------- Cargo.toml | 5 +- compiler/plc_diagnostics/Cargo.toml | 3 +- compiler/plc_diagnostics/src/diagnostics.rs | 9 +- compiler/plc_driver/src/lib.rs | 5 +- src/builtins.rs | 46 +- src/codegen.rs | 12 +- src/codegen/diagnostics.rs | 38 + .../generators/expression_generator.rs | 507 ++++--- src/codegen/generators/llvm.rs | 40 +- src/codegen/generators/pou_generator.rs | 50 +- src/codegen/generators/statement_generator.rs | 199 +-- src/codegen/generators/variable_generator.rs | 2 +- src/codegen/llvm_typesystem.rs | 171 ++- src/index/visitor.rs | 1 + 15 files changed, 1294 insertions(+), 1021 deletions(-) create mode 100644 src/codegen/diagnostics.rs diff --git a/Cargo.lock b/Cargo.lock index 6d6370cf6c..c0b1bd976b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" dependencies = [ "gimli", ] @@ -33,24 +33,24 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] [[package]] name = "allocator-api2" -version = "0.2.16" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" [[package]] name = "ammonia" -version = "3.3.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e6d1c7838db705c9b756557ee27c384ce695a1c51a6fe528784cb1c6840170" +checksum = "1ab99eae5ee58501ab236beb6f20f6ca39be615267b014899c89b2f0bc18a459" dependencies = [ "html5ever", "maplit", @@ -76,47 +76,48 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.13" +version = "0.6.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" +checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", + "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.6" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" +checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" [[package]] name = "anstyle-parse" -version = "0.2.3" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.2" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" dependencies = [ "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.2" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" dependencies = [ "anstyle", "windows-sys 0.52.0", @@ -124,9 +125,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.80" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" [[package]] name = "async-channel" @@ -141,28 +142,26 @@ dependencies = [ [[package]] name = "async-channel" -version = "2.2.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28243a43d821d11341ab73c80bed182dc015c514b951616cf79bd4af39af0c3" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" dependencies = [ "concurrent-queue", - "event-listener 5.2.0", - "event-listener-strategy 0.5.0", + "event-listener-strategy", "futures-core", "pin-project-lite", ] [[package]] name = "async-executor" -version = "1.8.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ae5ebefcc48e7452b4987947920dac9450be1110cadf34d1b8c116bdbaf97c" +checksum = "d7ebdfa2ebdab6b1760375fa7d6f382b9f486eac35fc994625a00e89280bdbb7" dependencies = [ - "async-lock 3.3.0", "async-task", "concurrent-queue", - "fastrand 2.0.1", - "futures-lite 2.2.0", + "fastrand 2.1.0", + "futures-lite 2.3.0", "slab", ] @@ -172,12 +171,12 @@ version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" dependencies = [ - "async-channel 2.2.0", + "async-channel 2.3.1", "async-executor", - "async-io 2.3.1", - "async-lock 3.3.0", + "async-io 2.3.3", + "async-lock 3.4.0", "blocking", - "futures-lite 2.2.0", + "futures-lite 2.3.0", "once_cell", ] @@ -203,18 +202,18 @@ dependencies = [ [[package]] name = "async-io" -version = "2.3.1" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f97ab0c5b00a7cdbe5a371b9a782ee7be1316095885c8a4ea1daf490eb0ef65" +checksum = "0d6baa8f0178795da0e71bc42c9e5d13261aac7ee549853162e66a241ba17964" dependencies = [ - "async-lock 3.3.0", + "async-lock 3.4.0", "cfg-if", "concurrent-queue", "futures-io", - "futures-lite 2.2.0", + "futures-lite 2.3.0", "parking", - "polling 3.5.0", - "rustix 0.38.31", + "polling 3.7.2", + "rustix 0.38.34", "slab", "tracing", "windows-sys 0.52.0", @@ -231,12 +230,12 @@ dependencies = [ [[package]] name = "async-lock" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" dependencies = [ - "event-listener 4.0.3", - "event-listener-strategy 0.4.0", + "event-listener 5.3.1", + "event-listener-strategy", "pin-project-lite", ] @@ -268,9 +267,9 @@ dependencies = [ [[package]] name = "async-task" -version = "4.7.0" +version = "4.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "atoi" @@ -287,16 +286,6 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" -[[package]] -name = "atomic-write-file" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8204db279bf648d64fe845bd8840f78b39c8132ed4d6a4194c3b10d4b4cfb0b" -dependencies = [ - "nix", - "rand", -] - [[package]] name = "atty" version = "0.2.14" @@ -310,15 +299,15 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.1.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" dependencies = [ "addr2line", "cc", @@ -370,9 +359,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.2" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" dependencies = [ "serde", ] @@ -388,25 +377,22 @@ dependencies = [ [[package]] name = "blocking" -version = "1.5.1" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" dependencies = [ - "async-channel 2.2.0", - "async-lock 3.3.0", + "async-channel 2.3.1", "async-task", - "fastrand 2.0.1", "futures-io", - "futures-lite 2.2.0", + "futures-lite 2.3.0", "piper", - "tracing", ] [[package]] name = "bstr" -version = "1.9.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05efc5cfd9110c8416e471df0e96702d58690178e206e61b7173706673c93706" +checksum = "40723b8fb387abc38f4f4a37c09073622e41dd12327033091ef8950659e6dc0c" dependencies = [ "memchr", "regex-automata", @@ -415,15 +401,15 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.15.4" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytecount" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1e5f035d16fc623ae5f74981db80a439803888314e3a555fd6f04acd51a3205" +checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce" [[package]] name = "byteorder" @@ -433,15 +419,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.5.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" [[package]] name = "cc" -version = "1.0.90" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" +checksum = "26a5c3fd7bfa1ce3897a3a3501d362b2d87b7f2583ebcb4a949ec25911025cbc" [[package]] name = "cfg-if" @@ -449,24 +435,18 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "cfg_aliases" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" - [[package]] name = "chrono" -version = "0.4.35" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf5903dcbc0a39312feb77df2ff4c76387d591b9fc7b04a238dcf8bb62639a" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "wasm-bindgen", - "windows-targets 0.52.4", + "windows-targets 0.52.6", ] [[package]] @@ -488,34 +468,34 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.4" +version = "4.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" +checksum = "0fbb260a053428790f3de475e304ff84cdbc4face759ea7a3e64c1edd938a7fc" dependencies = [ "clap_builder", - "clap_derive 4.5.4", + "clap_derive 4.5.13", ] [[package]] name = "clap_builder" -version = "4.5.2" +version = "4.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" +checksum = "64b17d7ea74e9f833c7dbf2cbe4fb12ff26783eda4782a8975b72f895c9b4d99" dependencies = [ "anstream", "anstyle", - "clap_lex 0.7.0", - "strsim 0.11.0", + "clap_lex 0.7.2", + "strsim 0.11.1", "terminal_size", ] [[package]] name = "clap_complete" -version = "4.5.1" +version = "4.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "885e4d7d5af40bfb99ae6f9433e292feac98d452dcb3ec3d25dfe7552b77da8c" +checksum = "a8670053e87c316345e384ca1f3eba3006fc6355ed8b8a1140d104e109e3df34" dependencies = [ - "clap 4.5.4", + "clap 4.5.13", ] [[package]] @@ -526,21 +506,21 @@ checksum = "ae6371b8bdc8b7d3959e9cf7b22d4435ef3e79e138688421ec654acf8c81b008" dependencies = [ "heck 0.4.1", "proc-macro-error", - "proc-macro2 1.0.78", - "quote 1.0.35", + "proc-macro2 1.0.86", + "quote 1.0.36", "syn 1.0.109", ] [[package]] name = "clap_derive" -version = "4.5.4" +version = "4.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" +checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0" dependencies = [ "heck 0.5.0", - "proc-macro2 1.0.78", - "quote 1.0.35", - "syn 2.0.52", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.72", ] [[package]] @@ -554,9 +534,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" [[package]] name = "codespan-reporting" @@ -570,15 +550,15 @@ dependencies = [ [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" [[package]] name = "concurrent-queue" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" dependencies = [ "crossbeam-utils", ] @@ -628,9 +608,9 @@ dependencies = [ [[package]] name = "crc" -version = "3.0.1" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe" +checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" dependencies = [ "crc-catalog", ] @@ -643,9 +623,9 @@ checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] name = "crossbeam-channel" -version = "0.5.12" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" dependencies = [ "crossbeam-utils", ] @@ -680,9 +660,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "crypto-common" @@ -695,29 +675,27 @@ dependencies = [ ] [[package]] -name = "dashmap" -version = "5.5.3" +name = "data-encoding" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" -dependencies = [ - "cfg-if", - "hashbrown 0.14.3", - "lock_api", - "once_cell", - "parking_lot_core", -] +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" [[package]] -name = "data-encoding" -version = "2.5.0" +name = "dbus" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" +checksum = "1bb21987b9fb1613058ba3843121dd18b163b254d8a6e797e144cbac14d96d1b" +dependencies = [ + "libc", + "libdbus-sys", + "winapi", +] [[package]] name = "der" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" dependencies = [ "const-oid", "pem-rfc7468", @@ -759,9 +737,9 @@ checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" [[package]] name = "either" -version = "1.10.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" dependencies = [ "serde", ] @@ -786,9 +764,9 @@ checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" [[package]] name = "encoding_rs" -version = "0.8.33" +version = "0.8.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" dependencies = [ "cfg-if", ] @@ -804,9 +782,9 @@ dependencies = [ [[package]] name = "env_filter" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a009aa4810eb158359dda09d0c87378e4bbb89b5a801f016885a4707ba24f7ea" +checksum = "4f2c92ceda6ceec50f43169f9ee8424fe2db276791afde7b2cd8bc084cb376ab" dependencies = [ "log", "regex", @@ -827,9 +805,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.3" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b35839ba51819680ba087cd351788c9a3c476841207e0b8cee0b04722343b9" +checksum = "e13fa619b91fb2381732789fc5de83b45675e882f66623b7d8cb4f643017018d" dependencies = [ "anstream", "anstyle", @@ -846,9 +824,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ "libc", "windows-sys 0.52.0", @@ -858,7 +836,7 @@ dependencies = [ name = "errorcode_book_generator" version = "0.1.0" dependencies = [ - "clap 4.5.4", + "clap 4.5.13", "mdbook", "semver", "serde_json", @@ -884,20 +862,9 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "event-listener" -version = "4.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener" -version = "5.2.0" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b5fb89194fa3cad959b833185b3063ba881dbfc7030680b314250779fb4cc91" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" dependencies = [ "concurrent-queue", "parking", @@ -906,21 +873,11 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" -dependencies = [ - "event-listener 4.0.3", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.5.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "feedafcaa9b749175d5ac357452a9d41ea2911da598fde46ce1fe02c37751291" +checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" dependencies = [ - "event-listener 5.2.0", + "event-listener 5.3.1", "pin-project-lite", ] @@ -945,9 +902,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.0.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "filetime" @@ -957,16 +914,10 @@ checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.4.1", "windows-sys 0.52.0", ] -[[package]] -name = "finl_unicode" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" - [[package]] name = "flume" version = "0.11.0" @@ -975,7 +926,7 @@ checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" dependencies = [ "futures-core", "futures-sink", - "spin 0.9.8", + "spin", ] [[package]] @@ -1113,11 +1064,11 @@ dependencies = [ [[package]] name = "futures-lite" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445ba825b27408685aaecefd65178908c36c6e96aaf6d8599419d46e624192ba" +checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" dependencies = [ - "fastrand 2.0.1", + "fastrand 2.1.0", "futures-core", "futures-io", "parking", @@ -1130,9 +1081,9 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ - "proc-macro2 1.0.78", - "quote 1.0.35", - "syn 2.0.52", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.72", ] [[package]] @@ -1186,9 +1137,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.12" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "js-sys", @@ -1199,9 +1150,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" [[package]] name = "glob" @@ -1219,7 +1170,7 @@ dependencies = [ "bstr", "log", "regex-automata", - "regex-syntax 0.8.2", + "regex-syntax 0.8.4", ] [[package]] @@ -1245,8 +1196,8 @@ dependencies = [ "futures-core", "futures-sink", "futures-util", - "http", - "indexmap 2.2.5", + "http 0.2.12", + "indexmap 2.3.0", "slab", "tokio", "tokio-util", @@ -1275,9 +1226,9 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ "ahash", "allocator-api2", @@ -1289,7 +1240,7 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" dependencies = [ - "hashbrown 0.14.3", + "hashbrown 0.14.5", ] [[package]] @@ -1301,7 +1252,7 @@ dependencies = [ "base64", "bytes", "headers-core", - "http", + "http 0.2.12", "httpdate", "mime", "sha1", @@ -1313,7 +1264,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" dependencies = [ - "http", + "http 0.2.12", ] [[package]] @@ -1346,6 +1297,12 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + [[package]] name = "hex" version = "0.4.3" @@ -1390,16 +1347,16 @@ dependencies = [ [[package]] name = "html5ever" -version = "0.26.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bea68cab48b8459f17cf1c944c67ddc572d272d9f2b274140f223ecb1da4a3b7" +checksum = "c13771afe0e6e846f1e67d038d4cb29998a6779f93c809212e4e9c32efd244d4" dependencies = [ "log", "mac", "markup5ever", - "proc-macro2 1.0.78", - "quote 1.0.35", - "syn 1.0.109", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.72", ] [[package]] @@ -1413,6 +1370,17 @@ dependencies = [ "itoa", ] +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + [[package]] name = "http-body" version = "0.4.6" @@ -1420,15 +1388,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", - "http", + "http 0.2.12", "pin-project-lite", ] [[package]] name = "httparse" -version = "1.8.0" +version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" [[package]] name = "httpdate" @@ -1444,22 +1412,22 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.28" +version = "0.14.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" dependencies = [ "bytes", "futures-channel", "futures-core", "futures-util", "h2", - "http", + "http 0.2.12", "http-body", "httparse", "httpdate", "itoa", "pin-project-lite", - "socket2 0.5.6", + "socket2 0.5.7", "tokio", "tower-service", "tracing", @@ -1542,37 +1510,37 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.5" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" +checksum = "de3fc2e30ba82dd1b3911c8de1ffc143c74a914a14e99514d7637e3099df5ea0" dependencies = [ "equivalent", - "hashbrown 0.14.3", + "hashbrown 0.14.5", ] [[package]] name = "inkwell" -version = "0.2.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f4fcb4a4fa0b8f7b4178e24e6317d6f8b95ab500d8e6e1bd4283b6860e369c1" +checksum = "40fb405537710d51f6bdbc8471365ddd4cd6d3a3c3ad6e0c8291691031ba94b2" dependencies = [ "either", "inkwell_internals", "libc", "llvm-sys", "once_cell", - "parking_lot", + "thiserror", ] [[package]] name = "inkwell_internals" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b185e7d068d6820411502efa14d8fbf010750485399402156b72dd2a548ef8e9" +checksum = "9dd28cfd4cfba665d47d31c08a6ba637eed16770abca2eccbbc3ca831fef1e44" dependencies = [ - "proc-macro2 1.0.78", - "quote 1.0.35", - "syn 2.0.52", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.72", ] [[package]] @@ -1597,22 +1565,21 @@ dependencies = [ [[package]] name = "insta" -version = "1.36.1" +version = "1.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a7c22c4d34ef4788c351e971c52bfdfe7ea2766f8c5466bc175dd46e52ac22e" +checksum = "810ae6042d48e2c9e9215043563a58a80b877bc863228a74cf10c49d4620a6f5" dependencies = [ "console", "lazy_static", "linked-hash-map", "similar", - "yaml-rust", ] [[package]] name = "instant" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ "cfg-if", ] @@ -1645,6 +1612,12 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + [[package]] name = "iso8601" version = "0.6.1" @@ -1663,20 +1636,11 @@ dependencies = [ "either", ] -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - [[package]] name = "itoa" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "js-sys" @@ -1697,7 +1661,7 @@ dependencies = [ "anyhow", "base64", "bytecount", - "clap 4.5.4", + "clap 4.5.13", "fancy-regex", "fraction", "getrandom", @@ -1748,18 +1712,28 @@ dependencies = [ [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" dependencies = [ - "spin 0.5.2", + "spin", ] [[package]] name = "libc" -version = "0.2.153" +version = "0.2.155" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" + +[[package]] +name = "libdbus-sys" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "06085512b750d640299b79be4bad3d2fa90a9c00b1fd9e1b46364f66f0485c72" +dependencies = [ + "cc", + "pkg-config", +] [[package]] name = "libm" @@ -1792,9 +1766,9 @@ checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" [[package]] name = "linux-raw-sys" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "lld_rs" @@ -1824,9 +1798,9 @@ dependencies = [ [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -1834,9 +1808,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.21" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" dependencies = [ "value-bag", ] @@ -1858,8 +1832,8 @@ checksum = "a1d849148dbaf9661a6151d1ca82b13bb4c4c128146a88d05253b38d4e2f496c" dependencies = [ "beef", "fnv", - "proc-macro2 1.0.78", - "quote 1.0.35", + "proc-macro2 1.0.86", + "quote 1.0.36", "regex-syntax 0.6.29", "syn 1.0.109", ] @@ -1878,9 +1852,9 @@ checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" [[package]] name = "markup5ever" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2629bb1404f3d34c2e921f21fd34ba00b206124c81f65c50b43b6aaefeb016" +checksum = "16ce3abbeba692c8b8441d036ef91aea6df8da2c6b6e21c7e14d3c18e526be45" dependencies = [ "log", "phf", @@ -1902,17 +1876,17 @@ dependencies = [ [[package]] name = "mdbook" -version = "0.4.37" +version = "0.4.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c33564061c3c640bed5ace7d6a2a1b65f2c64257d1ac930c15e94ed0fb561d3" +checksum = "b45a38e19bd200220ef07c892b0157ad3d2365e5b5a267ca01ad12182491eea5" dependencies = [ "ammonia", "anyhow", "chrono", - "clap 4.5.4", + "clap 4.5.13", "clap_complete", "elasticlunr-rs", - "env_logger 0.11.3", + "env_logger 0.11.5", "futures-util", "handlebars", "ignore", @@ -1932,14 +1906,15 @@ dependencies = [ "tokio", "toml", "topological-sort", + "walkdir", "warp", ] [[package]] name = "memchr" -version = "2.7.1" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "mime" @@ -1949,9 +1924,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "mime_guess" -version = "2.0.4" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" dependencies = [ "mime", "unicase", @@ -1965,9 +1940,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" dependencies = [ "adler", ] @@ -1984,13 +1959,24 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "mio" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4569e456d394deccd22ce1c1913e6ea0e54519f577285001215d33557431afe4" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "wasi", + "windows-sys 0.52.0", +] + [[package]] name = "native-tls" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" dependencies = [ - "lazy_static", "libc", "log", "openssl", @@ -2008,18 +1994,6 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" -[[package]] -name = "nix" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" -dependencies = [ - "bitflags 2.4.2", - "cfg-if", - "cfg_aliases", - "libc", -] - [[package]] name = "nom" version = "7.1.3" @@ -2032,11 +2006,11 @@ dependencies = [ [[package]] name = "normpath" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5831952a9476f2fed74b77d74182fa5ddc4d21c72ec45a333b250e3ed0272804" +checksum = "c8911957c4b1549ac0dc74e30db9c8b0e66ddcd6d7acc33098f4c63a64a6d7ed" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -2045,7 +2019,7 @@ version = "6.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.6.0", "crossbeam-channel", "filetime", "fsevent-sys", @@ -2053,7 +2027,7 @@ dependencies = [ "kqueue", "libc", "log", - "mio", + "mio 0.8.11", "walkdir", "windows-sys 0.48.0", ] @@ -2080,9 +2054,9 @@ dependencies = [ [[package]] name = "num" -version = "0.4.1" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05180d69e3da0e530ba2a1dae5110317e49e3b7f3d41be227dc5f92e49ee7af" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" dependencies = [ "num-bigint", "num-complex", @@ -2094,11 +2068,10 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ - "autocfg", "num-integer", "num-traits", ] @@ -2128,9 +2101,9 @@ checksum = "63335b2e2c34fae2fb0aa2cecfd9f0832a1e24b3b32ecec612c3426d46dc8aaa" [[package]] name = "num-complex" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23c6602fda94a57c990fe0df199a035d83576b496aa29f4e634a8ac6004e68a6" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" dependencies = [ "num-traits", ] @@ -2152,9 +2125,9 @@ dependencies = [ [[package]] name = "num-iter" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" dependencies = [ "autocfg", "num-integer", @@ -2163,11 +2136,10 @@ dependencies = [ [[package]] name = "num-rational" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" dependencies = [ - "autocfg", "num-bigint", "num-integer", "num-traits", @@ -2175,29 +2147,19 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", "libm", ] -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi 0.3.9", - "libc", -] - [[package]] name = "object" -version = "0.32.2" +version = "0.36.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "3f203fa8daa7bb185f760ae12bd8e097f63d17041dcdcaf675ac54cdf863170e" dependencies = [ "memchr", ] @@ -2210,13 +2172,14 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opener" -version = "0.6.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c62dcb6174f9cb326eac248f07e955d5d559c272730b6c03e396b443b562788" +checksum = "f8df34be653210fbe9ffaff41d3b92721c56ce82dfee58ee684f9afb5e3a90c0" dependencies = [ "bstr", + "dbus", "normpath", - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -2225,7 +2188,7 @@ version = "0.10.66" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.6.0", "cfg-if", "foreign-types", "libc", @@ -2240,9 +2203,9 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ - "proc-macro2 1.0.78", - "quote 1.0.35", - "syn 2.0.52", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.72", ] [[package]] @@ -2277,9 +2240,9 @@ checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -2287,22 +2250,22 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.5.3", "smallvec", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] name = "paste" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pathdiff" @@ -2327,9 +2290,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.9" +version = "2.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "311fb059dee1a7b802f036316d790138c613a4e8b180c822e3925a662e9f0c95" +checksum = "cd53dff83f26735fdc1ca837098ccf133605d794cdae66acfc2bfac3ec809d95" dependencies = [ "memchr", "thiserror", @@ -2338,9 +2301,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.7.9" +version = "2.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f73541b156d32197eecda1a4014d7f868fd2bcb3c550d5386087cfba442bf69c" +checksum = "2a548d2beca6773b1c244554d36fcf8548a8a58e74156968211567250e48e49a" dependencies = [ "pest", "pest_generator", @@ -2348,22 +2311,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.9" +version = "2.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c35eeed0a3fab112f75165fdc026b3913f4183133f19b49be773ac9ea966e8bd" +checksum = "3c93a82e8d145725dcbaf44e5ea887c8a869efdcc28706df2d08c69e17077183" dependencies = [ "pest", "pest_meta", - "proc-macro2 1.0.78", - "quote 1.0.35", - "syn 2.0.52", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.72", ] [[package]] name = "pest_meta" -version = "2.7.9" +version = "2.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2adbf29bb9776f28caece835398781ab24435585fe0d4dc1374a61db5accedca" +checksum = "a941429fea7e08bedec25e4f6785b6ffaacc6b755da98df5ef3e7dcf4a124c4f" dependencies = [ "once_cell", "pest", @@ -2372,21 +2335,21 @@ dependencies = [ [[package]] name = "phf" -version = "0.10.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" dependencies = [ - "phf_shared", + "phf_shared 0.11.2", ] [[package]] name = "phf_codegen" -version = "0.10.0" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" +checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a" dependencies = [ - "phf_generator", - "phf_shared", + "phf_generator 0.11.2", + "phf_shared 0.11.2", ] [[package]] @@ -2395,7 +2358,17 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" dependencies = [ - "phf_shared", + "phf_shared 0.10.0", + "rand", +] + +[[package]] +name = "phf_generator" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +dependencies = [ + "phf_shared 0.11.2", "rand", ] @@ -2408,6 +2381,15 @@ dependencies = [ "siphasher", ] +[[package]] +name = "phf_shared" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +dependencies = [ + "siphasher", +] + [[package]] name = "pin-project" version = "1.1.5" @@ -2423,16 +2405,16 @@ version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ - "proc-macro2 1.0.78", - "quote 1.0.35", - "syn 2.0.52", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.72", ] [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pin-utils" @@ -2442,12 +2424,12 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "piper" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" +checksum = "ae1d5c74c9876f070d3e8fd503d748c7d974c3e48da8f41350fa5222ef9b4391" dependencies = [ "atomic-waker", - "fastrand 2.0.1", + "fastrand 2.1.0", "futures-io", ] @@ -2510,6 +2492,7 @@ dependencies = [ "rustc-hash", "serde", "serde_json", + "thiserror", "toml", ] @@ -2522,7 +2505,7 @@ dependencies = [ "encoding_rs", "encoding_rs_io", "env_logger 0.10.2", - "indexmap 2.2.5", + "indexmap 2.3.0", "insta", "log", "plc_ast", @@ -2586,9 +2569,9 @@ name = "plc_xml" version = "0.1.0" dependencies = [ "html-escape", - "indexmap 2.2.5", + "indexmap 2.3.0", "insta", - "itertools 0.11.0", + "itertools", "logos", "plc_ast", "plc_diagnostics", @@ -2616,14 +2599,15 @@ dependencies = [ [[package]] name = "polling" -version = "3.5.0" +version = "3.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24f040dee2588b4963afb4e420540439d126f73fdacf4a9c486a96d840bac3c9" +checksum = "a3ed00ed3fbf728b5816498ecd316d1716eecaced9c0c8d2c5a6740ca214985b" dependencies = [ "cfg-if", "concurrent-queue", + "hermit-abi 0.4.0", "pin-project-lite", - "rustix 0.38.31", + "rustix 0.38.34", "tracing", "windows-sys 0.52.0", ] @@ -2636,9 +2620,12 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "precomputed-hash" @@ -2663,8 +2650,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ "proc-macro-error-attr", - "proc-macro2 1.0.78", - "quote 1.0.35", + "proc-macro2 1.0.86", + "quote 1.0.36", "syn 1.0.109", "version_check", ] @@ -2675,8 +2662,8 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ - "proc-macro2 1.0.78", - "quote 1.0.35", + "proc-macro2 1.0.86", + "quote 1.0.36", "version_check", ] @@ -2691,20 +2678,20 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] [[package]] name = "pulldown-cmark" -version = "0.10.2" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0530d13d87d1f549b66a3e8d0c688952abe5994e204ed62615baaf25dc029c" +checksum = "76979bea66e7875e7509c4ec5300112b316af87fa7a252ca91c448b32dfe3993" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.6.0", "memchr", "pulldown-cmark-escape", "unicase", @@ -2712,9 +2699,9 @@ dependencies = [ [[package]] name = "pulldown-cmark-escape" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5d8f9aa0e3cbcfaf8bf00300004ee3b72f74770f9cbac93f6928771f613276b" +checksum = "bd348ff538bc9caeda7ee8cad2d1d48236a1f443c1fa3913c6a02fe0043b1dd3" [[package]] name = "quick-xml" @@ -2737,11 +2724,11 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.35" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ - "proc-macro2 1.0.78", + "proc-macro2 1.0.86", ] [[package]] @@ -2776,9 +2763,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4963ed1bc86e4f3ee217022bd855b297cef07fb9eac5dfa1f788b220b49b3bd" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", @@ -2803,27 +2790,36 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "redox_syscall" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" +dependencies = [ + "bitflags 2.6.0", +] + [[package]] name = "regex" -version = "1.10.3" +version = "1.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" +checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" dependencies = [ "aho-corasick", "memchr", "regex-automata", - "regex-syntax 0.8.2", + "regex-syntax 0.8.4", ] [[package]] name = "regex-automata" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.2", + "regex-syntax 0.8.4", ] [[package]] @@ -2834,15 +2830,15 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "reqwest" -version = "0.11.24" +version = "0.11.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6920094eb85afde5e4a138be3f2de8bbdf28000f0029e72c45025a56b042251" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" dependencies = [ "base64", "bytes", @@ -2850,7 +2846,7 @@ dependencies = [ "futures-core", "futures-util", "h2", - "http", + "http 0.2.12", "http-body", "hyper", "ipnet", @@ -2896,9 +2892,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc-hash" @@ -2922,26 +2918,17 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.31" +version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.6.0", "errno", "libc", - "linux-raw-sys 0.4.13", + "linux-raw-sys 0.4.14", "windows-sys 0.52.0", ] -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64", -] - [[package]] name = "rusty" version = "0.2.0" @@ -2952,10 +2939,10 @@ dependencies = [ "encoding_rs", "encoding_rs_io", "generational-arena", - "indexmap 2.2.5", + "indexmap 2.3.0", "inkwell", "insta", - "itertools 0.11.0", + "itertools", "lazy_static", "lld_rs", "log", @@ -2986,9 +2973,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "same-file" @@ -2999,6 +2986,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "scc" +version = "2.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a870e34715d5d59c8536040d4d4e7a41af44d527dc50237036ba4090db7996fc" +dependencies = [ + "sdd", +] + [[package]] name = "schannel" version = "0.1.23" @@ -3020,6 +3016,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "sdd" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "177258b64c0faaa9ffd3c65cd3262c2bc7e2588dbbd9c1641d0346145c1bbda8" + [[package]] name = "section_mangler" version = "0.0.1" @@ -3029,11 +3031,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.9.2" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "core-foundation", "core-foundation-sys", "libc", @@ -3042,9 +3044,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.9.1" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" dependencies = [ "core-foundation-sys", "libc", @@ -3052,37 +3054,38 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.197" +version = "1.0.204" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.197" +version = "1.0.204" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" dependencies = [ - "proc-macro2 1.0.78", - "quote 1.0.35", - "syn 2.0.52", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.72", ] [[package]] name = "serde_json" -version = "1.0.114" +version = "1.0.122" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" +checksum = "784b6203951c57ff748476b126ccb5e8e2959a5c19e5c617ab1956be3dbc68da" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] @@ -3101,27 +3104,27 @@ dependencies = [ [[package]] name = "serial_test" -version = "3.0.0" +version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ad9342b3aaca7cb43c45c097dd008d4907070394bd0751a0aa8817e5a018d" +checksum = "4b4b487fe2acf240a021cf57c6b2b4903b1e78ca0ecd862a71b71d2a51fed77d" dependencies = [ - "dashmap", "futures", - "lazy_static", "log", + "once_cell", "parking_lot", + "scc", "serial_test_derive", ] [[package]] name = "serial_test_derive" -version = "3.0.0" +version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b93fb4adc70021ac1b47f7d45e8cc4169baaa7ea58483bc5b721d19a26202212" +checksum = "82fe9db325bcef1fbcde82e078a5cc4efdf787e96b3b9cf45b50b529f2083d67" dependencies = [ - "proc-macro2 1.0.78", - "quote 1.0.35", - "syn 2.0.52", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.72", ] [[package]] @@ -3170,9 +3173,9 @@ dependencies = [ [[package]] name = "similar" -version = "2.4.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32fea41aca09ee824cc9724996433064c89f7777e60762749a4170a14abbfa21" +checksum = "1de1d4f81173b03af4c0cbed3c898f6bff5b870e4a7f5d6f4057d62a7a4b686e" [[package]] name = "siphasher" @@ -3191,9 +3194,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "socket2" @@ -3207,20 +3210,14 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", "windows-sys 0.52.0", ] -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - [[package]] name = "spin" version = "0.9.8" @@ -3242,20 +3239,19 @@ dependencies = [ [[package]] name = "sqlformat" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce81b7bd7c4493975347ef60d8c7e8b742d4694f4c49f93e0a12ea263938176c" +checksum = "f895e3734318cc55f1fe66258926c9b910c124d47520339efecbb6c59cec7c1f" dependencies = [ - "itertools 0.12.1", "nom", "unicode_categories", ] [[package]] name = "sqlx" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dba03c279da73694ef99763320dea58b51095dfe87d001b1d4b5fe78ba8763cf" +checksum = "c9a2ccff1a000a5a59cd33da541d9f2fdcd9e6e8229cc200565942bff36d0aaa" dependencies = [ "sqlx-core", "sqlx-macros", @@ -3266,9 +3262,9 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d84b0a3c3739e220d94b3239fd69fb1f74bc36e16643423bd99de3b43c21bfbd" +checksum = "24ba59a9342a3d9bab6c56c118be528b27c9b60e490080e9711a04dccac83ef6" dependencies = [ "ahash", "async-io 1.13.0", @@ -3278,7 +3274,6 @@ dependencies = [ "bytes", "crc", "crossbeam-queue", - "dotenvy", "either", "event-listener 2.5.3", "futures-channel", @@ -3288,7 +3283,7 @@ dependencies = [ "futures-util", "hashlink", "hex", - "indexmap 2.2.5", + "indexmap 2.3.0", "log", "memchr", "native-tls", @@ -3307,12 +3302,12 @@ dependencies = [ [[package]] name = "sqlx-macros" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89961c00dc4d7dffb7aee214964b065072bff69e36ddb9e2c107541f75e4f2a5" +checksum = "4ea40e2345eb2faa9e1e5e326db8c34711317d2b5e08d0d5741619048a803127" dependencies = [ - "proc-macro2 1.0.78", - "quote 1.0.35", + "proc-macro2 1.0.86", + "quote 1.0.36", "sqlx-core", "sqlx-macros-core", "syn 1.0.109", @@ -3320,19 +3315,18 @@ dependencies = [ [[package]] name = "sqlx-macros-core" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0bd4519486723648186a08785143599760f7cc81c52334a55d6a83ea1e20841" +checksum = "5833ef53aaa16d860e92123292f1f6a3d53c34ba8b1969f152ef1a7bb803f3c8" dependencies = [ "async-std", - "atomic-write-file", "dotenvy", "either", "heck 0.4.1", "hex", "once_cell", - "proc-macro2 1.0.78", - "quote 1.0.35", + "proc-macro2 1.0.86", + "quote 1.0.36", "serde", "serde_json", "sha2", @@ -3346,13 +3340,13 @@ dependencies = [ [[package]] name = "sqlx-mysql" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e37195395df71fd068f6e2082247891bc11e3289624bbc776a0cdfa1ca7f1ea4" +checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418" dependencies = [ "atoi", "base64", - "bitflags 2.4.2", + "bitflags 2.6.0", "byteorder", "bytes", "crc", @@ -3388,13 +3382,13 @@ dependencies = [ [[package]] name = "sqlx-postgres" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6ac0ac3b7ccd10cc96c7ab29791a7dd236bd94021f31eec7ba3d46a74aa1c24" +checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e" dependencies = [ "atoi", "base64", - "bitflags 2.4.2", + "bitflags 2.6.0", "byteorder", "crc", "dotenvy", @@ -3415,7 +3409,6 @@ dependencies = [ "rand", "serde", "serde_json", - "sha1", "sha2", "smallvec", "sqlx-core", @@ -3427,9 +3420,9 @@ dependencies = [ [[package]] name = "sqlx-sqlite" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "210976b7d948c7ba9fced8ca835b11cbb2d677c59c79de41ac0d397e14547490" +checksum = "b244ef0a8414da0bed4bb1910426e890b19e5e9bccc27ada6b797d05c55ae0aa" dependencies = [ "atoi", "flume", @@ -3457,7 +3450,7 @@ dependencies = [ "new_debug_unreachable", "once_cell", "parking_lot", - "phf_shared", + "phf_shared 0.10.0", "precomputed-hash", "serde", ] @@ -3468,21 +3461,21 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" dependencies = [ - "phf_generator", - "phf_shared", - "proc-macro2 1.0.78", - "quote 1.0.35", + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro2 1.0.86", + "quote 1.0.36", ] [[package]] name = "stringprep" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" dependencies = [ - "finl_unicode", "unicode-bidi", "unicode-normalization", + "unicode-properties", ] [[package]] @@ -3493,15 +3486,15 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "strsim" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "subtle" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" @@ -3520,19 +3513,19 @@ version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ - "proc-macro2 1.0.78", - "quote 1.0.35", + "proc-macro2 1.0.86", + "quote 1.0.36", "unicode-ident", ] [[package]] name = "syn" -version = "2.0.52" +version = "2.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" +checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" dependencies = [ - "proc-macro2 1.0.78", - "quote 1.0.35", + "proc-macro2 1.0.86", + "quote 1.0.36", "unicode-ident", ] @@ -3580,13 +3573,14 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.10.1" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +checksum = "b8fcd239983515c23a32fb82099f97d0b11b8c72f654ed659363a95c3dad7a53" dependencies = [ "cfg-if", - "fastrand 2.0.1", - "rustix 0.38.31", + "fastrand 2.1.0", + "once_cell", + "rustix 0.38.34", "windows-sys 0.52.0", ] @@ -3616,7 +3610,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7" dependencies = [ - "rustix 0.38.31", + "rustix 0.38.34", "windows-sys 0.48.0", ] @@ -3628,29 +3622,29 @@ checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" [[package]] name = "thiserror" -version = "1.0.57" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" +checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.57" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" +checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ - "proc-macro2 1.0.78", - "quote 1.0.35", - "syn 2.0.52", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.72", ] [[package]] name = "time" -version = "0.3.34" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "num-conv", @@ -3668,9 +3662,9 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" dependencies = [ "num-conv", "time-core", @@ -3678,9 +3672,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ "tinyvec_macros", ] @@ -3693,48 +3687,36 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.36.0" +version = "1.39.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" +checksum = "daa4fb1bc778bd6f04cbfc4bb2d06a7396a8f299dc33ea1900cedaa316f467b1" dependencies = [ "backtrace", "bytes", "libc", - "mio", - "num_cpus", + "mio 1.0.1", "pin-project-lite", - "socket2 0.5.6", + "socket2 0.5.7", "tokio-macros", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "tokio-macros" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" -dependencies = [ - "proc-macro2 1.0.78", - "quote 1.0.35", - "syn 2.0.52", -] - -[[package]] -name = "tokio-stream" -version = "0.1.15" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.72", ] [[package]] name = "tokio-tungstenite" -version = "0.20.1" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" +checksum = "c83b561d025642014097b66e6c1bb422783339e0909e4429cde4749d1990bc38" dependencies = [ "futures-util", "log", @@ -3744,16 +3726,15 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" dependencies = [ "bytes", "futures-core", "futures-sink", "pin-project-lite", "tokio", - "tracing", ] [[package]] @@ -3795,9 +3776,9 @@ version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ - "proc-macro2 1.0.78", - "quote 1.0.35", - "syn 2.0.52", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.72", ] [[package]] @@ -3817,14 +3798,14 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "tungstenite" -version = "0.20.1" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" +checksum = "9ef1a641ea34f399a848dea702823bbecfb4c486f911735368f1f137cb8257e1" dependencies = [ "byteorder", "bytes", "data-encoding", - "http", + "http 1.1.0", "httparse", "log", "rand", @@ -3876,6 +3857,12 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-properties" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4259d9d4425d9f0661581b804cb85fe66a4c631cadd8f490d1c13a35d5d9291" + [[package]] name = "unicode-segmentation" version = "1.11.0" @@ -3884,9 +3871,9 @@ checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" [[package]] name = "unicode-width" -version = "0.1.11" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" +checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" [[package]] name = "unicode-xid" @@ -3902,9 +3889,9 @@ checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" [[package]] name = "url" -version = "2.5.0" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" dependencies = [ "form_urlencoded", "idna", @@ -3931,21 +3918,21 @@ checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.7.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a" +checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" [[package]] name = "value-bag" -version = "1.7.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126e423afe2dd9ac52142e7e9d5ce4135d7e13776c529d27fd6bc49f19e3280b" +checksum = "5a84c137d37ab0142f0f2ddfe332651fdbf252e7b7dbb4e67b6c1f1b2e925101" [[package]] name = "vcpkg" @@ -3955,15 +3942,15 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "waker-fn" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690" +checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" [[package]] name = "walkdir" @@ -3986,28 +3973,26 @@ dependencies = [ [[package]] name = "warp" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1e92e22e03ff1230c03a1a8ee37d2f89cd489e2e541b7550d6afad96faed169" +checksum = "4378d202ff965b011c64817db11d5829506d3404edeadb61f190d111da3f231c" dependencies = [ "bytes", "futures-channel", "futures-util", "headers", - "http", + "http 0.2.12", "hyper", "log", "mime", "mime_guess", "percent-encoding", "pin-project", - "rustls-pemfile", "scoped-tls", "serde", "serde_json", "serde_urlencoded", "tokio", - "tokio-stream", "tokio-tungstenite", "tokio-util", "tower-service", @@ -4045,9 +4030,9 @@ dependencies = [ "bumpalo", "log", "once_cell", - "proc-macro2 1.0.78", - "quote 1.0.35", - "syn 2.0.52", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.72", "wasm-bindgen-shared", ] @@ -4069,7 +4054,7 @@ version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ - "quote 1.0.35", + "quote 1.0.36", "wasm-bindgen-macro-support", ] @@ -4079,9 +4064,9 @@ version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ - "proc-macro2 1.0.78", - "quote 1.0.35", - "syn 2.0.52", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.72", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4111,16 +4096,16 @@ dependencies = [ "either", "home", "once_cell", - "rustix 0.38.31", + "rustix 0.38.34", ] [[package]] name = "whoami" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fec781d48b41f8163426ed18e8fc2864c12937df9ce54c88ede7bd47270893e" +checksum = "a44ab49fad634e88f55bf8f9bb3abd2f27d7204172a112c7c9987e01c1c94ea9" dependencies = [ - "redox_syscall", + "redox_syscall 0.4.1", "wasite", ] @@ -4142,11 +4127,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.6" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "winapi", + "windows-sys 0.59.0", ] [[package]] @@ -4161,7 +4146,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.4", + "windows-targets 0.52.6", ] [[package]] @@ -4179,7 +4164,16 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.4", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", ] [[package]] @@ -4199,17 +4193,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.4" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.4", - "windows_aarch64_msvc 0.52.4", - "windows_i686_gnu 0.52.4", - "windows_i686_msvc 0.52.4", - "windows_x86_64_gnu 0.52.4", - "windows_x86_64_gnullvm 0.52.4", - "windows_x86_64_msvc 0.52.4", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -4220,9 +4215,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.4" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -4232,9 +4227,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.4" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -4244,9 +4239,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.4" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" @@ -4256,9 +4257,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.4" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -4268,9 +4269,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.4" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -4280,9 +4281,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.4" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -4292,9 +4293,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.4" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winreg" @@ -4308,18 +4309,18 @@ dependencies = [ [[package]] name = "xshell" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce2107fe03e558353b4c71ad7626d58ed82efaf56c54134228608893c77023ad" +checksum = "6db0ab86eae739efd1b054a8d3d16041914030ac4e01cd1dca0cf252fd8b6437" dependencies = [ "xshell-macros", ] [[package]] name = "xshell-macros" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e2c411759b501fb9501aac2b1b2d287a6e93e5bdcf13c25306b23e1b716dd0e" +checksum = "9d422e8e38ec76e2f06ee439ccc765e9c6a9638b9e7c9f2e8255e4d41e8bd852" [[package]] name = "xtask" @@ -4327,7 +4328,7 @@ version = "0.1.0" dependencies = [ "anyhow", "async-std", - "clap 4.5.4", + "clap 4.5.13", "plc_ast", "plc_source", "rusty", @@ -4339,15 +4340,6 @@ dependencies = [ "xshell", ] -[[package]] -name = "yaml-rust" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" -dependencies = [ - "linked-hash-map", -] - [[package]] name = "yansi" version = "0.5.1" @@ -4356,26 +4348,27 @@ checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" [[package]] name = "zerocopy" -version = "0.7.32" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ + "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.32" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ - "proc-macro2 1.0.78", - "quote 1.0.35", - "syn 2.0.52", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.72", ] [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" diff --git a/Cargo.toml b/Cargo.toml index 4f06d43256..1eabf02e1b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,7 +24,6 @@ plc_diagnostics = { path = "./compiler/plc_diagnostics" } plc_index = { path = "./compiler/plc_index" } section_mangler = { path = "./compiler/section_mangler" } logos = "0.12.0" -thiserror = "1.0" clap = { version = "3.0", features = ["derive"] } indexmap = "2.0" generational-arena = "0.2.8" @@ -35,6 +34,7 @@ lld_rs = "140.0.0" which = "4.2.5" log.workspace = true inkwell.workspace = true +thiserror.workspace = true chrono.workspace = true itertools.workspace = true anyhow.workspace = true @@ -80,7 +80,7 @@ members = [ default-members = [".", "compiler/plc_driver", "compiler/plc_xml"] [workspace.dependencies] -inkwell = { version = "0.2", features = ["llvm14-0"] } +inkwell = { version = "0.5", features = ["llvm14-0"] } encoding_rs = "0.8" encoding_rs_io = "0.1" log = "0.4" @@ -92,3 +92,4 @@ serde = { version = "1.0", features = ["derive"] } serde_json = "1" toml = "0.5" rustc-hash = "1.1.0" +thiserror = "1.0" diff --git a/compiler/plc_diagnostics/Cargo.toml b/compiler/plc_diagnostics/Cargo.toml index 4e30856a0f..988124d4ad 100644 --- a/compiler/plc_diagnostics/Cargo.toml +++ b/compiler/plc_diagnostics/Cargo.toml @@ -15,4 +15,5 @@ toml.workspace = true anyhow.workspace = true lazy_static.workspace = true log.workspace = true -rustc-hash.workspace = true \ No newline at end of file +rustc-hash.workspace = true +thiserror.workspace = true diff --git a/compiler/plc_diagnostics/src/diagnostics.rs b/compiler/plc_diagnostics/src/diagnostics.rs index 1aa1441df2..1cd1c473e1 100644 --- a/compiler/plc_diagnostics/src/diagnostics.rs +++ b/compiler/plc_diagnostics/src/diagnostics.rs @@ -27,7 +27,7 @@ pub enum Severity { /// The `Diagnostics` struct describes an issue encountered during compile time. /// The issue is defined by an `error_code` and had a defined `severity` /// Diagnostic severity can be overridden when being reported. -#[derive(Debug)] +#[derive(thiserror::Error, Debug)] pub struct Diagnostic { /// The Description of the error being reported. message: String, @@ -40,15 +40,10 @@ pub struct Diagnostic { /// Children of the current diagnostic sub_diagnostics: Vec, /// If the diagnostic is caused by an error, this field contains the original error + #[source] internal_error: Option, } -impl std::error::Error for Diagnostic { - fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { - self.internal_error.as_ref().and_then(|it| it.source()) - } -} - impl From for Diagnostic { fn from(value: std::io::Error) -> Self { Diagnostic::new(value.to_string()).with_error_code("E002").with_internal_error(value.into()) diff --git a/compiler/plc_driver/src/lib.rs b/compiler/plc_driver/src/lib.rs index 142a901863..40bb318e02 100644 --- a/compiler/plc_driver/src/lib.rs +++ b/compiler/plc_driver/src/lib.rs @@ -264,7 +264,10 @@ pub fn compile_with_options(compile_options: CompilationContext) -> Result<()> { // 5 : Codegen if !compile_parameters.is_check() { let res = generate(&compile_options, &link_options, compile_parameters.target, annotated_project) - .map_err(|err| Diagnostic::codegen_error(err.get_message(), err.get_location())); + .map_err(|err| { + Diagnostic::codegen_error(err.get_message(), err.get_location()) + .with_internal_error(err.into()) + }); if let Err(res) = res { diagnostician.handle(&[res]); return Err(Diagnostic::new("Compilation aborted due to previous errors") diff --git a/src/builtins.rs b/src/builtins.rs index 9f5da9f6f9..76cd7d3552 100644 --- a/src/builtins.rs +++ b/src/builtins.rs @@ -17,6 +17,7 @@ use plc_source::source_location::{SourceLocation, SourceLocationFactory}; use rustc_hash::FxHashMap; use crate::{ + codegen::diagnostics::CodegenDiagnostic, codegen::generators::expression_generator::{self, ExpressionCodeGenerator, ExpressionValue}, index::Index, lexer, parser, @@ -48,7 +49,7 @@ lazy_static! { if let [reference] = params { generator .generate_lvalue(reference) - .map(|it| ExpressionValue::RValue(generator.ptr_as_value(it))) + .and_then(|it| Ok(ExpressionValue::RValue(generator.ptr_as_value(it)?))) } else { Err(Diagnostic::codegen_error( "Expected exactly one parameter for REF", @@ -145,7 +146,7 @@ lazy_static! { .and_then(|it| generator.get_type_hint_info_for(it))?; //Create a temp var let result_type = generator.llvm_index.get_associated_type(type_hint.get_name())?; - let result_var = generator.llvm.create_local_variable("", &result_type); + let result_var = generator.llvm.create_local_variable("", &result_type)?; let k = generator.generate_expression(k)?; let mut blocks = vec![]; @@ -159,12 +160,12 @@ lazy_static! { let value = context.i32_type().const_int(index as u64, false); builder.position_at_end(block); generator.generate_store(result_var, type_hint.get_type_information(), it)?; - builder.build_unconditional_branch(continue_block); + builder.build_unconditional_branch(continue_block).map_err(CodegenDiagnostic::from)?; Ok((value,block)) }).collect::,_>>()?; builder.position_at_end(insert_block); - builder.build_switch(k.into_int_value(), continue_block, &cases); + builder.build_switch(k.into_int_value(), continue_block, &cases).map_err(CodegenDiagnostic::from)?; builder.position_at_end(continue_block); Ok(ExpressionValue::LValue(result_var)) } else { @@ -190,7 +191,7 @@ lazy_static! { code: |generator, params, location| { if let &[g,in0,in1] = params { // evaluate the parameters - let cond = expression_generator::to_i1(generator.generate_expression(g)?.into_int_value(), &generator.llvm.builder); + let cond = expression_generator::to_i1(generator.generate_expression(g)?.into_int_value(), &generator.llvm.builder)?; // for aggregate types we need a ptr to perform memcpy // use generate_expression_value(), this will return a gep // generate_expression() would load the ptr @@ -205,7 +206,7 @@ lazy_static! { generator.generate_expression(in1)? }; // generate an llvm select instruction - let sel = generator.llvm.builder.build_select(cond, in1, in0, ""); + let sel = generator.llvm.builder.build_select(cond, in1, in0, "").map_err(CodegenDiagnostic::from)?; if sel.is_pointer_value(){ Ok(ExpressionValue::LValue(sel.into_pointer_value())) @@ -853,26 +854,35 @@ fn generate_variable_length_array_bound_function<'ink>( todo!() }; // this operation mirrors the offset calculation of literal ints, but at runtime - let offset = builder.build_int_mul( - llvm.i32_type().const_int(2, false), - builder.build_int_sub( - expression_value.into_int_value(), - llvm.i32_type().const_int(1, false), + let offset = builder + .build_int_mul( + llvm.i32_type().const_int(2, false), + builder + .build_int_sub( + expression_value.into_int_value(), + llvm.i32_type().const_int(1, false), + "", + ) + .map_err(CodegenDiagnostic::from)?, "", - ), - "", - ); + ) + .map_err(CodegenDiagnostic::from)?; if !is_lower { - builder.build_int_add(offset, llvm.i32_type().const_int(1, false), "") + builder + .build_int_add(offset, llvm.i32_type().const_int(1, false), "") + .map_err(CodegenDiagnostic::from)? } else { offset } } }; - let gep_bound = - unsafe { llvm.builder.build_in_bounds_gep(dim, &[llvm.i32_type().const_zero(), accessor], "") }; - let bound = llvm.builder.build_load(gep_bound, ""); + let gep_bound = unsafe { + llvm.builder + .build_in_bounds_gep(dim, &[llvm.i32_type().const_zero(), accessor], "") + .map_err(CodegenDiagnostic::from)? + }; + let bound = llvm.builder.build_load(gep_bound, "").map_err(CodegenDiagnostic::from)?; Ok(ExpressionValue::RValue(bound)) } diff --git a/src/codegen.rs b/src/codegen.rs index b141c368ef..0e66329011 100644 --- a/src/codegen.rs +++ b/src/codegen.rs @@ -28,7 +28,7 @@ use inkwell::{ context::Context, execution_engine::{ExecutionEngine, JitFunction}, memory_buffer::MemoryBuffer, - types::BasicType, + types::{BasicType, FunctionType}, }; use inkwell::{ module::Module, @@ -40,6 +40,7 @@ use plc_diagnostics::diagnostics::Diagnostic; use plc_source::source_location::SourceLocation; mod debug; +pub(crate) mod diagnostics; pub(crate) mod generators; mod llvm_index; mod llvm_typesystem; @@ -107,6 +108,14 @@ impl<'ink> CodeGen<'ink> { ) -> Result, Diagnostic> { let llvm = Llvm::new(context, context.create_builder()); let mut index = LlvmTypedIndex::default(); + //Create an init function and position builder there + //TODO: This will conflict with the planned init function + let init_module = llvm.context.create_module("Init"); + let void_type = llvm.context.void_type(); + let fn_type = void_type.fn_type(&[], false); + let init_func = init_module.add_function("__init", fn_type, None); + let basic_block = llvm.context.append_basic_block(init_func, "entry"); + llvm.builder.position_at_end(basic_block); //Generate types index, and any global variables associated with them. let llvm_type_index = data_type_generator::generate_data_types( &llvm, @@ -120,6 +129,7 @@ impl<'ink> CodeGen<'ink> { let mut variable_generator = VariableGenerator::new(&self.module, &llvm, global_index, annotations, &index, &mut self.debug); + //Create a block for the inittializers //Generate global variables let llvm_gv_index = variable_generator.generate_global_variables(dependencies, &self.module_location)?; diff --git a/src/codegen/diagnostics.rs b/src/codegen/diagnostics.rs new file mode 100644 index 0000000000..d5078cdae6 --- /dev/null +++ b/src/codegen/diagnostics.rs @@ -0,0 +1,38 @@ +use std::{backtrace, fmt::Display}; + +use inkwell::builder::BuilderError; +use plc_diagnostics::diagnostics::Diagnostic; +use plc_source::source_location::SourceLocation; +use thiserror::Error; + +#[derive(Error, Debug)] +pub struct CodegenDiagnostic { + message: String, + source: BuilderError, + location: SourceLocation, +} + +impl Display for CodegenDiagnostic { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "Codegen error: {}. Source: {} at {}", &self.message, &self.source, &self.location) + } +} + +impl From for CodegenDiagnostic { + fn from(source: BuilderError) -> Self { + // println!("Backtrace: {} ", backtrace::Backtrace::force_capture()); + CodegenDiagnostic { message: source.to_string(), source, location: SourceLocation::undefined() } + } +} + +impl CodegenDiagnostic { + pub(crate) fn with_location(self, location: SourceLocation) -> CodegenDiagnostic { + CodegenDiagnostic { location, ..self } + } +} + +impl From for Diagnostic { + fn from(value: CodegenDiagnostic) -> Self { + Diagnostic::codegen_error(&value.message, value.location.clone()).with_internal_error(value.into()) + } +} diff --git a/src/codegen/generators/expression_generator.rs b/src/codegen/generators/expression_generator.rs index 09039ab0b3..a6e202d36f 100644 --- a/src/codegen/generators/expression_generator.rs +++ b/src/codegen/generators/expression_generator.rs @@ -26,6 +26,7 @@ use plc_util::convention::qualified_name; use crate::{ codegen::{ debug::{Debug, DebugBuilderEnum}, + diagnostics::CodegenDiagnostic, llvm_index::LlvmTypedIndex, llvm_typesystem::{cast_if_needed, get_llvm_int_type}, }, @@ -96,10 +97,14 @@ impl<'ink> ExpressionValue<'ink> { /// returns the given expression value as an r-value which means that it will load /// the pointer, if this is an l_value - pub fn as_r_value(&self, llvm: &Llvm<'ink>, load_name: Option) -> BasicValueEnum<'ink> { + pub fn as_r_value( + &self, + llvm: &Llvm<'ink>, + load_name: Option, + ) -> Result, CodegenDiagnostic> { match self { ExpressionValue::LValue(it) => llvm.load_pointer(it, load_name.as_deref().unwrap_or("")), - ExpressionValue::RValue(it) => it.to_owned(), + ExpressionValue::RValue(it) => Ok(it.to_owned()), } } } @@ -177,7 +182,7 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { let v = self .generate_expression_value(expression)? - .as_r_value(self.llvm, self.get_load_name(expression)) + .as_r_value(self.llvm, self.get_load_name(expression))? .as_basic_value_enum(); let Some(target_type) = self.annotations.get_type_hint(expression, self.index) else { @@ -185,7 +190,7 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { return Ok(v); }; let actual_type = self.annotations.get_type_or_void(expression, self.index); - Ok(cast_if_needed!(self, target_type, actual_type, v, self.annotations.get(expression))) + Ok(cast_if_needed!(self, target_type, actual_type, v, self.annotations.get(expression))?) } fn register_debug_location(&self, statement: &AstNode) { @@ -222,11 +227,11 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { self.generate_reference_expression(&data.access, data.base.as_deref(), expression)?; let val = match res { ExpressionValue::LValue(val) => { - ExpressionValue::LValue(self.auto_deref_if_necessary(val, expression)) + ExpressionValue::LValue(self.auto_deref_if_necessary(val, expression)?) } ExpressionValue::RValue(val) => { let val = if val.is_pointer_value() { - self.auto_deref_if_necessary(val.into_pointer_value(), expression) + self.auto_deref_if_necessary(val.into_pointer_value(), expression)? .as_basic_value_enum() } else { val @@ -311,13 +316,13 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { operator, self.generate_expression(left)?, self.generate_expression(right)?, - )) + )?) } else if ltype.is_float() && rtype.is_float() { Ok(self.create_llvm_float_binary_expression( operator, self.generate_expression(left)?, self.generate_expression(right)?, - )) + )?) } else if (ltype.is_pointer() && rtype.is_int()) || (ltype.is_int() && rtype.is_pointer()) || (ltype.is_pointer() && rtype.is_pointer()) @@ -343,14 +348,18 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { //The reason is that llvm expects a shift operation to happen on the same type, and //this is what the direct access will eventually end up in. let reference = - cast_if_needed!(self, target_type, self.get_type_hint_for(index)?, reference, None) + cast_if_needed!(self, target_type, self.get_type_hint_for(index)?, reference, None)? .into_int_value(); //Multiply by the bitwitdh if access.get_bit_width() > 1 { let bitwidth = reference.get_type().const_int(access.get_bit_width(), access_type.is_signed_int()); - Ok(self.llvm.builder.build_int_mul(reference, bitwidth, "")) + Ok(self + .llvm + .builder + .build_int_mul(reference, bitwidth, "") + .map_err(CodegenDiagnostic::from)?) } else { Ok(reference) } @@ -370,17 +379,19 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { let value = match unary_operator { Operator::Not => { let operator = self.generate_expression(expression)?.into_int_value(); - let operator = if self - .get_type_hint_for(expression) - .map(|it| it.get_type_information().is_bool()) - .unwrap_or_default() - { - to_i1(operator, &self.llvm.builder) - } else { - operator - }; + let operator = + if self.get_type_hint_for(expression).map(|it| it.get_type_information().is_bool())? { + to_i1(operator, &self.llvm.builder)? + } else { + operator + }; - Ok(self.llvm.builder.build_not(operator, "tmpVar").as_basic_value_enum()) + Ok(self + .llvm + .builder + .build_not(operator, "tmpVar") + .map_err(CodegenDiagnostic::from)? + .as_basic_value_enum()) } Operator::Minus => { let generated_exp = self.generate_expression(expression)?; @@ -389,12 +400,14 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { .llvm .builder .build_float_neg(generated_exp.into_float_value(), "tmpVar") + .map_err(CodegenDiagnostic::from)? .as_basic_value_enum()) } else if generated_exp.is_int_value() { Ok(self .llvm .builder .build_int_neg(generated_exp.into_int_value(), "tmpVar") + .map_err(CodegenDiagnostic::from)? .as_basic_value_enum()) } else { Err(Diagnostic::codegen_error( @@ -473,7 +486,7 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { if data_type.is_aggregate_type() { // this is a function call with a return variable fed as an out-pointer let llvm_type = self.llvm_index.get_associated_type(data_type.get_name())?; - let out_pointer = self.llvm.create_local_variable("", &llvm_type); + let out_pointer = self.llvm.create_local_variable("", &llvm_type)?; // add the out-ptr as its first parameter arguments_list.insert(0, out_pointer.into()); Some(out_pointer) @@ -486,7 +499,11 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { // if the target is a function, declare the struct locally // assign all parameters into the struct values - let call = &self.llvm.builder.build_call(function, &arguments_list, "call"); + let call = &self + .llvm + .builder + .build_call(function, &arguments_list, "call") + .map_err(CodegenDiagnostic::from)?; // so grab either: // - the out-pointer if we generated one in by_ref_func_out @@ -616,7 +633,7 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { .with_error_code("E055") .with_location(element.get_location())) }?; - index = self.llvm.builder.build_int_add(index, rhs_next, ""); + index = self.llvm.builder.build_int_add(index, rhs_next, "").map_err(CodegenDiagnostic::from)?; } //Build mask for the index @@ -625,22 +642,32 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { let ones = rhs_type.const_all_ones(); //Extend the mask to the target type - let extended_mask = self.llvm.builder.build_int_z_extend(ones, left_value.get_type(), "ext"); + let extended_mask = self + .llvm + .builder + .build_int_z_extend(ones, left_value.get_type(), "ext") + .map_err(CodegenDiagnostic::from)?; //Position the ones in their correct locations - let shifted_mask = self.llvm.builder.build_left_shift(extended_mask, index, "shift"); + let shifted_mask = self + .llvm + .builder + .build_left_shift(extended_mask, index, "shift") + .map_err(CodegenDiagnostic::from)?; //Invert the mask - let mask = self.llvm.builder.build_not(shifted_mask, "invert"); + let mask = self.llvm.builder.build_not(shifted_mask, "invert").map_err(CodegenDiagnostic::from)?; //And the result with the mask to erase the set bits at the target location - let and_value = self.llvm.builder.build_and(left_value, mask, "erase"); + let and_value = + self.llvm.builder.build_and(left_value, mask, "erase").map_err(CodegenDiagnostic::from)?; //Cast the right side to the left side type - let lhs = cast_if_needed!(self, type_left, type_right, right_expr, None).into_int_value(); + let lhs = cast_if_needed!(self, type_left, type_right, right_expr, None)?.into_int_value(); //Shift left by the direct access - let value = self.llvm.builder.build_left_shift(lhs, index, "value"); + let value = + self.llvm.builder.build_left_shift(lhs, index, "value").map_err(CodegenDiagnostic::from)?; //OR the result and store it in the left side - let or_value = self.llvm.builder.build_or(and_value, value, "or"); - self.llvm.builder.build_store(left_pointer, or_value); + let or_value = self.llvm.builder.build_or(and_value, value, "or").map_err(CodegenDiagnostic::from)?; + self.llvm.builder.build_store(left_pointer, or_value).map_err(CodegenDiagnostic::from)?; Ok(()) } @@ -652,10 +679,11 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { right_pointer: PointerValue, right_type: &DataType, ) -> Result<(), Diagnostic> { - let left_value = self.llvm.builder.build_load(left_pointer, "").into_int_value(); + let left_value = + self.llvm.builder.build_load(left_pointer, "").map_err(CodegenDiagnostic::from)?.into_int_value(); //Generate an expression for the right size - let right = self.llvm.builder.build_load(right_pointer, ""); + let right = self.llvm.builder.build_load(right_pointer, "").map_err(CodegenDiagnostic::from)?; self.generate_assignment_with_direct_access( left_statement, left_value, @@ -737,8 +765,8 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { parameter.source_location.clone(), )?; } else { - let output_value = builder.build_load(output, ""); - builder.build_store(assigned_output, output_value); + let output_value = builder.build_load(output, "").map_err(CodegenDiagnostic::from)?; + builder.build_store(assigned_output, output_value).map_err(CodegenDiagnostic::from)?; } } }; @@ -932,13 +960,13 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { .find_associated_type(type_name) .ok_or_else(|| Diagnostic::unknown_type(type_name, argument.get_location()))?; - let ptr_value = self.llvm.builder.build_alloca(v_type, ""); + let ptr_value = self.llvm.builder.build_alloca(v_type, "").map_err(CodegenDiagnostic::from)?; if let Some(p) = declared_parameter { if let Some(initial_value) = self.get_initial_value(&p.initial_value, &self.get_parameter_type(p)) { let value = self.generate_expression(initial_value)?; - self.llvm.builder.build_store(ptr_value, value); + self.llvm.builder.build_store(ptr_value, value).map_err(CodegenDiagnostic::from)?; } } @@ -953,8 +981,12 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { ExpressionValue::RValue(_v) => { // Passed a literal to a byref parameter? let value = self.generate_expression(argument)?; - let argument = self.llvm.builder.build_alloca(value.get_type(), ""); - self.llvm.builder.build_store(argument, value); + let argument = self + .llvm + .builder + .build_alloca(value.get_type(), "") + .map_err(CodegenDiagnostic::from)?; + self.llvm.builder.build_store(argument, value).map_err(CodegenDiagnostic::from)?; argument } } @@ -976,32 +1008,36 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { actual_type, value.into(), self.annotations.get(argument) - )); + )?); }; // From https://llvm.org/docs/LangRef.html#bitcast-to-instruction: The ‘bitcast’ instruction takes // a value to cast, which must be a **non-aggregate** first class value [...] if !actual_type_info.is_aggregate() && actual_type_info != target_type_info { - return Ok(self.llvm.builder.build_bitcast( - value, - self.llvm_index.get_associated_type(hint.get_name())?, - "", - )); + return Ok(self + .llvm + .builder + .build_bit_cast(value, self.llvm_index.get_associated_type(hint.get_name())?, "") + .map_err(CodegenDiagnostic::from)?); } } // ...check if we can bitcast an array to a pointer, i.e. `[81 x i8]*` should be passed as a `i8*` if value.get_type().get_element_type().is_array_type() { - let res = self.llvm.builder.build_bitcast( - value, - value - .get_type() - .get_element_type() - .into_array_type() - .get_element_type() - .ptr_type(AddressSpace::from(ADDRESS_SPACE_GENERIC)), - "", - ); + let res = self + .llvm + .builder + .build_bit_cast( + value, + value + .get_type() + .get_element_type() + .into_array_type() + .get_element_type() + .ptr_type(AddressSpace::from(ADDRESS_SPACE_GENERIC)), + "", + ) + .map_err(CodegenDiagnostic::from)?; return Ok(res.into_pointer_value().into()); } @@ -1059,7 +1095,7 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { let size_param = self.llvm.i32_type().const_int(size as u64, true); let arr = ty.array_type(size as u32); - let arr_storage = self.llvm.builder.build_alloca(arr, ""); + let arr_storage = self.llvm.builder.build_alloca(arr, "").map_err(CodegenDiagnostic::from)?; for (i, ele) in generated_params.iter().enumerate() { let ele_ptr = self.llvm.load_array_element( arr_storage, @@ -1069,15 +1105,15 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { ], "", )?; - self.llvm.builder.build_store(ele_ptr, *ele); + self.llvm.builder.build_store(ele_ptr, *ele).map_err(CodegenDiagnostic::from)?; } // bitcast the array to pointer so it matches the declared function signature - let arr_storage = self.llvm.builder.build_bitcast( - arr_storage, - ty.ptr_type(AddressSpace::from(ADDRESS_SPACE_GENERIC)), - "", - ); + let arr_storage = self + .llvm + .builder + .build_bit_cast(arr_storage, ty.ptr_type(AddressSpace::from(ADDRESS_SPACE_GENERIC)), "") + .map_err(CodegenDiagnostic::from)?; Ok(vec![size_param.into(), arr_storage]) } else { @@ -1109,7 +1145,7 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { ) })?; - Ok(self.llvm.create_local_variable(&instance_name, &function_type)) + Ok(self.llvm.create_local_variable(&instance_name, &function_type)?) } /// generates the assignments of a pou-call's parameters @@ -1168,12 +1204,17 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { { self.generate_expression(initial_value) } else { - let ptr_value = self.llvm.builder.build_alloca(parameter_type, ""); - Ok(self.llvm.load_pointer(&ptr_value, "")) + let ptr_value = self + .llvm + .builder + .build_alloca(parameter_type, "") + .map_err(CodegenDiagnostic::from)?; + Ok(self.llvm.load_pointer(&ptr_value, "")?) } } _ => { - let ptr_value = self.llvm.builder.build_alloca(parameter_type, ""); + let ptr_value = + self.llvm.builder.build_alloca(parameter_type, "").map_err(CodegenDiagnostic::from)?; // if default value is given for an output // we need to initialize the pointer value before returning @@ -1181,7 +1222,7 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { self.get_initial_value(¶meter.initial_value, ¶meter_type_name) { let value = self.generate_expression(initial_value)?; - self.llvm.builder.build_store(ptr_value, value); + self.llvm.builder.build_store(ptr_value, value).map_err(CodegenDiagnostic::from)?; } Ok(ptr_value.as_basic_value_enum()) } @@ -1262,11 +1303,14 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { self.llvm_index.find_associated_type(inner_type_name).ok_or_else(|| { Diagnostic::unknown_type(parameter.get_name(), expression.get_location()) })?; - builder.build_alloca(temp_type, "empty_varinout").as_basic_value_enum() + builder + .build_alloca(temp_type, "empty_varinout") + .map_err(CodegenDiagnostic::from)? + .as_basic_value_enum() } else { self.generate_lvalue(expression)?.as_basic_value_enum() }; - builder.build_store(pointer_to_param, generated_exp); + builder.build_store(pointer_to_param, generated_exp).map_err(CodegenDiagnostic::from)?; } else { self.generate_store(pointer_to_param, parameter, expression)?; }; @@ -1387,25 +1431,25 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { } } - fn deref(&self, accessor_ptr: PointerValue<'ink>) -> PointerValue<'ink> { - self.llvm.load_pointer(&accessor_ptr, "deref").into_pointer_value() + fn deref(&self, accessor_ptr: PointerValue<'ink>) -> Result, CodegenDiagnostic> { + Ok(self.llvm.load_pointer(&accessor_ptr, "deref")?.into_pointer_value()) } - pub fn ptr_as_value(&self, ptr: PointerValue<'ink>) -> BasicValueEnum<'ink> { + pub fn ptr_as_value(&self, ptr: PointerValue<'ink>) -> Result, CodegenDiagnostic> { let int_type = self.llvm.context.i64_type(); - if ptr.is_const() { + Ok(if ptr.is_const() { ptr.const_to_int(int_type) } else { - self.llvm.builder.build_ptr_to_int(ptr, int_type, "") + self.llvm.builder.build_ptr_to_int(ptr, int_type, "")? } - .as_basic_value_enum() + .as_basic_value_enum()) } - pub fn int_neg(&self, value: IntValue<'ink>) -> IntValue<'ink> { + pub fn int_neg(&self, value: IntValue<'ink>) -> Result, CodegenDiagnostic> { if value.is_const() { - value.const_neg() + Ok(value.const_neg()) } else { - self.llvm.builder.build_int_neg(value, "") + Ok(self.llvm.builder.build_int_neg(value, "")?) } } @@ -1418,11 +1462,11 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { &self, accessor_ptr: PointerValue<'ink>, statement: &AstNode, - ) -> PointerValue<'ink> { + ) -> Result, CodegenDiagnostic> { if self.annotations.get(statement).is_some_and(|opt| opt.is_auto_deref()) { - self.deref(accessor_ptr) + Ok(self.deref(accessor_ptr)?) } else { - accessor_ptr + Ok(accessor_ptr) } } @@ -1446,11 +1490,14 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { let result = if start_offset != 0 { let access_int_value = access_value.into_int_value(); let access_int_type = access_int_value.get_type(); - self.llvm.builder.build_int_sub( - access_int_value, - access_int_type.const_int(start_offset as u64, true), //TODO error handling for cast - "", - ) + self.llvm + .builder + .build_int_sub( + access_int_value, + access_int_type.const_int(start_offset as u64, true), //TODO error handling for cast + "", + ) + .map_err(CodegenDiagnostic::from)? } else { access_value.into_int_value() }; @@ -1461,7 +1508,7 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { self.get_type_hint_for(access_expression)?, result.as_basic_value_enum(), None - )) + )?) } /// generates a gep statement for a array-reference with an optional qualifier @@ -1540,11 +1587,15 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { &Operator::Multiplication, current_portion_value, v, - ); + )?; // take the sum of the mulitlication and the previous accumulated_value // this now becomes the new accumulated value - self.create_llvm_int_binary_expression(&Operator::Plus, m_v, last_v) - }) + Ok(self.create_llvm_int_binary_expression( + &Operator::Plus, + m_v, + last_v, + )?) + })? }); (result, 0 /* the 0 will be ignored */) }, @@ -1621,7 +1672,7 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { if let (Some(ptr), Some(mut index), Some(name)) = (ptr, index, name) { // if operator is minus we need to negate the index if let Operator::Minus = operator { - index = self.int_neg(index); + index = self.int_neg(index)?; } Ok(self.llvm.load_array_element(ptr, &[index], name.as_str())?.as_basic_value_enum()) @@ -1637,60 +1688,66 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { .builder .build_int_compare( IntPredicate::EQ, - self.convert_to_int_value_if_pointer(left_expr), - self.convert_to_int_value_if_pointer(right_expr), + self.convert_to_int_value_if_pointer(left_expr)?, + self.convert_to_int_value_if_pointer(right_expr)?, "tmpVar", ) + .map_err(Into::::into)? .as_basic_value_enum()), Operator::NotEqual => Ok(self .llvm .builder .build_int_compare( IntPredicate::NE, - self.convert_to_int_value_if_pointer(left_expr), - self.convert_to_int_value_if_pointer(right_expr), + self.convert_to_int_value_if_pointer(left_expr)?, + self.convert_to_int_value_if_pointer(right_expr)?, "tmpVar", ) + .map_err(Into::::into)? .as_basic_value_enum()), Operator::Less => Ok(self .llvm .builder .build_int_compare( IntPredicate::SLT, - self.convert_to_int_value_if_pointer(left_expr), - self.convert_to_int_value_if_pointer(right_expr), + self.convert_to_int_value_if_pointer(left_expr)?, + self.convert_to_int_value_if_pointer(right_expr)?, "tmpVar", ) + .map_err(Into::::into)? .as_basic_value_enum()), Operator::Greater => Ok(self .llvm .builder .build_int_compare( IntPredicate::SGT, - self.convert_to_int_value_if_pointer(left_expr), - self.convert_to_int_value_if_pointer(right_expr), + self.convert_to_int_value_if_pointer(left_expr)?, + self.convert_to_int_value_if_pointer(right_expr)?, "tmpVar", ) + .map_err(Into::::into)? .as_basic_value_enum()), Operator::LessOrEqual => Ok(self .llvm .builder .build_int_compare( IntPredicate::SLE, - self.convert_to_int_value_if_pointer(left_expr), - self.convert_to_int_value_if_pointer(right_expr), + self.convert_to_int_value_if_pointer(left_expr)?, + self.convert_to_int_value_if_pointer(right_expr)?, "tmpVar", ) + .map_err(Into::::into)? .as_basic_value_enum()), Operator::GreaterOrEqual => Ok(self .llvm .builder .build_int_compare( IntPredicate::SGE, - self.convert_to_int_value_if_pointer(left_expr), - self.convert_to_int_value_if_pointer(right_expr), + self.convert_to_int_value_if_pointer(left_expr)?, + self.convert_to_int_value_if_pointer(right_expr)?, "tmpVar", ) + .map_err(Into::::into)? .as_basic_value_enum()), _ => Err(Diagnostic::codegen_error( format!("Operator '{operator}' unimplemented for pointers").as_str(), @@ -1703,10 +1760,13 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { /// if the given `value` is a pointer value, it converts the pointer into an int_value to access the pointer's /// address, if the given `value` is already an IntValue it is returned as is - pub fn convert_to_int_value_if_pointer(&self, value: BasicValueEnum<'ink>) -> IntValue<'ink> { + pub fn convert_to_int_value_if_pointer( + &self, + value: BasicValueEnum<'ink>, + ) -> Result, CodegenDiagnostic> { match value { - BasicValueEnum::PointerValue(v) => self.ptr_as_value(v).into_int_value(), - BasicValueEnum::IntValue(v) => v, + BasicValueEnum::PointerValue(v) => Ok(self.ptr_as_value(v)?.into_int_value()), + BasicValueEnum::IntValue(v) => Ok(v), _ => unimplemented!(), } } @@ -1722,7 +1782,7 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { operator: &Operator, left_value: BasicValueEnum<'ink>, right_value: BasicValueEnum<'ink>, - ) -> BasicValueEnum<'ink> { + ) -> Result, CodegenDiagnostic> { let int_lvalue = left_value.into_int_value(); let int_rvalue = right_value.into_int_value(); @@ -1760,7 +1820,7 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { Operator::Or => self.llvm.builder.build_or(int_lvalue, int_rvalue, "tmpVar"), _ => unimplemented!(), }; - value.into() + Ok(value?.into()) } /// generates the result of a float binary-expression (+, -, *, /, %, ==) @@ -1774,57 +1834,59 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { operator: &Operator, lvalue: BasicValueEnum<'ink>, rvalue: BasicValueEnum<'ink>, - ) -> BasicValueEnum<'ink> { + ) -> Result, CodegenDiagnostic> { let float_lvalue = lvalue.into_float_value(); let float_rvalue = rvalue.into_float_value(); let value = match operator { - Operator::Plus => self.llvm.builder.build_float_add(float_lvalue, float_rvalue, "tmpVar").into(), - Operator::Minus => self.llvm.builder.build_float_sub(float_lvalue, float_rvalue, "tmpVar").into(), + Operator::Plus => self.llvm.builder.build_float_add(float_lvalue, float_rvalue, "tmpVar")?.into(), + Operator::Minus => { + self.llvm.builder.build_float_sub(float_lvalue, float_rvalue, "tmpVar")?.into() + } Operator::Multiplication => { - self.llvm.builder.build_float_mul(float_lvalue, float_rvalue, "tmpVar").into() + self.llvm.builder.build_float_mul(float_lvalue, float_rvalue, "tmpVar")?.into() } Operator::Division => { - self.llvm.builder.build_float_div(float_lvalue, float_rvalue, "tmpVar").into() + self.llvm.builder.build_float_div(float_lvalue, float_rvalue, "tmpVar")?.into() } Operator::Modulo => { - self.llvm.builder.build_float_rem(float_lvalue, float_rvalue, "tmpVar").into() + self.llvm.builder.build_float_rem(float_lvalue, float_rvalue, "tmpVar")?.into() } Operator::Equal => self .llvm .builder - .build_float_compare(FloatPredicate::OEQ, float_lvalue, float_rvalue, "tmpVar") + .build_float_compare(FloatPredicate::OEQ, float_lvalue, float_rvalue, "tmpVar")? .into(), Operator::NotEqual => self .llvm .builder - .build_float_compare(FloatPredicate::ONE, float_lvalue, float_rvalue, "tmpVar") + .build_float_compare(FloatPredicate::ONE, float_lvalue, float_rvalue, "tmpVar")? .into(), Operator::Less => self .llvm .builder - .build_float_compare(FloatPredicate::OLT, float_lvalue, float_rvalue, "tmpVar") + .build_float_compare(FloatPredicate::OLT, float_lvalue, float_rvalue, "tmpVar")? .into(), Operator::Greater => self .llvm .builder - .build_float_compare(FloatPredicate::OGT, float_lvalue, float_rvalue, "tmpVar") + .build_float_compare(FloatPredicate::OGT, float_lvalue, float_rvalue, "tmpVar")? .into(), Operator::LessOrEqual => self .llvm .builder - .build_float_compare(FloatPredicate::OLE, float_lvalue, float_rvalue, "tmpVar") + .build_float_compare(FloatPredicate::OLE, float_lvalue, float_rvalue, "tmpVar")? .into(), Operator::GreaterOrEqual => self .llvm .builder - .build_float_compare(FloatPredicate::OGE, float_lvalue, float_rvalue, "tmpVar") + .build_float_compare(FloatPredicate::OGE, float_lvalue, float_rvalue, "tmpVar")? .into(), _ => unimplemented!(), }; - value + Ok(value) } fn generate_numeric_literal( @@ -2212,29 +2274,32 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { .builder .build_int_compare( IntPredicate::EQ, - to_i1(self.generate_expression(left)?.into_int_value(), &self.llvm.builder), - to_i1(self.generate_expression(right)?.into_int_value(), &self.llvm.builder), + to_i1(self.generate_expression(left)?.into_int_value(), &self.llvm.builder)?, + to_i1(self.generate_expression(right)?.into_int_value(), &self.llvm.builder)?, "", ) + .map_err(CodegenDiagnostic::from)? .as_basic_value_enum()), Operator::NotEqual => Ok(self .llvm .builder .build_int_compare( IntPredicate::NE, - to_i1(self.generate_expression(left)?.into_int_value(), &self.llvm.builder), - to_i1(self.generate_expression(right)?.into_int_value(), &self.llvm.builder), + to_i1(self.generate_expression(left)?.into_int_value(), &self.llvm.builder)?, + to_i1(self.generate_expression(right)?.into_int_value(), &self.llvm.builder)?, "", ) + .map_err(CodegenDiagnostic::from)? .as_basic_value_enum()), Operator::Xor => Ok(self .llvm .builder .build_xor( - to_i1(self.generate_expression(left)?.into_int_value(), &self.llvm.builder), - to_i1(self.generate_expression(right)?.into_int_value(), &self.llvm.builder), + to_i1(self.generate_expression(left)?.into_int_value(), &self.llvm.builder)?, + to_i1(self.generate_expression(right)?.into_int_value(), &self.llvm.builder)?, "", ) + .map_err(CodegenDiagnostic::from)? .as_basic_value_enum()), _ => Err(Diagnostic::codegen_error( format!("illegal boolean expresspion for operator {operator:}").as_str(), @@ -2255,7 +2320,7 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { right: &AstNode, ) -> Result, Diagnostic> { let builder = &self.llvm.builder; - let lhs = to_i1(self.generate_expression(left)?.into_int_value(), builder); + let lhs = to_i1(self.generate_expression(left)?.into_int_value(), builder)?; let function = self.get_function_context(left)?.function; let right_branch = self.llvm.context.append_basic_block(function, ""); @@ -2265,8 +2330,12 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { //Compare left to 0 match operator { - Operator::Or => builder.build_conditional_branch(lhs, continue_branch, right_branch), - Operator::And => builder.build_conditional_branch(lhs, right_branch, continue_branch), + Operator::Or => builder + .build_conditional_branch(lhs, continue_branch, right_branch) + .map_err(CodegenDiagnostic::from)?, + Operator::And => builder + .build_conditional_branch(lhs, right_branch, continue_branch) + .map_err(CodegenDiagnostic::from)?, _ => { return Err(Diagnostic::codegen_error( format!("Cannot generate phi-expression for operator {operator:}"), @@ -2276,13 +2345,13 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { }; builder.position_at_end(right_branch); - let rhs = to_i1(self.generate_expression(right)?.into_int_value(), builder); + let rhs = to_i1(self.generate_expression(right)?.into_int_value(), builder)?; let final_right_block = builder.get_insert_block().expect(INTERNAL_LLVM_ERROR); - builder.build_unconditional_branch(continue_branch); + builder.build_unconditional_branch(continue_branch).map_err(CodegenDiagnostic::from)?; builder.position_at_end(continue_branch); //Generate phi - let phi_value = builder.build_phi(lhs.get_type(), ""); + let phi_value = builder.build_phi(lhs.get_type(), "").map_err(CodegenDiagnostic::from)?; //assert phi_value.add_incoming(&[(&lhs, final_left_block), (&rhs, final_right_block)]); @@ -2350,7 +2419,7 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { )?; } else { let expression = self.generate_expression(right_statement)?; - self.llvm.builder.build_store(left, expression); + self.llvm.builder.build_store(left, expression).map_err(CodegenDiagnostic::from)?; } Ok(()) } @@ -2397,10 +2466,11 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { _ => unreachable!("memcpy is not used for non-aggregate types"), }; - self.llvm + Ok(self + .llvm .builder .build_memcpy(left, alignment, right, alignment, size) - .map_err(|err| Diagnostic::codegen_error(err, left_location)) + .map_err(|it| CodegenDiagnostic::from(it).with_location(left_location))?) } /// returns an optional name used for a temporary variable when loading a pointer represented by `expression` @@ -2425,7 +2495,7 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { reference: ExpressionValue<'ink>, reference_annotation: &StatementAnnotation, access: &AstNode, - ) -> Result, ()> { + ) -> Result, Diagnostic> { let builder = &self.llvm.builder; // array access is either directly on a reference or on another array access (ARRAY OF ARRAY) @@ -2438,17 +2508,25 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { let struct_ptr = reference.get_basic_value_enum().into_pointer_value(); // GEPs into the VLA struct, getting an LValue for the array pointer and the dimension array and // dereferences the former - let arr_ptr_gep = self.llvm.builder.build_struct_gep(struct_ptr, 0, "vla_arr_gep")?; - let vla_arr_ptr = builder.build_load(arr_ptr_gep, "vla_arr_ptr").into_pointer_value(); + let arr_ptr_gep = self + .llvm + .builder + .build_struct_gep(struct_ptr, 0, "vla_arr_gep") + .map_err(CodegenDiagnostic::from)?; + let vla_arr_ptr = builder + .build_load(arr_ptr_gep, "vla_arr_ptr") + .map_err(CodegenDiagnostic::from)? + .into_pointer_value(); // get pointer to array containing dimension information - let dim_arr_gep = builder.build_struct_gep(struct_ptr, 1, "dim_arr").unwrap(); + let dim_arr_gep = + builder.build_struct_gep(struct_ptr, 1, "dim_arr").map_err(CodegenDiagnostic::from)?; // get lengths of dimensions let type_ = self.index.get_type_information_or_void(reference_type); let Some(ndims) = type_.get_type_information().get_dimensions() else { unreachable!() }; // get the start/end offsets for each dimension ( ARRAY[4..10, -4..4] ...) - let index_offsets = get_indices(self.llvm, ndims, dim_arr_gep); + let index_offsets = get_indices(self.llvm, ndims, dim_arr_gep)?; // calculate the required offset from the array pointer for the given accessor statements. this is // relatively straightforward for single-dimensional arrays, but is quite costly (O(n²)) for multi-dimensional arrays @@ -2457,47 +2535,47 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { let Some(stmt) = access_statements.first() else { unreachable!("Must have exactly 1 access statement") }; - let access_value = self.generate_expression(stmt).map_err(|_| ())?; + let access_value = self.generate_expression(stmt)?; // if start offset is not 0, adjust the access value accordingly let Some(start_offset) = index_offsets.first().map(|(start, _)| *start) else { unreachable!("VLA must have information about dimension offsets") }; - self.create_llvm_int_binary_expression(&Operator::Minus, access_value, start_offset.into()) + self.create_llvm_int_binary_expression(&Operator::Minus, access_value, start_offset.into())? .into_int_value() } else { // see https://plc-lang.github.io/rusty/arch/codegen.html#multi-dimensional-arrays // for more details on multi-dimensional array accessor calculation let accessors = access_statements .iter() - .map(|it| { - self.generate_expression(it) - .expect("Uncaught invalid accessor statement") - .into_int_value() - }) - .collect::>(); + .map(|it| Ok(self.generate_expression(it)?.into_int_value())) + .collect::, Diagnostic>>()?; if access_statements.len() != index_offsets.len() { unreachable!("Amount of access statements and dimensions does not match.") } // length of a dimension is 'end - start + 1' - let lengths = get_dimension_lengths(self.llvm, &index_offsets); + let lengths = get_dimension_lengths(self.llvm, &index_offsets)?; // calculate the accessor multiplicators for each dimension. - let dimension_offsets = get_vla_accessor_factors(self.llvm, &lengths); + let dimension_offsets = get_vla_accessor_factors(self.llvm, &lengths)?; // adjust accessors for 0-indexing - let adjusted_accessors = normalize_offsets(self.llvm, &accessors, &index_offsets); + let adjusted_accessors = normalize_offsets(self.llvm, &accessors, &index_offsets)?; // calculate the resulting accessor for the given accessor statements and dimension offsets int_value_multiply_accumulate( self.llvm, &adjusted_accessors.iter().zip(&dimension_offsets).collect::>(), - ) + )? }; - Ok(unsafe { builder.build_in_bounds_gep(vla_arr_ptr, &[accessor], "arr_val") }) + Ok(unsafe { + builder + .build_in_bounds_gep(vla_arr_ptr, &[accessor], "arr_val") + .map_err(CodegenDiagnostic::from)? + }) } /// generates a reference expression (member, index, deref, etc.) @@ -2565,7 +2643,7 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { let ptr = self.generate_expression_value(base)?; Ok(ExpressionValue::LValue( self.llvm - .load_pointer(&ptr.get_basic_value_enum().into_pointer_value(), "deref") + .load_pointer(&ptr.get_basic_value_enum().into_pointer_value(), "deref")? .into_pointer_value(), )) } @@ -2600,29 +2678,40 @@ impl<'ink, 'b> ExpressionCodeGenerator<'ink, 'b> { access: &DirectAccessType, index: &AstNode, ) -> Result, Diagnostic> { - let loaded_base_value = qualifier_value.as_r_value(self.llvm, self.get_load_name(qualifier)); + let loaded_base_value = qualifier_value.as_r_value(self.llvm, self.get_load_name(qualifier))?; let datatype = self.get_type_hint_info_for(member)?; let base_type = self.get_type_hint_for(qualifier)?; //Generate and load the index value let rhs = self.generate_direct_access_index(access, index, datatype, base_type)?; //Shift the qualifer value right by the index value - let shift = self.llvm.builder.build_right_shift( - loaded_base_value.into_int_value(), - rhs, - base_type.get_type_information().is_signed_int(), - "shift", - ); + let shift = self + .llvm + .builder + .build_right_shift( + loaded_base_value.into_int_value(), + rhs, + base_type.get_type_information().is_signed_int(), + "shift", + ) + .map_err(CodegenDiagnostic::from)?; //Trunc the result to the get only the target size - let value = self.llvm.builder.build_int_truncate_or_bit_cast( - shift, - self.llvm_index.get_associated_type(datatype.get_name())?.into_int_type(), - "", - ); + let value = self + .llvm + .builder + .build_int_truncate_or_bit_cast( + shift, + self.llvm_index.get_associated_type(datatype.get_name())?.into_int_type(), + "", + ) + .map_err(CodegenDiagnostic::from)?; let result = if datatype.get_type_information().is_bool() { // since booleans are i1 internally, but i8 in llvm, we need to bitwise-AND the value with 1 to make sure we end up with the expected value - self.llvm.builder.build_and(value, self.llvm.context.i8_type().const_int(1, false), "") + self.llvm + .builder + .build_and(value, self.llvm.context.i8_type().const_int(1, false), "") + .map_err(CodegenDiagnostic::from)? } else { value }; @@ -2668,11 +2757,11 @@ pub fn get_implicit_call_parameter<'a>( } /// turns the given IntValue into an i1 by comparing it to 0 (of the same size) -pub fn to_i1<'a>(value: IntValue<'a>, builder: &Builder<'a>) -> IntValue<'a> { +pub fn to_i1<'a>(value: IntValue<'a>, builder: &Builder<'a>) -> Result, CodegenDiagnostic> { if value.get_type().get_bit_width() > 1 { - builder.build_int_compare(IntPredicate::NE, value, value.get_type().const_int(0, false), "") + Ok(builder.build_int_compare(IntPredicate::NE, value, value.get_type().const_int(0, false), "")?) } else { - value + Ok(value) } } @@ -2685,7 +2774,7 @@ fn get_indices<'ink>( llvm: &Llvm<'ink>, ndims: usize, dimensions_array: PointerValue<'ink>, -) -> Vec<(IntValue<'ink>, IntValue<'ink>)> { +) -> Result, IntValue<'ink>)>, CodegenDiagnostic> { (0..ndims) .map(|i| unsafe { let (start_ptr, end_ptr) = ( @@ -2693,19 +2782,19 @@ fn get_indices<'ink>( dimensions_array, &[llvm.i32_type().const_zero(), llvm.i32_type().const_int(i as u64 * 2, false)], format!("start_idx_ptr{i}").as_str(), - ), + )?, llvm.builder.build_in_bounds_gep( dimensions_array, &[llvm.i32_type().const_zero(), llvm.i32_type().const_int(1 + i as u64 * 2, false)], format!("end_idx_ptr{i}").as_str(), - ), + )?, ); - ( - llvm.builder.build_load(start_ptr, format!("start_idx_value{i}").as_str()).into_int_value(), - llvm.builder.build_load(end_ptr, format!("end_idx_value{i}").as_str()).into_int_value(), - ) + Ok(( + llvm.builder.build_load(start_ptr, format!("start_idx_value{i}").as_str())?.into_int_value(), + llvm.builder.build_load(end_ptr, format!("end_idx_value{i}").as_str())?.into_int_value(), + )) }) - .collect::>() + .collect::, _>>() } /// Adjusts VLA accessor values to 0-indexed accessors @@ -2713,67 +2802,73 @@ fn normalize_offsets<'ink>( llvm: &Llvm<'ink>, accessors: &[IntValue<'ink>], offsets: &[(IntValue<'ink>, IntValue<'ink>)], -) -> Vec> { +) -> Result>, CodegenDiagnostic> { accessors .iter() .enumerate() .zip(offsets.iter().map(|(start, _)| start)) .map(|((idx, accessor), start_offset)| { - llvm.builder.build_int_sub(*accessor, *start_offset, format!("adj_access{idx}").as_str()) + Ok(llvm.builder.build_int_sub(*accessor, *start_offset, format!("adj_access{idx}").as_str())?) }) - .collect::>() + .collect::, _>>() } fn get_dimension_lengths<'ink>( llvm: &Llvm<'ink>, offsets: &[(IntValue<'ink>, IntValue<'ink>)], -) -> Vec> { +) -> Result>, CodegenDiagnostic> { offsets .iter() .enumerate() .map(|(idx, (start, end))| { - llvm.builder.build_int_add( + Ok(llvm.builder.build_int_add( llvm.i32_type().const_int(1, false), - llvm.builder.build_int_sub(*end, *start, ""), + llvm.builder.build_int_sub(*end, *start, "")?, format!("len_dim{idx}").as_str(), - ) + )?) }) - .collect::>() + .collect::, _>>() } -fn get_vla_accessor_factors<'ink>(llvm: &Llvm<'ink>, lengths: &[IntValue<'ink>]) -> Vec> { +fn get_vla_accessor_factors<'ink>( + llvm: &Llvm<'ink>, + lengths: &[IntValue<'ink>], +) -> Result>, CodegenDiagnostic> { (0..lengths.len()) .map(|idx| { if idx == lengths.len() - 1 { // the last dimension has a factor of 1 - llvm.i32_type().const_int(1, false) + Ok(llvm.i32_type().const_int(1, false)) } else { // for other dimensions, calculate size to the right - int_value_product(llvm, &lengths[idx + 1..lengths.len()]) + Ok(int_value_product(llvm, &lengths[idx + 1..lengths.len()])?) } }) - .collect::>() + .collect::, _>>() } /// Computes the product of all elements in a collection of IntValues /// /// a <- a * b -fn int_value_product<'ink>(llvm: &Llvm<'ink>, values: &[IntValue<'ink>]) -> IntValue<'ink> { +fn int_value_product<'ink>( + llvm: &Llvm<'ink>, + values: &[IntValue<'ink>], +) -> Result, CodegenDiagnostic> { // initialize the accumulator with 1 - let accum_ptr = llvm.builder.build_alloca(llvm.i32_type(), "accum"); - llvm.builder.build_store(accum_ptr, llvm.i32_type().const_int(1, false)); + let accum_ptr = llvm.builder.build_alloca(llvm.i32_type(), "accum")?; + llvm.builder.build_store(accum_ptr, llvm.i32_type().const_int(1, false))?; for val in values { // load previous value from accumulator and multiply with current value let product = llvm.builder.build_int_mul( - llvm.builder.build_load(accum_ptr, "load_accum").into_int_value(), + llvm.builder.build_load(accum_ptr, "load_accum")?.into_int_value(), *val, "product", - ); + )?; // store new value into accumulator - llvm.builder.build_store(accum_ptr, product); + llvm.builder.build_store(accum_ptr, product)?; } - llvm.builder.build_load(accum_ptr, "accessor_factor").into_int_value() + Ok(llvm.builder.build_load(accum_ptr, "accessor_factor")?.into_int_value()) } /// Iterates over a collection of tuples, computes the product of the two numbers @@ -2783,23 +2878,23 @@ fn int_value_product<'ink>(llvm: &Llvm<'ink>, values: &[IntValue<'ink>]) -> IntV fn int_value_multiply_accumulate<'ink>( llvm: &Llvm<'ink>, values: &[(&IntValue<'ink>, &IntValue<'ink>)], -) -> IntValue<'ink> { +) -> Result, CodegenDiagnostic> { // initialize the accumulator with 0 - let accum = llvm.builder.build_alloca(llvm.i32_type(), "accum"); - llvm.builder.build_store(accum, llvm.i32_type().const_zero()); + let accum = llvm.builder.build_alloca(llvm.i32_type(), "accum")?; + llvm.builder.build_store(accum, llvm.i32_type().const_zero())?; for (left, right) in values { // multiply accessor with dimension factor - let product = llvm.builder.build_int_mul(**left, **right, "multiply"); + let product = llvm.builder.build_int_mul(**left, **right, "multiply")?; // load previous value from accum and add product let curr = llvm.builder.build_int_add( - llvm.builder.build_load(accum, "load_accum").into_int_value(), + llvm.builder.build_load(accum, "load_accum")?.into_int_value(), product, "accumulate", - ); + )?; // store new value into accumulator - llvm.builder.build_store(accum, curr); + llvm.builder.build_store(accum, curr)?; } - llvm.builder.build_load(accum, "accessor").into_int_value() + Ok(llvm.builder.build_load(accum, "accessor")?.into_int_value()) } // XXX: Could be problematic with https://github.com/PLC-lang/rusty/issues/668 diff --git a/src/codegen/generators/llvm.rs b/src/codegen/generators/llvm.rs index 4dca0a578f..3fab7198aa 100644 --- a/src/codegen/generators/llvm.rs +++ b/src/codegen/generators/llvm.rs @@ -1,3 +1,4 @@ +use crate::codegen::diagnostics::CodegenDiagnostic; // Copyright (c) 2020 Ghaith Hachem and Mathias Rieder use crate::typesystem::{CHAR_TYPE, WCHAR_TYPE}; use inkwell::types::ArrayType; @@ -83,8 +84,12 @@ impl<'a> Llvm<'a> { /// /// - `name` the name of the local variable /// - `data_type` the variable's datatype - pub fn create_local_variable(&self, name: &str, data_type: &BasicTypeEnum<'a>) -> PointerValue<'a> { - self.builder.build_alloca(*data_type, name) + pub fn create_local_variable( + &self, + name: &str, + data_type: &BasicTypeEnum<'a>, + ) -> Result, CodegenDiagnostic> { + self.builder.build_alloca(*data_type, name).map_err(Into::into) } /// sets a const-zero initializer for the given global_value according to the given type @@ -114,8 +119,12 @@ impl<'a> Llvm<'a> { pointer_to_array_instance: PointerValue<'a>, accessor_sequence: &[IntValue<'a>], name: &str, - ) -> Result, Diagnostic> { - unsafe { Ok(self.builder.build_in_bounds_gep(pointer_to_array_instance, accessor_sequence, name)) } + ) -> Result, CodegenDiagnostic> { + unsafe { + self.builder + .build_in_bounds_gep(pointer_to_array_instance, accessor_sequence, name) + .map_err(Into::into) + } } /// creates a pointervalue that points to a member of a struct @@ -129,22 +138,21 @@ impl<'a> Llvm<'a> { pointer_to_struct_instance: PointerValue<'a>, member_index: u32, name: &str, - offset: &SourceLocation, - ) -> Result, Diagnostic> { - self.builder.build_struct_gep(pointer_to_struct_instance, member_index, name).map_err(|_| { - Diagnostic::codegen_error( - format!("Cannot generate qualified reference for {name:}"), - offset.clone(), - ) - }) + _offset: &SourceLocation, + ) -> Result, CodegenDiagnostic> { + self.builder.build_struct_gep(pointer_to_struct_instance, member_index, name).map_err(Into::into) } /// loads the value behind the given pointer /// /// - `lvalue` the pointer and it's datatype /// - `name` the name of the temporary variable - pub fn load_pointer(&self, lvalue: &PointerValue<'a>, name: &str) -> BasicValueEnum<'a> { - self.builder.build_load(lvalue.to_owned(), name) + pub fn load_pointer( + &self, + lvalue: &PointerValue<'a>, + name: &str, + ) -> Result, CodegenDiagnostic> { + self.builder.build_load(lvalue.to_owned(), name).map_err(Into::into) } /// creates a placeholder datatype for a struct with the given name @@ -187,7 +195,9 @@ impl<'a> Llvm<'a> { .ok_or_else(|| Diagnostic::codegen_error(format!("Cannot parse {value} as int"), location)) .map(BasicValueEnum::IntValue), BasicTypeEnum::FloatType { 0: float_type } => { - let value = float_type.const_float_from_string(value); + //todo: this is unsafe for now because llvm does no validaton, if we rely on the + //parsing having been done correctly we cound ignore the unsafe + let value = unsafe { float_type.const_float_from_string(value) }; Ok(BasicValueEnum::FloatValue(value)) } _ => Err(Diagnostic::codegen_error("expected numeric type", location)), diff --git a/src/codegen/generators/pou_generator.rs b/src/codegen/generators/pou_generator.rs index a9c2d01caf..3456cc6ec6 100644 --- a/src/codegen/generators/pou_generator.rs +++ b/src/codegen/generators/pou_generator.rs @@ -11,6 +11,7 @@ use super::{ use crate::{ codegen::{ debug::{Debug, DebugBuilderEnum}, + diagnostics::CodegenDiagnostic, llvm_index::LlvmTypedIndex, }, index::{self, ImplementationType}, @@ -39,7 +40,7 @@ use inkwell::{ values::PointerValue, }; use plc_ast::ast::{AstNode, Implementation, PouType}; -use plc_diagnostics::diagnostics::{Diagnostic, INTERNAL_LLVM_ERROR}; +use plc_diagnostics::diagnostics::Diagnostic; use plc_source::source_location::SourceLocation; use rustc_hash::FxHashMap; use section_mangler::{FunctionArgument, SectionMangler}; @@ -535,12 +536,12 @@ impl<'ink, 'cg> PouGenerator<'ink, 'cg> { let accessor = self.llvm.create_local_variable( ret_v.get_name(), &return_type.ptr_type(AddressSpace::from(ADDRESS_SPACE_GENERIC)).as_basic_type_enum(), - ); - self.llvm.builder.build_store(accessor, parameter); + )?; + self.llvm.builder.build_store(accessor, parameter).map_err(CodegenDiagnostic::from)?; accessor } else { // function return is a real return - self.llvm.create_local_variable(type_name, &return_type) + self.llvm.create_local_variable(type_name, &return_type)? }; index.associate_loaded_local_variable(type_name, ret_v.get_name(), return_variable)?; } @@ -556,7 +557,7 @@ impl<'ink, 'cg> PouGenerator<'ink, 'cg> { let member_type_name = m.get_type_name(); let type_info = self.index.get_type_information_or_void(member_type_name); let ty = index.get_associated_type(member_type_name)?; - let ptr = self.llvm.create_local_variable(m.get_name(), &ty); + let ptr = self.llvm.create_local_variable(m.get_name(), &ty)?; if let Some(block) = self.llvm.builder.get_insert_block() { debug.add_variable_declaration( m.get_qualified_name(), @@ -579,7 +580,12 @@ impl<'ink, 'cg> PouGenerator<'ink, 'cg> { } else { ty.into_struct_type().ptr_type(AddressSpace::from(ADDRESS_SPACE_GENERIC)) }; - let bitcast = self.llvm.builder.build_bitcast(ptr, ty, "bitcast").into_pointer_value(); + let bitcast = self + .llvm + .builder + .build_bit_cast(ptr, ty, "bitcast") + .map_err(CodegenDiagnostic::from)? + .into_pointer_value(); let (size, alignment) = if let DataTypeInformation::String { size, encoding } = type_info { // since passed string args might be larger than the local acceptor, we need to first memset the local variable to 0 @@ -595,7 +601,10 @@ impl<'ink, 'cg> PouGenerator<'ink, 'cg> { self.llvm.context.i8_type().const_zero(), self.llvm.context.i64_type().const_int(size * char_width as u64, true), ) - .map_err(|e| Diagnostic::codegen_error(e, m.source_location.clone()))?; + .map_err(|e| { + Diagnostic::from(CodegenDiagnostic::from(e)) + .with_location(m.source_location.clone()) + })?; ( // we then reduce the amount of bytes to be memcopied by the equivalent of one grapheme in bytes to preserve the null-terminator self.llvm.context.i64_type().const_int((size - 1) * char_width as u64, true), @@ -614,15 +623,18 @@ impl<'ink, 'cg> PouGenerator<'ink, 'cg> { self.llvm .builder .build_memcpy(bitcast, alignment, ptr_value.into_pointer_value(), alignment, size) - .map_err(|e| Diagnostic::codegen_error(e, m.source_location.clone()))?; + .map_err(|e| { + Diagnostic::from(CodegenDiagnostic::from(e)) + .with_location(m.source_location.clone()) + })?; } else { - self.llvm.builder.build_store(ptr, ptr_value); + self.llvm.builder.build_store(ptr, ptr_value).map_err(CodegenDiagnostic::from)?; }; (parameter_name, ptr) } else { let temp_type = index.get_associated_type(m.get_type_name())?; - let value = self.llvm.create_local_variable(parameter_name, &temp_type); + let value = self.llvm.create_local_variable(parameter_name, &temp_type)?; (parameter_name, value) }; @@ -668,13 +680,13 @@ impl<'ink, 'cg> PouGenerator<'ink, 'cg> { let (name, variable) = if m.is_temp() || m.is_return() { let temp_type = index.get_associated_type(m.get_type_name())?; - (parameter_name, self.llvm.create_local_variable(parameter_name, &temp_type)) + (parameter_name, self.llvm.create_local_variable(parameter_name, &temp_type)?) } else { let ptr = self .llvm .builder .build_struct_gep(param_pointer, var_count as u32, parameter_name) - .expect(INTERNAL_LLVM_ERROR); + .map_err(CodegenDiagnostic::from)?; var_count += 1; @@ -784,7 +796,11 @@ impl<'ink, 'cg> PouGenerator<'ink, 'cg> { let is_aggregate_type = variable_data_type.is_aggregate_type(); let variable_to_initialize = if variable.is_return() && is_aggregate_type { //if this is an out-pointer we need to deref it first - self.llvm.builder.build_load(variable_to_initialize, "deref").into_pointer_value() + self.llvm + .builder + .build_load(variable_to_initialize, "deref") + .map_err(CodegenDiagnostic::from)? + .into_pointer_value() } else { variable_to_initialize }; @@ -793,7 +809,7 @@ impl<'ink, 'cg> PouGenerator<'ink, 'cg> { if is_aggregate_type { // for arrays/structs, we prefere a memcpy, not a store operation // we assume that we got a global variable with the initial value that we can copy from - let init_result: Result<(), &str> = if value.is_pointer_value() { + let init_result: Result<(), CodegenDiagnostic> = if value.is_pointer_value() { // mem-copy from an global constant variable self.llvm .builder @@ -805,6 +821,7 @@ impl<'ink, 'cg> PouGenerator<'ink, 'cg> { type_size?, ) .map(|_| ()) + .map_err(|it| CodegenDiagnostic::from(it).with_location(variable.source_location.clone())) } else if value.is_int_value() { // mem-set the value (usually 0) over the whole memory-area self.llvm @@ -816,12 +833,13 @@ impl<'ink, 'cg> PouGenerator<'ink, 'cg> { type_size?, ) .map(|_| ()) + .map_err(|it| CodegenDiagnostic::from(it).with_location(variable.source_location.clone())) } else { unreachable!("initializing an array should be memcpy-able or memset-able"); }; - init_result.map_err(|msg| Diagnostic::codegen_error(msg, variable.source_location.clone()))?; + init_result?; } else { - self.llvm.builder.build_store(variable_to_initialize, value); + self.llvm.builder.build_store(variable_to_initialize, value).map_err(CodegenDiagnostic::from)?; } Ok(()) } diff --git a/src/codegen/generators/statement_generator.rs b/src/codegen/generators/statement_generator.rs index 7c053ddf93..c1b3cde212 100644 --- a/src/codegen/generators/statement_generator.rs +++ b/src/codegen/generators/statement_generator.rs @@ -6,6 +6,7 @@ use super::{ use crate::{ codegen::{ debug::{Debug, DebugBuilderEnum}, + diagnostics::CodegenDiagnostic, llvm_typesystem::cast_if_needed, LlvmTypedIndex, }, @@ -145,7 +146,7 @@ impl<'a, 'b> StatementCodeGenerator<'a, 'b> { if let Some(block) = self.function_context.blocks.get(name) { //unconditionally jump to the label self.register_debug_location(statement); - self.llvm.builder.build_unconditional_branch(*block); + self.llvm.builder.build_unconditional_branch(*block).map_err(CodegenDiagnostic::from)?; //Place the current instert block at the label statement self.llvm.builder.position_at_end(*block); } @@ -173,18 +174,20 @@ impl<'a, 'b> StatementCodeGenerator<'a, 'b> { let condition = expression_generator.generate_expression(condition)?; self.register_debug_location(statement); - self.llvm.builder.build_conditional_branch( - condition.into_int_value(), - *then_block, - else_block, - ); + self.llvm + .builder + .build_conditional_branch(condition.into_int_value(), *then_block, else_block) + .map_err(CodegenDiagnostic::from)?; // Make sure further code is at the else block self.llvm.builder.position_at_end(else_block); } AstStatement::ExitStatement(_) => { if let Some(exit_block) = &self.current_loop_exit { self.register_debug_location(statement); - self.llvm.builder.build_unconditional_branch(*exit_block); + self.llvm + .builder + .build_unconditional_branch(*exit_block) + .map_err(CodegenDiagnostic::from)?; self.generate_buffer_block(); } else { return Err(Diagnostic::codegen_error( @@ -195,7 +198,10 @@ impl<'a, 'b> StatementCodeGenerator<'a, 'b> { } AstStatement::ContinueStatement(_) => { if let Some(cont_block) = &self.current_loop_continue { - self.llvm.builder.build_unconditional_branch(*cont_block); + self.llvm + .builder + .build_unconditional_branch(*cont_block) + .map_err(CodegenDiagnostic::from)?; self.generate_buffer_block(); } else { return Err(Diagnostic::codegen_error( @@ -257,7 +263,10 @@ impl<'a, 'b> StatementCodeGenerator<'a, 'b> { }; let right_expr_val = ref_builtin.codegen(&exp, &[&right], right.get_location())?; - self.llvm.builder.build_store(left_ptr_val, right_expr_val.get_basic_value_enum()); + self.llvm + .builder + .build_store(left_ptr_val, right_expr_val.get_basic_value_enum()) + .map_err(CodegenDiagnostic::from)?; Ok(()) } @@ -321,7 +330,7 @@ impl<'a, 'b> StatementCodeGenerator<'a, 'b> { unreachable!("Invalid direct-access expression: {left_statement:#?}") }; let left_expr_value = exp_gen.generate_expression_value(base)?; - let left_value = left_expr_value.as_r_value(self.llvm, None).into_int_value(); + let left_value = left_expr_value.as_r_value(self.llvm, None)?.into_int_value(); let left_pointer = left_expr_value.get_basic_value_enum().into_pointer_value(); // Generate an expression for the right size @@ -372,7 +381,7 @@ impl<'a, 'b> StatementCodeGenerator<'a, 'b> { || self.llvm.create_const_numeric(&cast_target_llty, "1", SourceLocation::undefined()), |step_ty| { let step = exp_gen.generate_expression(by_step.as_ref().unwrap())?; - Ok(cast_if_needed!(exp_gen, cast_target_ty, step_ty, step, None)) + Ok(cast_if_needed!(exp_gen, cast_target_ty, step_ty, step, None)?) }, ) }; @@ -390,39 +399,49 @@ impl<'a, 'b> StatementCodeGenerator<'a, 'b> { // XXX(mhasel): IR could possibly be improved by generating phi instructions. // Candidate for frontend optimization for builds without optimization when `STEP` // is a compile-time constant - let is_incrementing = builder.build_int_compare( - inkwell::IntPredicate::SGT, - eval_step()?.into_int_value(), - self.llvm - .create_const_numeric(&cast_target_llty, "0", SourceLocation::undefined())? - .into_int_value(), - "is_incrementing", - ); - builder.build_conditional_branch(is_incrementing, predicate_incrementing, predicate_decrementing); + let is_incrementing = builder + .build_int_compare( + inkwell::IntPredicate::SGT, + eval_step()?.into_int_value(), + self.llvm + .create_const_numeric(&cast_target_llty, "0", SourceLocation::undefined())? + .into_int_value(), + "is_incrementing", + ) + .map_err(CodegenDiagnostic::from)?; + builder + .build_conditional_branch(is_incrementing, predicate_incrementing, predicate_decrementing) + .map_err(CodegenDiagnostic::from)?; // generate predicates for incrementing and decrementing counters - let generate_predicate = |predicate| { + let generate_predicate = |predicate| -> Result<(), Diagnostic> { builder.position_at_end(match predicate { inkwell::IntPredicate::SLE => predicate_incrementing, inkwell::IntPredicate::SGE => predicate_decrementing, _ => unreachable!(), }); - let end = exp_gen.generate_expression_value(end).unwrap(); + let end = exp_gen.generate_expression_value(end)?; let end_value = match end { - ExpressionValue::LValue(ptr) => builder.build_load(ptr, ""), + ExpressionValue::LValue(ptr) => { + builder.build_load(ptr, "").map_err(CodegenDiagnostic::from)? + } ExpressionValue::RValue(val) => val, }; - let counter_value = builder.build_load(counter, ""); - let cmp = builder.build_int_compare( - predicate, - cast_if_needed!(exp_gen, cast_target_ty, counter_ty, counter_value, None).into_int_value(), - cast_if_needed!(exp_gen, cast_target_ty, end_ty, end_value, None).into_int_value(), - "condition", - ); - builder.build_conditional_branch(cmp, loop_body, afterloop); + let counter_value = builder.build_load(counter, "").map_err(CodegenDiagnostic::from)?; + let cmp = builder + .build_int_compare( + predicate, + cast_if_needed!(exp_gen, cast_target_ty, counter_ty, counter_value, None)? + .into_int_value(), + cast_if_needed!(exp_gen, cast_target_ty, end_ty, end_value, None)?.into_int_value(), + "condition", + ) + .map_err(CodegenDiagnostic::from)?; + builder.build_conditional_branch(cmp, loop_body, afterloop).map_err(CodegenDiagnostic::from)?; + Ok(()) }; - generate_predicate(inkwell::IntPredicate::SLE); - generate_predicate(inkwell::IntPredicate::SGE); + generate_predicate(inkwell::IntPredicate::SLE)?; + generate_predicate(inkwell::IntPredicate::SGE)?; // generate loop body builder.position_at_end(loop_body); @@ -436,21 +455,30 @@ impl<'a, 'b> StatementCodeGenerator<'a, 'b> { body_builder.generate_body(body)?; // increment counter - builder.build_unconditional_branch(increment); + builder.build_unconditional_branch(increment).map_err(CodegenDiagnostic::from)?; builder.position_at_end(increment); - let counter_value = builder.build_load(counter, ""); - let inc = inkwell::values::BasicValue::as_basic_value_enum(&builder.build_int_add( - eval_step()?.into_int_value(), - cast_if_needed!(exp_gen, cast_target_ty, counter_ty, counter_value, None).into_int_value(), - "next", - )); - builder.build_store( - counter, - cast_if_needed!(exp_gen, counter_ty, cast_target_ty, inc, None).into_int_value(), + let counter_value = builder.build_load(counter, "").map_err(CodegenDiagnostic::from)?; + let inc = inkwell::values::BasicValue::as_basic_value_enum( + &builder + .build_int_add( + eval_step()?.into_int_value(), + cast_if_needed!(exp_gen, cast_target_ty, counter_ty, counter_value, None)? + .into_int_value(), + "next", + ) + .map_err(CodegenDiagnostic::from)?, ); + builder + .build_store( + counter, + cast_if_needed!(exp_gen, counter_ty, cast_target_ty, inc, None)?.into_int_value(), + ) + .map_err(CodegenDiagnostic::from)?; // check condition - builder.build_conditional_branch(is_incrementing, predicate_incrementing, predicate_decrementing); + builder + .build_conditional_branch(is_incrementing, predicate_incrementing, predicate_decrementing) + .map_err(CodegenDiagnostic::from)?; // continue builder.position_at_end(afterloop); Ok(()) @@ -514,17 +542,19 @@ impl<'a, 'b> StatementCodeGenerator<'a, 'b> { builder.position_at_end(case_block); self.generate_body(&conditional_block.body)?; // skiop all other case-bodies - builder.build_unconditional_branch(continue_block); + builder.build_unconditional_branch(continue_block).map_err(CodegenDiagnostic::from)?; } // current-else is the last else-block generated by the range-expressions builder.position_at_end(current_else_block); self.generate_body(else_body)?; - builder.build_unconditional_branch(continue_block); + builder.build_unconditional_branch(continue_block).map_err(CodegenDiagnostic::from)?; continue_block.move_after(current_else_block).expect(INTERNAL_LLVM_ERROR); // now that we collected all cases, go back to the initial block and generate the switch-statement builder.position_at_end(basic_block); - builder.build_switch(selector_statement.into_int_value(), else_block, &cases); + builder + .build_switch(selector_statement.into_int_value(), else_block, &cases) + .map_err(CodegenDiagnostic::from)?; builder.position_at_end(continue_block); Ok(()) @@ -551,28 +581,24 @@ impl<'a, 'b> StatementCodeGenerator<'a, 'b> { let start_val = exp_gen.generate_expression(start)?; self.register_debug_location(selector); let selector_val = exp_gen.generate_expression(selector)?; - exp_gen.create_llvm_int_binary_expression(&Operator::GreaterOrEqual, selector_val, start_val) + exp_gen.create_llvm_int_binary_expression(&Operator::GreaterOrEqual, selector_val, start_val)? }; //jmp to continue if the value is smaller than start - builder.build_conditional_branch( - to_i1(lower_bound.into_int_value(), builder), - range_then, - range_else, - ); + builder + .build_conditional_branch(to_i1(lower_bound.into_int_value(), builder)?, range_then, range_else) + .map_err(CodegenDiagnostic::from)?; builder.position_at_end(range_then); let upper_bound = { self.register_debug_location(end); let end_val = exp_gen.generate_expression(end)?; self.register_debug_location(selector); let selector_val = exp_gen.generate_expression(selector)?; - exp_gen.create_llvm_int_binary_expression(&Operator::LessOrEqual, selector_val, end_val) + exp_gen.create_llvm_int_binary_expression(&Operator::LessOrEqual, selector_val, end_val)? }; - builder.build_conditional_branch( - to_i1(upper_bound.into_int_value(), builder), - match_block, - range_else, - ); + builder + .build_conditional_branch(to_i1(upper_bound.into_int_value(), builder)?, match_block, range_else) + .map_err(CodegenDiagnostic::from)?; Ok(range_else) } @@ -592,7 +618,7 @@ impl<'a, 'b> StatementCodeGenerator<'a, 'b> { let continue_block = builder.get_insert_block().expect(INTERNAL_LLVM_ERROR); builder.position_at_end(basic_block); - builder.build_unconditional_branch(condition_block); + builder.build_unconditional_branch(condition_block).map_err(CodegenDiagnostic::from)?; builder.position_at_end(continue_block); Ok(()) @@ -622,7 +648,7 @@ impl<'a, 'b> StatementCodeGenerator<'a, 'b> { let continue_block = builder.get_insert_block().expect(INTERNAL_LLVM_ERROR); builder.position_at_end(basic_block); - builder.build_unconditional_branch(while_block); + builder.build_unconditional_branch(while_block).map_err(CodegenDiagnostic::from)?; builder.position_at_end(continue_block); Ok(()) @@ -643,11 +669,13 @@ impl<'a, 'b> StatementCodeGenerator<'a, 'b> { builder.position_at_end(condition_check); self.register_debug_location(condition); let condition_value = self.create_expr_generator().generate_expression(condition)?; - builder.build_conditional_branch( - to_i1(condition_value.into_int_value(), builder), - while_body, - continue_block, - ); + builder + .build_conditional_branch( + to_i1(condition_value.into_int_value(), builder)?, + while_body, + continue_block, + ) + .map_err(CodegenDiagnostic::from)?; //Enter the for loop builder.position_at_end(while_body); @@ -660,7 +688,7 @@ impl<'a, 'b> StatementCodeGenerator<'a, 'b> { }; body_generator.generate_body(body)?; //Loop back - builder.build_unconditional_branch(condition_check); + builder.build_unconditional_branch(condition_check).map_err(CodegenDiagnostic::from)?; //Continue builder.position_at_end(continue_block); @@ -704,24 +732,26 @@ impl<'a, 'b> StatementCodeGenerator<'a, 'b> { let conditional_block = context.prepend_basic_block(else_block, "condition_body"); //Generate if statement condition - builder.build_conditional_branch( - to_i1(condition.into_int_value(), builder), - conditional_block, - else_block, - ); + builder + .build_conditional_branch( + to_i1(condition.into_int_value(), builder)?, + conditional_block, + else_block, + ) + .map_err(CodegenDiagnostic::from)?; //Generate if statement content builder.position_at_end(conditional_block); self.generate_body(&block.body)?; - builder.build_unconditional_branch(continue_block); + builder.build_unconditional_branch(continue_block).map_err(CodegenDiagnostic::from)?; } //Else if let Some(else_block) = else_block { builder.position_at_end(else_block); self.generate_body(else_body)?; - builder.build_unconditional_branch(continue_block); + builder.build_unconditional_branch(continue_block).map_err(CodegenDiagnostic::from)?; } //Continue builder.position_at_end(continue_block); @@ -742,7 +772,7 @@ impl<'a, 'b> StatementCodeGenerator<'a, 'b> { .unwrap_or(false) { //generate return void - self.llvm.builder.build_return(None); + self.llvm.builder.build_return(None).map_err(CodegenDiagnostic::from)?; } else { // renerate return statement let call_name = self.function_context.linking_context.get_call_name(); @@ -755,11 +785,11 @@ impl<'a, 'b> StatementCodeGenerator<'a, 'b> { SourceLocation::undefined(), ) })?; - let loaded_value = self.llvm.load_pointer(&value_ptr, var_name.as_str()); - self.llvm.builder.build_return(Some(&loaded_value)); + let loaded_value = self.llvm.load_pointer(&value_ptr, var_name.as_str())?; + self.llvm.builder.build_return(Some(&loaded_value)).map_err(CodegenDiagnostic::from)?; } } else { - self.llvm.builder.build_return(None); + self.llvm.builder.build_return(None).map_err(CodegenDiagnostic::from)?; } Ok(()) } @@ -779,11 +809,14 @@ impl<'a, 'b> StatementCodeGenerator<'a, 'b> { let then_block = self.llvm.context.append_basic_block(self.function_context.function, "then_block"); let else_block = self.llvm.context.append_basic_block(self.function_context.function, "else_block"); - self.llvm.builder.build_conditional_branch( - to_i1(condition.into_int_value(), &self.llvm.builder), - then_block, - else_block, - ); + self.llvm + .builder + .build_conditional_branch( + to_i1(condition.into_int_value(), &self.llvm.builder)?, + then_block, + else_block, + ) + .map_err(CodegenDiagnostic::from)?; self.llvm.builder.position_at_end(then_block); self.register_debug_location(statement); diff --git a/src/codegen/generators/variable_generator.rs b/src/codegen/generators/variable_generator.rs index 08b99db2fb..7493d09871 100644 --- a/src/codegen/generators/variable_generator.rs +++ b/src/codegen/generators/variable_generator.rs @@ -148,7 +148,7 @@ impl<'ctx, 'b> VariableGenerator<'ctx, 'b> { let value = expr_generator.generate_expression(initializer)?; let target_type = self.global_index.get_effective_type_or_void_by_name(type_name); let value_type = self.annotations.get_type_or_void(initializer, self.global_index); - Some(cast_if_needed!(expr_generator, target_type, value_type, value, None)) + Some(cast_if_needed!(expr_generator, target_type, value_type, value, None)?) } } else { None diff --git a/src/codegen/llvm_typesystem.rs b/src/codegen/llvm_typesystem.rs index 5082365452..9b12f168b5 100644 --- a/src/codegen/llvm_typesystem.rs +++ b/src/codegen/llvm_typesystem.rs @@ -11,7 +11,7 @@ use crate::{ typesystem::{DataType, DataTypeInformation, InternalType, StructSource}, }; -use super::{generators::llvm::Llvm, llvm_index::LlvmTypedIndex}; +use super::{diagnostics::CodegenDiagnostic, generators::llvm::Llvm, llvm_index::LlvmTypedIndex}; /// A convenience macro to call the `cast` function with fewer parameters. /// @@ -88,7 +88,7 @@ pub fn cast<'ctx>( value_type: &DataType, value: BasicValueEnum<'ctx>, annotation: Option<&StatementAnnotation>, -) -> BasicValueEnum<'ctx> { +) -> Result, CodegenDiagnostic> { value.cast(&CastInstructionData::new(llvm, index, llvm_type_index, value_type, target_type, annotation)) } @@ -126,31 +126,48 @@ impl<'ctx, 'cast> CastInstructionData<'ctx, 'cast> { } trait Castable<'ctx, 'cast> { - fn cast(self, cast_data: &CastInstructionData<'ctx, 'cast>) -> BasicValueEnum<'ctx>; + fn cast( + self, + cast_data: &CastInstructionData<'ctx, 'cast>, + ) -> Result, CodegenDiagnostic>; } trait Promotable<'ctx, 'cast> { - fn promote(self, lsize: u32, cast_data: &CastInstructionData<'ctx, 'cast>) -> BasicValueEnum<'ctx>; + fn promote( + self, + lsize: u32, + cast_data: &CastInstructionData<'ctx, 'cast>, + ) -> Result, CodegenDiagnostic>; } trait Truncatable<'ctx, 'cast> { - fn truncate(self, lsize: u32, cast_data: &CastInstructionData<'ctx, 'cast>) -> BasicValueEnum<'ctx>; + fn truncate( + self, + lsize: u32, + cast_data: &CastInstructionData<'ctx, 'cast>, + ) -> Result, CodegenDiagnostic>; } impl<'ctx, 'cast> Castable<'ctx, 'cast> for BasicValueEnum<'ctx> { - fn cast(self, cast_data: &CastInstructionData<'ctx, 'cast>) -> BasicValueEnum<'ctx> { + fn cast( + self, + cast_data: &CastInstructionData<'ctx, 'cast>, + ) -> Result, CodegenDiagnostic> { match self { BasicValueEnum::IntValue(val) => val.cast(cast_data), BasicValueEnum::FloatValue(val) => val.cast(cast_data), BasicValueEnum::PointerValue(val) => val.cast(cast_data), BasicValueEnum::ArrayValue(val) => val.cast(cast_data), - _ => self, + _ => Ok(self), } } } impl<'ctx, 'cast> Castable<'ctx, 'cast> for IntValue<'ctx> { - fn cast(self, cast_data: &CastInstructionData<'ctx, 'cast>) -> BasicValueEnum<'ctx> { + fn cast( + self, + cast_data: &CastInstructionData<'ctx, 'cast>, + ) -> Result, CodegenDiagnostic> { let lsize = cast_data.target_type.get_size_in_bits(cast_data.index); match cast_data.target_type { DataTypeInformation::Integer { .. } => { @@ -167,9 +184,19 @@ impl<'ctx, 'cast> Castable<'ctx, 'cast> for IntValue<'ctx> { DataTypeInformation::Float { .. } => { let float_type = get_llvm_float_type(cast_data.llvm.context, lsize, "Float"); if cast_data.value_type.is_signed_int() { - cast_data.llvm.builder.build_signed_int_to_float(self, float_type, "").into() + cast_data + .llvm + .builder + .build_signed_int_to_float(self, float_type, "") + .map(Into::into) + .map_err(Into::into) } else { - cast_data.llvm.builder.build_unsigned_int_to_float(self, float_type, "").into() + cast_data + .llvm + .builder + .build_unsigned_int_to_float(self, float_type, "") + .map(Into::into) + .map_err(Into::into) } } DataTypeInformation::Pointer { .. } => { @@ -182,7 +209,12 @@ impl<'ctx, 'cast> Castable<'ctx, 'cast> for IntValue<'ctx> { ) }; - cast_data.llvm.builder.build_int_to_ptr(self, associated_type.into_pointer_type(), "").into() + cast_data + .llvm + .builder + .build_int_to_ptr(self, associated_type.into_pointer_type(), "") + .map(Into::into) + .map_err(Into::into) } _ => unreachable!("Cannot cast integer value to {}", cast_data.target_type.get_name()), } @@ -190,7 +222,10 @@ impl<'ctx, 'cast> Castable<'ctx, 'cast> for IntValue<'ctx> { } impl<'ctx, 'cast> Castable<'ctx, 'cast> for FloatValue<'ctx> { - fn cast(self, cast_data: &CastInstructionData<'ctx, 'cast>) -> BasicValueEnum<'ctx> { + fn cast( + self, + cast_data: &CastInstructionData<'ctx, 'cast>, + ) -> Result, CodegenDiagnostic> { let rsize = &cast_data.value_type.get_size_in_bits(cast_data.index); match cast_data.target_type { DataTypeInformation::Float { size: lsize, .. } => { @@ -203,9 +238,19 @@ impl<'ctx, 'cast> Castable<'ctx, 'cast> for FloatValue<'ctx> { DataTypeInformation::Integer { signed, size: lsize, .. } => { let int_type = get_llvm_int_type(cast_data.llvm.context, *lsize, "Integer"); if *signed { - cast_data.llvm.builder.build_float_to_signed_int(self, int_type, "").into() + cast_data + .llvm + .builder + .build_float_to_signed_int(self, int_type, "") + .map(Into::into) + .map_err(Into::into) } else { - cast_data.llvm.builder.build_float_to_unsigned_int(self, int_type, "").into() + cast_data + .llvm + .builder + .build_float_to_unsigned_int(self, int_type, "") + .map(Into::into) + .map_err(Into::into) } } _ => unreachable!("Cannot cast floating-point value to {}", cast_data.target_type.get_name()), @@ -214,13 +259,17 @@ impl<'ctx, 'cast> Castable<'ctx, 'cast> for FloatValue<'ctx> { } impl<'ctx, 'cast> Castable<'ctx, 'cast> for PointerValue<'ctx> { - fn cast(self, cast_data: &CastInstructionData<'ctx, 'cast>) -> BasicValueEnum<'ctx> { + fn cast( + self, + cast_data: &CastInstructionData<'ctx, 'cast>, + ) -> Result, CodegenDiagnostic> { match &cast_data.target_type { DataTypeInformation::Integer { size: lsize, .. } => cast_data .llvm .builder .build_ptr_to_int(self, get_llvm_int_type(cast_data.llvm.context, *lsize, ""), "") - .into(), + .map(Into::into) + .map_err(Into::into), DataTypeInformation::Pointer { .. } => { let Ok(target_ptr_type) = cast_data.llvm_type_index.get_associated_type(cast_data.target_type.get_name()) @@ -232,10 +281,10 @@ impl<'ctx, 'cast> Castable<'ctx, 'cast> for PointerValue<'ctx> { }; if BasicValueEnum::from(self).get_type() != target_ptr_type { // bit-cast necessary - cast_data.llvm.builder.build_bitcast(self, target_ptr_type, "") + cast_data.llvm.builder.build_bit_cast(self, target_ptr_type, "").map_err(Into::into) } else { //this is ok, no cast required - self.into() + Ok(self.into()) } } DataTypeInformation::Struct { @@ -243,12 +292,13 @@ impl<'ctx, 'cast> Castable<'ctx, 'cast> for PointerValue<'ctx> { .. } => { // we are dealing with an auto-deref vla parameter. first we have to deref our array and build the fat pointer - let struct_val = cast_data.llvm.builder.build_load(self, "auto_deref").cast(cast_data); + let struct_val = cast_data.llvm.builder.build_load(self, "auto_deref")?.cast(cast_data)?; // create a pointer to the generated StructValue - let struct_ptr = cast_data.llvm.builder.build_alloca(struct_val.get_type(), "vla_struct_ptr"); - cast_data.llvm.builder.build_store(struct_ptr, struct_val); - struct_ptr.into() + let struct_ptr = + cast_data.llvm.builder.build_alloca(struct_val.get_type(), "vla_struct_ptr")?; + cast_data.llvm.builder.build_store(struct_ptr, struct_val)?; + Ok(struct_ptr.into()) } _ => unreachable!("Cannot cast pointer value to {}", cast_data.target_type.get_name()), } @@ -258,9 +308,12 @@ impl<'ctx, 'cast> Castable<'ctx, 'cast> for PointerValue<'ctx> { impl<'ctx, 'cast> Castable<'ctx, 'cast> for ArrayValue<'ctx> { /// Generates a fat pointer struct for an array if the target type is a VLA, /// otherwise returns the value as is. - fn cast(self, cast_data: &CastInstructionData<'ctx, 'cast>) -> BasicValueEnum<'ctx> { + fn cast( + self, + cast_data: &CastInstructionData<'ctx, 'cast>, + ) -> Result, CodegenDiagnostic> { if !cast_data.target_type.is_vla() { - return self.into(); + return Ok(self.into()); } let builder = &cast_data.llvm.builder; let zero = cast_data.llvm.i32_type().const_zero(); @@ -284,19 +337,15 @@ impl<'ctx, 'cast> Castable<'ctx, 'cast> for ArrayValue<'ctx> { .unwrap_or_else(|| unreachable!("passed array must be in the llvm index")); // gep into the original array. the resulting address will be stored in the VLA struct - let arr_gep = unsafe { builder.build_in_bounds_gep(array_pointer, &[zero, zero], "outer_arr_gep") }; + let arr_gep = unsafe { builder.build_in_bounds_gep(array_pointer, &[zero, zero], "outer_arr_gep")? }; // -- Generate struct & arr_ptr -- let ty = associated_type.into_struct_type(); - let vla_struct = builder.build_alloca(ty, "vla_struct"); + let vla_struct = builder.build_alloca(ty, "vla_struct")?; - let Ok(vla_arr_ptr) = builder.build_struct_gep(vla_struct, 0, "vla_array_gep") else { - unreachable!("Must have a valid, GEP-able fat-pointer struct at this stage") - }; + let vla_arr_ptr = builder.build_struct_gep(vla_struct, 0, "vla_array_gep")?; - let Ok(vla_dimensions_ptr) = builder.build_struct_gep(vla_struct, 1, "vla_dimensions_gep") else { - unreachable!("Must have a valid, GEP-able fat-pointer struct at this stage") - }; + let vla_dimensions_ptr = builder.build_struct_gep(vla_struct, 1, "vla_dimensions_gep")?; // -- Generate dimensions -- let DataTypeInformation::Array { dimensions, .. } = cast_data.value_type else { unreachable!() }; @@ -311,56 +360,72 @@ impl<'ctx, 'cast> Castable<'ctx, 'cast> for ArrayValue<'ctx> { dims.iter().map(|it| cast_data.llvm.i32_type().const_int(*it as u64, true)).collect::>(); let array_value = cast_data.llvm.i32_type().const_array(&dimensions); // FIXME: should be memcopied, but is an rvalue. can only initialize global variables with value types. any other way for alloca'd variables than using store? - builder.build_store(vla_dimensions_ptr, array_value); + builder.build_store(vla_dimensions_ptr, array_value)?; - builder.build_store(vla_arr_ptr, arr_gep); + builder.build_store(vla_arr_ptr, arr_gep)?; - builder.build_load(vla_struct, "") + Ok(builder.build_load(vla_struct, "")?) } } impl<'ctx, 'cast> Promotable<'ctx, 'cast> for IntValue<'ctx> { - fn promote(self, lsize: u32, cast_data: &CastInstructionData<'ctx, 'cast>) -> BasicValueEnum<'ctx> { + fn promote( + self, + lsize: u32, + cast_data: &CastInstructionData<'ctx, 'cast>, + ) -> Result, CodegenDiagnostic> { let llvm_int_type = get_llvm_int_type(cast_data.llvm.context, lsize, "Integer"); - if cast_data.value_type.is_signed_int() { - cast_data.llvm.builder.build_int_s_extend_or_bit_cast(self, llvm_int_type, "") + let value = if cast_data.value_type.is_signed_int() { + cast_data.llvm.builder.build_int_s_extend_or_bit_cast(self, llvm_int_type, "")? } else { - cast_data.llvm.builder.build_int_z_extend_or_bit_cast(self, llvm_int_type, "") - } - .into() + cast_data.llvm.builder.build_int_z_extend_or_bit_cast(self, llvm_int_type, "")? + }; + Ok(value.into()) } } impl<'ctx, 'cast> Promotable<'ctx, 'cast> for FloatValue<'ctx> { - fn promote(self, lsize: u32, cast_data: &CastInstructionData<'ctx, 'cast>) -> BasicValueEnum<'ctx> { - cast_data + fn promote( + self, + lsize: u32, + cast_data: &CastInstructionData<'ctx, 'cast>, + ) -> Result, CodegenDiagnostic> { + Ok(cast_data .llvm .builder - .build_float_ext(self, get_llvm_float_type(cast_data.llvm.context, lsize, "Float"), "") - .into() + .build_float_ext(self, get_llvm_float_type(cast_data.llvm.context, lsize, "Float"), "")? + .into()) } } impl<'ctx, 'cast> Truncatable<'ctx, 'cast> for IntValue<'ctx> { - fn truncate(self, lsize: u32, cast_data: &CastInstructionData<'ctx, 'cast>) -> BasicValueEnum<'ctx> { - cast_data + fn truncate( + self, + lsize: u32, + cast_data: &CastInstructionData<'ctx, 'cast>, + ) -> Result, CodegenDiagnostic> { + Ok(cast_data .llvm .builder .build_int_truncate_or_bit_cast( self, get_llvm_int_type(cast_data.llvm.context, lsize, "Integer"), "", - ) - .into() + )? + .into()) } } impl<'ctx, 'cast> Truncatable<'ctx, 'cast> for FloatValue<'ctx> { - fn truncate(self, lsize: u32, cast_data: &CastInstructionData<'ctx, 'cast>) -> BasicValueEnum<'ctx> { - cast_data + fn truncate( + self, + lsize: u32, + cast_data: &CastInstructionData<'ctx, 'cast>, + ) -> Result, CodegenDiagnostic> { + Ok(cast_data .llvm .builder - .build_float_trunc(self, get_llvm_float_type(cast_data.llvm.context, lsize, "Float"), "") - .into() + .build_float_trunc(self, get_llvm_float_type(cast_data.llvm.context, lsize, "Float"), "")? + .into()) } } diff --git a/src/index/visitor.rs b/src/index/visitor.rs index 04f146031e..6a633446f6 100644 --- a/src/index/visitor.rs +++ b/src/index/visitor.rs @@ -682,6 +682,7 @@ fn visit_array( }) } + //TODO: that's not a codegen error _ => Err(Diagnostic::codegen_error( "Invalid array definition: RangeStatement expected", it.get_location(), From df2d6df5f89ee8cd6a8d7c9db7256aa23507a8d0 Mon Sep 17 00:00:00 2001 From: Ghaith Hachem Date: Mon, 7 Oct 2024 09:07:22 +0200 Subject: [PATCH 2/2] Add note for issues in init --- src/codegen/llvm_typesystem.rs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/codegen/llvm_typesystem.rs b/src/codegen/llvm_typesystem.rs index 9b12f168b5..faeb12f6cd 100644 --- a/src/codegen/llvm_typesystem.rs +++ b/src/codegen/llvm_typesystem.rs @@ -2,7 +2,7 @@ use inkwell::{ context::Context, types::{FloatType, IntType}, - values::{ArrayValue, BasicValueEnum, FloatValue, IntValue, PointerValue}, + values::{ArrayValue, BasicValue, BasicValueEnum, FloatValue, IntValue, PointerValue}, }; use crate::{ @@ -375,11 +375,16 @@ impl<'ctx, 'cast> Promotable<'ctx, 'cast> for IntValue<'ctx> { cast_data: &CastInstructionData<'ctx, 'cast>, ) -> Result, CodegenDiagnostic> { let llvm_int_type = get_llvm_int_type(cast_data.llvm.context, lsize, "Integer"); - let value = if cast_data.value_type.is_signed_int() { - cast_data.llvm.builder.build_int_s_extend_or_bit_cast(self, llvm_int_type, "")? - } else { - cast_data.llvm.builder.build_int_z_extend_or_bit_cast(self, llvm_int_type, "")? - }; + //FIXME: This breaks on new inkwell, we cannot cast in initizlizers + if cast_data.llvm.builder.get_insert_block().is_none() { + return Ok(self.as_basic_value_enum()) + }; + let value = + if cast_data.value_type.is_signed_int(){ + cast_data.llvm.builder.build_int_s_extend_or_bit_cast(self, llvm_int_type, "")? + } else { + cast_data.llvm.builder.build_int_z_extend_or_bit_cast(self, llvm_int_type, "")? + }; Ok(value.into()) } }