mirror of
https://github.com/kmc7468/cs420.git
synced 2025-12-14 22:38:46 +00:00
Update IR
This commit is contained in:
76
Cargo.lock
generated
76
Cargo.lock
generated
@@ -116,6 +116,31 @@ dependencies = [
|
|||||||
"libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hexf"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"hexf-impl 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"hexf-parse 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"proc-macro-hack 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hexf-impl"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"hexf-parse 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"proc-macro-hack 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hexf-parse"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "itertools"
|
name = "itertools"
|
||||||
version = "0.9.0"
|
version = "0.9.0"
|
||||||
@@ -130,6 +155,7 @@ version = "0.1.0"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"failure 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
"failure 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"hexf 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"itertools 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"itertools 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"lang-c 0.8.0 (git+https://github.com/kaist-cp/lang-c)",
|
"lang-c 0.8.0 (git+https://github.com/kaist-cp/lang-c)",
|
||||||
"ordered-float 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ordered-float 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@@ -167,6 +193,19 @@ name = "ppv-lite86"
|
|||||||
version = "0.2.6"
|
version = "0.2.6"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "proc-macro-hack"
|
||||||
|
version = "0.3.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro-hack-impl 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "proc-macro-hack-impl"
|
||||||
|
version = "0.3.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proc-macro2"
|
name = "proc-macro2"
|
||||||
version = "1.0.10"
|
version = "1.0.10"
|
||||||
@@ -175,6 +214,11 @@ dependencies = [
|
|||||||
"unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "quote"
|
||||||
|
version = "0.3.15"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "quote"
|
name = "quote"
|
||||||
version = "1.0.3"
|
version = "1.0.3"
|
||||||
@@ -243,6 +287,16 @@ name = "strsim"
|
|||||||
version = "0.8.0"
|
version = "0.8.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "syn"
|
||||||
|
version = "0.11.11"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syn"
|
name = "syn"
|
||||||
version = "1.0.17"
|
version = "1.0.17"
|
||||||
@@ -253,6 +307,14 @@ dependencies = [
|
|||||||
"unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "synom"
|
||||||
|
version = "0.11.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "synstructure"
|
name = "synstructure"
|
||||||
version = "0.12.3"
|
version = "0.12.3"
|
||||||
@@ -290,6 +352,11 @@ name = "unicode-width"
|
|||||||
version = "0.1.7"
|
version = "0.1.7"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-xid"
|
||||||
|
version = "0.0.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-xid"
|
name = "unicode-xid"
|
||||||
version = "0.2.0"
|
version = "0.2.0"
|
||||||
@@ -344,13 +411,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
"checksum failure_derive 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "030a733c8287d6213886dd487564ff5c8f6aae10278b3588ed177f9d18f8d231"
|
"checksum failure_derive 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "030a733c8287d6213886dd487564ff5c8f6aae10278b3588ed177f9d18f8d231"
|
||||||
"checksum getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb"
|
"checksum getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb"
|
||||||
"checksum hermit-abi 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "725cf19794cf90aa94e65050cb4191ff5d8fa87a498383774c47b332e3af952e"
|
"checksum hermit-abi 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "725cf19794cf90aa94e65050cb4191ff5d8fa87a498383774c47b332e3af952e"
|
||||||
|
"checksum hexf 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e54653cc32d838771a36532647afad59c4bf7155745eeeec406f71fd5d7e7538"
|
||||||
|
"checksum hexf-impl 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "22eadcfadba76a730b2764eaa577d045f35e0ef5174b9c5b46adf1ee42b85e12"
|
||||||
|
"checksum hexf-parse 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "79296f72d53a89096cbc9a88c9547ee8dfe793388674620e2207593d370550ac"
|
||||||
"checksum itertools 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b"
|
"checksum itertools 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b"
|
||||||
"checksum lang-c 0.8.0 (git+https://github.com/kaist-cp/lang-c)" = "<none>"
|
"checksum lang-c 0.8.0 (git+https://github.com/kaist-cp/lang-c)" = "<none>"
|
||||||
"checksum libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)" = "dea0c0405123bba743ee3f91f49b1c7cfb684eef0da0a50110f758ccf24cdff0"
|
"checksum libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)" = "dea0c0405123bba743ee3f91f49b1c7cfb684eef0da0a50110f758ccf24cdff0"
|
||||||
"checksum num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096"
|
"checksum num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096"
|
||||||
"checksum ordered-float 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "18869315e81473c951eb56ad5558bbc56978562d3ecfb87abb7a1e944cea4518"
|
"checksum ordered-float 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "18869315e81473c951eb56ad5558bbc56978562d3ecfb87abb7a1e944cea4518"
|
||||||
"checksum ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b"
|
"checksum ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b"
|
||||||
|
"checksum proc-macro-hack 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b773f824ff2a495833f85fcdddcf85e096949971decada2e93249fa2c6c3d32f"
|
||||||
|
"checksum proc-macro-hack-impl 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0f674ccc446da486175527473ec8aa064f980b0966bbf767ee743a5dff6244a7"
|
||||||
"checksum proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)" = "df246d292ff63439fea9bc8c0a270bed0e390d5ebd4db4ba15aba81111b5abe3"
|
"checksum proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)" = "df246d292ff63439fea9bc8c0a270bed0e390d5ebd4db4ba15aba81111b5abe3"
|
||||||
|
"checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a"
|
||||||
"checksum quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2bdc6c187c65bca4260c9011c9e3132efe4909da44726bad24cf7572ae338d7f"
|
"checksum quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2bdc6c187c65bca4260c9011c9e3132efe4909da44726bad24cf7572ae338d7f"
|
||||||
"checksum rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
|
"checksum rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
|
||||||
"checksum rand_chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
|
"checksum rand_chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
|
||||||
@@ -360,11 +433,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
"checksum remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e"
|
"checksum remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e"
|
||||||
"checksum rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783"
|
"checksum rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783"
|
||||||
"checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
|
"checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
|
||||||
|
"checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad"
|
||||||
"checksum syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)" = "0df0eb663f387145cab623dea85b09c2c5b4b0aef44e945d928e682fce71bb03"
|
"checksum syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)" = "0df0eb663f387145cab623dea85b09c2c5b4b0aef44e945d928e682fce71bb03"
|
||||||
|
"checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6"
|
||||||
"checksum synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "67656ea1dc1b41b1451851562ea232ec2e5a80242139f7e679ceccfb5d61f545"
|
"checksum synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "67656ea1dc1b41b1451851562ea232ec2e5a80242139f7e679ceccfb5d61f545"
|
||||||
"checksum tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9"
|
"checksum tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9"
|
||||||
"checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
|
"checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
|
||||||
"checksum unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479"
|
"checksum unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479"
|
||||||
|
"checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc"
|
||||||
"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
|
"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
|
||||||
"checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a"
|
"checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a"
|
||||||
"checksum wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)" = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
|
"checksum wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)" = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
|
||||||
|
|||||||
@@ -31,3 +31,4 @@ itertools = "0.9.0"
|
|||||||
failure = "0.1.7"
|
failure = "0.1.7"
|
||||||
tempfile = "3.1.0"
|
tempfile = "3.1.0"
|
||||||
ordered-float = "1.0"
|
ordered-float = "1.0"
|
||||||
|
hexf = "0.1.0"
|
||||||
|
|||||||
8
Jenkinsfile
vendored
8
Jenkinsfile
vendored
@@ -35,8 +35,12 @@ pipeline {
|
|||||||
stage('Test') {
|
stage('Test') {
|
||||||
steps {
|
steps {
|
||||||
setupRust()
|
setupRust()
|
||||||
sh "cargo test"
|
// When `cargo test` runs, the function `it_works()` is called in a new thread.
|
||||||
sh "cargo test --release"
|
// The stack size of a new thread is `2 MiB` on Linux, and this small stack size
|
||||||
|
// can cause `stack-overflow` error when testing stack-intensive code.
|
||||||
|
// For this reason, we need to increase the default size of stack to `4 MiB`.
|
||||||
|
sh "RUST_MIN_STACK=4194304 cargo test"
|
||||||
|
sh "RUST_MIN_STACK=4194304 cargo test --release"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
18
examples/cmp.c
Normal file
18
examples/cmp.c
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
int int_greater_than(int i, unsigned int j) {
|
||||||
|
if (i > j) return 1;
|
||||||
|
else return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int char_greater_than(char i, unsigned char j) {
|
||||||
|
if (i > j) return 1;
|
||||||
|
else return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
// cmp ugt
|
||||||
|
int r1 = int_greater_than(-1, 1);
|
||||||
|
// cmp sgt
|
||||||
|
int r2 = char_greater_than(-1, 1);
|
||||||
|
|
||||||
|
return r1 == 1 && r2 == 0;
|
||||||
|
}
|
||||||
@@ -217,7 +217,7 @@ impl AssertSupported for Declarator {
|
|||||||
fn assert_supported(&self) {
|
fn assert_supported(&self) {
|
||||||
self.kind.assert_supported();
|
self.kind.assert_supported();
|
||||||
self.derived.assert_supported();
|
self.derived.assert_supported();
|
||||||
self.extensions.is_empty();
|
assert!(self.extensions.is_empty());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -282,7 +282,7 @@ impl AssertSupported for ParameterDeclaration {
|
|||||||
fn assert_supported(&self) {
|
fn assert_supported(&self) {
|
||||||
self.specifiers.assert_supported();
|
self.specifiers.assert_supported();
|
||||||
self.declarator.assert_supported();
|
self.declarator.assert_supported();
|
||||||
self.extensions.is_empty();
|
assert!(self.extensions.is_empty());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ pub trait HasDtype {
|
|||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
struct BaseDtype {
|
struct BaseDtype {
|
||||||
scalar: Option<ast::TypeSpecifier>,
|
scalar: Option<ast::TypeSpecifier>,
|
||||||
size_modifiers: Option<ast::TypeSpecifier>,
|
size_modifier: Option<ast::TypeSpecifier>,
|
||||||
signed_option: Option<ast::TypeSpecifier>,
|
signed_option: Option<ast::TypeSpecifier>,
|
||||||
typedef_name: Option<String>,
|
typedef_name: Option<String>,
|
||||||
is_const: bool,
|
is_const: bool,
|
||||||
@@ -129,12 +129,12 @@ impl BaseDtype {
|
|||||||
self.scalar = Some(type_specifier.clone());
|
self.scalar = Some(type_specifier.clone());
|
||||||
}
|
}
|
||||||
ast::TypeSpecifier::Short | ast::TypeSpecifier::Long => {
|
ast::TypeSpecifier::Short | ast::TypeSpecifier::Long => {
|
||||||
if self.size_modifiers.is_some() {
|
if self.size_modifier.is_some() {
|
||||||
return Err(DtypeError::Misc {
|
return Err(DtypeError::Misc {
|
||||||
message: "two or more size modifiers in declaration specifiers".to_string(),
|
message: "two or more size modifiers in declaration specifiers".to_string(),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
self.size_modifiers = Some(type_specifier.clone());
|
self.size_modifier = Some(type_specifier.clone());
|
||||||
}
|
}
|
||||||
ast::TypeSpecifier::TypedefName(identifier) => {
|
ast::TypeSpecifier::TypedefName(identifier) => {
|
||||||
if self.typedef_name.is_some() {
|
if self.typedef_name.is_some() {
|
||||||
@@ -277,7 +277,7 @@ impl TryFrom<BaseDtype> for Dtype {
|
|||||||
fn try_from(spec: BaseDtype) -> Result<Self, DtypeError> {
|
fn try_from(spec: BaseDtype) -> Result<Self, DtypeError> {
|
||||||
assert!(
|
assert!(
|
||||||
!(spec.scalar.is_none()
|
!(spec.scalar.is_none()
|
||||||
&& spec.size_modifiers.is_none()
|
&& spec.size_modifier.is_none()
|
||||||
&& spec.signed_option.is_none()
|
&& spec.signed_option.is_none()
|
||||||
&& spec.typedef_name.is_none()
|
&& spec.typedef_name.is_none()
|
||||||
&& !spec.is_const),
|
&& !spec.is_const),
|
||||||
@@ -313,19 +313,19 @@ impl TryFrom<BaseDtype> for Dtype {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Applies size modifier
|
// Applies size modifier
|
||||||
if let Some(size_modifiers) = spec.size_modifiers {
|
if let Some(size_modifier) = spec.size_modifier {
|
||||||
if dtype != Self::INT {
|
if dtype != Self::INT {
|
||||||
return Err(DtypeError::Misc {
|
return Err(DtypeError::Misc {
|
||||||
message: "size modifier can only be used with `int`".to_string(),
|
message: "size modifier can only be used with `int`".to_string(),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
dtype = match size_modifiers {
|
dtype = match size_modifier {
|
||||||
ast::TypeSpecifier::Short => Self::SHORT,
|
ast::TypeSpecifier::Short => Self::SHORT,
|
||||||
ast::TypeSpecifier::Long => Self::LONG,
|
ast::TypeSpecifier::Long => Self::LONG,
|
||||||
_ => panic!(
|
_ => panic!(
|
||||||
"Dtype::try_from::<BaseDtype>: {:?} is not a size modifier",
|
"Dtype::try_from::<BaseDtype>: {:?} is not a size modifier",
|
||||||
size_modifiers
|
size_modifier
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -341,6 +341,13 @@ impl TryFrom<BaseDtype> for Dtype {
|
|||||||
),
|
),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if dtype.get_int_width().is_none() {
|
||||||
|
return Err(DtypeError::Misc {
|
||||||
|
message: "`signed` and `unsigned` only be applied to `Dtype::Int`"
|
||||||
|
.to_string(),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
dtype = dtype.set_signed(is_signed);
|
dtype = dtype.set_signed(is_signed);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -662,12 +669,18 @@ impl Dtype {
|
|||||||
self.with_ast_array_size(&array_decl.node.size)?
|
self.with_ast_array_size(&array_decl.node.size)?
|
||||||
}
|
}
|
||||||
ast::DerivedDeclarator::Function(func_decl) => {
|
ast::DerivedDeclarator::Function(func_decl) => {
|
||||||
let params = func_decl
|
let mut params = func_decl
|
||||||
.node
|
.node
|
||||||
.parameters
|
.parameters
|
||||||
.iter()
|
.iter()
|
||||||
.map(|p| Self::try_from(&p.node))
|
.map(|p| Self::try_from(&p.node))
|
||||||
.collect::<Result<Vec<_>, _>>()?;
|
.collect::<Result<Vec<_>, _>>()?;
|
||||||
|
|
||||||
|
// If function parameter is (void), remove it
|
||||||
|
if params.len() == 1 && params[0] == Dtype::unit() {
|
||||||
|
let _ = params.pop();
|
||||||
|
}
|
||||||
|
|
||||||
Self::function(self, params)
|
Self::function(self, params)
|
||||||
}
|
}
|
||||||
ast::DerivedDeclarator::KRFunction(kr_func_decl) => {
|
ast::DerivedDeclarator::KRFunction(kr_func_decl) => {
|
||||||
@@ -758,16 +771,6 @@ impl Dtype {
|
|||||||
|
|
||||||
Ok(dtype)
|
Ok(dtype)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn merge(self, other: Self) -> Result<Self, DtypeError> {
|
|
||||||
if self == other {
|
|
||||||
Ok(self)
|
|
||||||
} else {
|
|
||||||
Err(DtypeError::Misc {
|
|
||||||
message: format!("Dtype::merge({:?}, {:?}) failed", self, other),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Display for Dtype {
|
impl fmt::Display for Dtype {
|
||||||
|
|||||||
@@ -286,27 +286,31 @@ mod calculator {
|
|||||||
ast::BinaryOperator::Modulo => Ok(Value::int(lhs % rhs, lhs_w, lhs_s)),
|
ast::BinaryOperator::Modulo => Ok(Value::int(lhs % rhs, lhs_w, lhs_s)),
|
||||||
ast::BinaryOperator::Equals => {
|
ast::BinaryOperator::Equals => {
|
||||||
let result = if lhs == rhs { 1 } else { 0 };
|
let result = if lhs == rhs { 1 } else { 0 };
|
||||||
Ok(Value::int(result, 1, lhs_s))
|
Ok(Value::int(result, 1, false))
|
||||||
}
|
}
|
||||||
ast::BinaryOperator::NotEquals => {
|
ast::BinaryOperator::NotEquals => {
|
||||||
let result = if lhs != rhs { 1 } else { 0 };
|
let result = if lhs != rhs { 1 } else { 0 };
|
||||||
Ok(Value::int(result, 1, lhs_s))
|
Ok(Value::int(result, 1, false))
|
||||||
}
|
}
|
||||||
ast::BinaryOperator::Less => {
|
ast::BinaryOperator::Less => {
|
||||||
|
// TODO: consider signed option
|
||||||
let result = if lhs < rhs { 1 } else { 0 };
|
let result = if lhs < rhs { 1 } else { 0 };
|
||||||
Ok(Value::int(result, 1, lhs_s))
|
Ok(Value::int(result, 1, false))
|
||||||
}
|
}
|
||||||
ast::BinaryOperator::Greater => {
|
ast::BinaryOperator::Greater => {
|
||||||
|
// TODO: consider signed option
|
||||||
let result = if lhs > rhs { 1 } else { 0 };
|
let result = if lhs > rhs { 1 } else { 0 };
|
||||||
Ok(Value::int(result, 1, lhs_s))
|
Ok(Value::int(result, 1, false))
|
||||||
}
|
}
|
||||||
ast::BinaryOperator::LessOrEqual => {
|
ast::BinaryOperator::LessOrEqual => {
|
||||||
|
// TODO: consider signed option
|
||||||
let result = if lhs <= rhs { 1 } else { 0 };
|
let result = if lhs <= rhs { 1 } else { 0 };
|
||||||
Ok(Value::int(result, 1, lhs_s))
|
Ok(Value::int(result, 1, false))
|
||||||
}
|
}
|
||||||
ast::BinaryOperator::GreaterOrEqual => {
|
ast::BinaryOperator::GreaterOrEqual => {
|
||||||
|
// TODO: consider signed option
|
||||||
let result = if lhs >= rhs { 1 } else { 0 };
|
let result = if lhs >= rhs { 1 } else { 0 };
|
||||||
Ok(Value::int(result, 1, lhs_s))
|
Ok(Value::int(result, 1, false))
|
||||||
}
|
}
|
||||||
ast::BinaryOperator::LogicalAnd => {
|
ast::BinaryOperator::LogicalAnd => {
|
||||||
assert!(lhs < 2);
|
assert!(lhs < 2);
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ mod write_ir;
|
|||||||
use core::convert::TryFrom;
|
use core::convert::TryFrom;
|
||||||
use core::fmt;
|
use core::fmt;
|
||||||
use core::ops::{Deref, DerefMut};
|
use core::ops::{Deref, DerefMut};
|
||||||
|
use hexf::{parse_hexf32, parse_hexf64};
|
||||||
use lang_c::ast;
|
use lang_c::ast;
|
||||||
use ordered_float::OrderedFloat;
|
use ordered_float::OrderedFloat;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
@@ -504,23 +505,44 @@ impl TryFrom<&ast::Constant> for Constant {
|
|||||||
}
|
}
|
||||||
.set_signed(is_signed);
|
.set_signed(is_signed);
|
||||||
|
|
||||||
|
let pat = match integer.base {
|
||||||
|
ast::IntegerBase::Decimal => Self::DECIMAL,
|
||||||
|
ast::IntegerBase::Octal => Self::OCTAL,
|
||||||
|
ast::IntegerBase::Hexadecimal => Self::HEXADECIMAL,
|
||||||
|
};
|
||||||
|
|
||||||
let value = if is_signed {
|
let value = if is_signed {
|
||||||
integer.number.parse::<i128>().unwrap() as u128
|
i128::from_str_radix(integer.number.deref(), pat).unwrap() as u128
|
||||||
} else {
|
} else {
|
||||||
integer.number.parse::<u128>().unwrap()
|
u128::from_str_radix(integer.number.deref(), pat).unwrap()
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(Self::int(value, dtype))
|
Ok(Self::int(value, dtype))
|
||||||
}
|
}
|
||||||
ast::Constant::Float(float) => {
|
ast::Constant::Float(float) => {
|
||||||
|
let pat = match float.base {
|
||||||
|
ast::FloatBase::Decimal => Self::DECIMAL,
|
||||||
|
ast::FloatBase::Hexadecimal => Self::HEXADECIMAL,
|
||||||
|
};
|
||||||
|
|
||||||
let (dtype, value) = match float.suffix.format {
|
let (dtype, value) = match float.suffix.format {
|
||||||
ast::FloatFormat::Float => {
|
ast::FloatFormat::Float => {
|
||||||
// Casting from an f32 to an f64 is perfect and lossless (f32 -> f64)
|
// Casting from an f32 to an f64 is perfect and lossless (f32 -> f64)
|
||||||
// https://doc.rust-lang.org/stable/reference/expressions/operator-expr.html#type-cast-expressions
|
// https://doc.rust-lang.org/stable/reference/expressions/operator-expr.html#type-cast-expressions
|
||||||
(Dtype::FLOAT, float.number.parse::<f32>().unwrap() as f64)
|
let value = if pat == Self::DECIMAL {
|
||||||
|
float.number.parse::<f32>().unwrap() as f64
|
||||||
|
} else {
|
||||||
|
parse_hexf32(float.number.deref(), false).unwrap() as f64
|
||||||
|
};
|
||||||
|
(Dtype::FLOAT, value)
|
||||||
}
|
}
|
||||||
ast::FloatFormat::Double => {
|
ast::FloatFormat::Double => {
|
||||||
(Dtype::DOUBLE, float.number.parse::<f64>().unwrap())
|
let value = if pat == Self::DECIMAL {
|
||||||
|
float.number.parse::<f64>().unwrap()
|
||||||
|
} else {
|
||||||
|
parse_hexf64(float.number.deref(), false).unwrap()
|
||||||
|
};
|
||||||
|
(Dtype::DOUBLE, value)
|
||||||
}
|
}
|
||||||
ast::FloatFormat::LongDouble => {
|
ast::FloatFormat::LongDouble => {
|
||||||
panic!("`FloatFormat::LongDouble` is_unsupported")
|
panic!("`FloatFormat::LongDouble` is_unsupported")
|
||||||
@@ -567,6 +589,10 @@ impl TryFrom<&ast::Initializer> for Constant {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Constant {
|
impl Constant {
|
||||||
|
const DECIMAL: u32 = 10;
|
||||||
|
const OCTAL: u32 = 8;
|
||||||
|
const HEXADECIMAL: u32 = 16;
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn is_integer_constant(&self) -> bool {
|
pub fn is_integer_constant(&self) -> bool {
|
||||||
if let Self::Int { .. } = self {
|
if let Self::Int { .. } = self {
|
||||||
|
|||||||
22
src/tests.rs
22
src/tests.rs
@@ -57,13 +57,21 @@ pub fn test_irgen(unit: &TranslationUnit, path: &Path) {
|
|||||||
.status()
|
.status()
|
||||||
.expect("failed to remove compiled executable");
|
.expect("failed to remove compiled executable");
|
||||||
|
|
||||||
let ir = Irgen::default()
|
let ir = match Irgen::default().translate(unit) {
|
||||||
.translate(unit)
|
Ok(ir) => ir,
|
||||||
.expect("failed to generate ir");
|
Err(irgen_error) => panic!("{}", irgen_error),
|
||||||
|
};
|
||||||
|
|
||||||
let args = Vec::new();
|
let args = Vec::new();
|
||||||
assert_eq!(
|
let result = match ir::interp(&ir, args) {
|
||||||
ir::interp(&ir, args),
|
Ok(result) => result,
|
||||||
Ok(ir::Value::int(status as u128, 32, true))
|
Err(interp_error) => panic!("{}", interp_error),
|
||||||
);
|
};
|
||||||
|
let result = if let ir::Value::Int { .. } = &result {
|
||||||
|
result
|
||||||
|
} else {
|
||||||
|
panic!("non-integer value occurs")
|
||||||
|
};
|
||||||
|
|
||||||
|
assert_eq!(result, ir::Value::int(status as u128, 32, true));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,6 +36,23 @@ REPLACE_DICT = {
|
|||||||
"\"g_\w*\", ": "", # transparent_crc에서 프린트 목적으로 받은 StringLiteral 삭제
|
"\"g_\w*\", ": "", # transparent_crc에서 프린트 목적으로 받은 StringLiteral 삭제
|
||||||
"char\* vname, ": "", # transparent_crc에서 사용하지 않는 파라미터 삭제
|
"char\* vname, ": "", # transparent_crc에서 사용하지 않는 파라미터 삭제
|
||||||
r"[^\n]*_IO_2_1_[^;]*;": "", # extern을 지우면서 생긴 size를 알 수 없는 struct 삭제
|
r"[^\n]*_IO_2_1_[^;]*;": "", # extern을 지우면서 생긴 size를 알 수 없는 struct 삭제
|
||||||
|
r"__asm\s*\([^\)]*\)": "", # asm extension in mac
|
||||||
|
r"__asm__\s*\([^\)]*\)": "", # asm extension in linux
|
||||||
|
|
||||||
|
# To check fuzzer before make kecc support struct type
|
||||||
|
"struct[^}]*};": "",
|
||||||
|
" struct[^{]*[^}]*}[^;]*;": "",
|
||||||
|
"typedef struct _IO_FILE __FILE;": "",
|
||||||
|
"struct _IO_FILE;": "",
|
||||||
|
"typedef struct _IO_FILE FILE;": "typedef int FILE;",
|
||||||
|
"typedef struct _IO_FILE": "typedef int",
|
||||||
|
"typedef struct __locale_struct": "typedef int",
|
||||||
|
"typedef __locale_t locale_t;": "typedef int locale_t;",
|
||||||
|
"struct _IO_FILE_plus;": "",
|
||||||
|
"typedef _G_fpos_t": "typedef int",
|
||||||
|
"typedef struct[^\n]*\n{[^}]*}[^;]*;": "",
|
||||||
|
"typedef struct[^{]{[^}]*}": "typedef int",
|
||||||
|
"struct _IO_FILE": "int",
|
||||||
}
|
}
|
||||||
CSMITH_DIR = "csmith-2.3.0"
|
CSMITH_DIR = "csmith-2.3.0"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user