summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2017-12-18Auto merge of #1196 - fitzgen:bump-to-0.32.1, r=KiChjangbors-servo
Bump to 0.32.1 minor release rs? @emilio
2017-12-18Bump to 0.32.1 minor releaseNick Fitzgerald
2017-12-14Auto merge of #1193 - alex:patch-1, r=emiliobors-servo
Fixed rendering of a header in the book
2017-12-14Auto merge of #1183 - fitzgen:repr-c-on-enums, r=emiliobors-servo
repr(C) on enums r? @pepyakin or @emilio
2017-12-13Fixed rendering of a header in the bookAlex Gaynor
2017-12-12Always add `repr(C)` to rustified enumsNick Fitzgerald
If we don't, then eddyb's recent layout optimizations will do unexpected things to them. We also need to handle empty `enum`s without variants. When `repr(C)` is on a Rust `enum`, it cannot be empty, so we need to add a dummy.
2017-12-11Use Metadata::is_dirAnthony Ramine
2017-12-09Auto merge of #1186 - manaskarekar:issue-1182, r=emiliobors-servo
Fix command_line_flags mis-generation of rust-target's flags. Trying to address issue #1182. r? @fitzgen
2017-12-09Fix command_line_flags mis-generation of rust-target's flags.Manas Karekar
Expand tests for testing the rust-target flag generated by builder.
2017-12-09Auto merge of #1180 - snewt:feat/quickchecking-cargo-features, r=fitzgenbors-servo
Enable Cargo features for quickchecking crate Logic to enable/disable special casing (due to known issues #550, #684, and #1153) has been exposed as features in the `quickchecking` crate's Cargo.toml file and corresponding `cfg` attributes in the source. In addition to adding Cargo features, this PR represents the following: - Documentation in `bindgen`'s CONTRIBUTING.md that points to a new README.md located in the `quickchecking` crate's directory. - The Debug trait was implemented for the `HeaderC` type. This enables failing property tests to be reported as C source code rather than a Rust data structure. - The ArrayDimensionC type is now used in header generation for union, struct, and basic declarations. Thanks for taking a look and for any feedback! Closes #1169 r? @fitzgen
2017-12-08Address PR change requestsShea Newton
- Fixed misspelling introduced in CONTRIBUTING.md - Remove `quickchecking -h` output from README.md
2017-12-08predicate.py: Add an option to not delete temp filesNick Fitzgerald
Useful when debugging.
2017-12-08Auto merge of #1181 - fitzgen:version-bump-to-0.32.0, r=emiliobors-servo
Bump to 0.32.0 r? @emilio
2017-12-08Bump to 0.32.0Nick Fitzgerald
2017-12-07Enable Cargo features for quickchecking crateShea Newton
Logic to enable/disable special casing (due to known issues #550, #684, and #1153) has been exposed as features in the `quickchecking` crate's Cargo.toml file and corresponding `cfg` attributes in the source. In addition to adding Cargo features, this PR represents the following: - Documentation in `bindgen`'s CONTRIBUTING.md that points to a new README.md located in the `quickchecking` crate's directory. - The Debug trait was implemented for the `HeaderC` type. This enables failing property tests to be reported as C source code rather than a Rust data structure. - The ArrayDimensionC type is now used in header generation for union, struct, and basic declarations. Thanks for taking a look and for any feedback! Closes #1169 r? @fitzgen
2017-12-07Auto merge of #1176 - Eijebong:bump, r=fitzgenbors-servo
Update lazy_static to 1.0
2017-12-07Update lazy_static to 1.0Bastien Orivel
2017-12-07Auto merge of #1179 - fitzgen:add-regression-test-for-issue-816, r=emiliobors-servo
Add a regression test for issue #816 r? @emilio
2017-12-07Add a regression test for issue #816Nick Fitzgerald
2017-12-05Auto merge of #1177 - snewt:feat/quickcheck-as-bin, r=fitzgenbors-servo
Quickchecking crate CLI Prior to this commit the quickchecking crate used for generating proprty tests for bindgen was a [lib] target and had configurations that required commenting/uncommenting code to enable/disable. This meant it was inconvienent/prohibitive to configure the property tests on a per-run basis. This commit reorganizes the `quickchecking` crate to provide both [lib] and [[bin]] targets in order to expose those configurations through a CLI. The configurations that are exposed through the [[bin]] target's CLI are: * Count/number of tests to run. * Directory to provide fuzzed headers * Generation range corresponding to the range quickcheck uses to * generate arbitrary. __Usage from the__ `tests/quickchecking` __directory__ ```bash quickchecking 0.2.0 Bindgen property tests with quickcheck. Generate random valid C code and pass it to the csmith/predicate.py script USAGE: quickchecking [OPTIONS] FLAGS: -h, --help Prints help information -V, --version Prints version information OPTIONS: -c, --count <COUNT> Count / number of tests to run. Running a fuzzed header through the predicate.py script can take a long time, especially if the generation range is large. Increase this number if you're willing to wait a while. [default: 2] -p, --path <PATH> Optional. Preserve generated headers for inspection, provide directory path for header output. [default: None] -r, --range <RANGE> Sets the range quickcheck uses during generation. Corresponds to things like arbitrary usize and arbitrary vector length. This number doesn't have to grow much for that execution time to increase significantly. [default: 32] ``` Because the actual work of running the property tests moved to the [[bin]] target, rather than duplicate that code in the `quickchecking` crate's tests directory, some actual (very basic) tests for the `quickchecking` crate were added. *Note: I'm not attached to any of the option flags, if there are better characters/words for any of the options I've exposed I'll be happy to revise! Also, I'm not sure how palatable the "global singleton" is for managing context (output path) across tests in the `lib.rs` file. Very open to suggestions on how to manage that if it's not an acceptable approach. Thanks for taking a look, looking forward to feedback! Closes #1168 r? @fitzgen
2017-12-05quickchecking CI testsShea Newton
The changes reflected in this PR include the logic to test the `quickcheking` crate itself. Rather that just validate that the `quickchecking` crate builds in CI with `cargo check`, we can run now `cargo test`.
2017-12-04Quickchecking crate CLIShea Newton
Prior to this commit the quickchecking crate used for generating proprty tests for bindgen was a [lib] target and had configurations that required commenting/uncommenting code to enable/disable. This meant it was inconvienent/prohibitive to configure the property tests on a per-run basis. This commit reorganizes the `quickchecking` crate to provide both [lib] and [[bin]] targets in order to expose those configurations through a CLI. The configurations that are exposed through the [[bin]] target's CLI are: * Count/number of tests to run. * Directory to provide fuzzed headers * Generation range corresponding to the range quickcheck uses to * generate arbitrary. __Usage from the__ `tests/quickchecking` __directory__ ```bash quickchecking 0.2.0 Bindgen property tests with quickcheck. Generate random valid C code and pass it to the csmith/predicate.py script USAGE: quickchecking [OPTIONS] FLAGS: -h, --help Prints help information -V, --version Prints version information OPTIONS: -c, --count <COUNT> Count / number of tests to run. Running a fuzzed header through the predicate.py script can take a long time, especially if the generation range is large. Increase this number if you're willing to wait a while. [default: 2] -p, --path <PATH> Optional. Preserve generated headers for inspection, provide directory path for header output. [default: None] -r, --range <RANGE> Sets the range quickcheck uses during generation. Corresponds to things like arbitrary usize and arbitrary vector length. This number doesn't have to grow much for that execution time to increase significantly. [default: 32] ``` Because the actual work of running the property tests moved to the [[bin]] target, rather than duplicate that code in the `quickchecking` crate's tests directory, some actual (very basic) tests for the `quickchecking` crate were added. *Note: I'm not attached to any of the option flags, if there are better characters/words for any of the options I've exposed I'll be happy to revise! Thanks for taking a look, looking forward to feedback! Closes #1168 r? @fitzgen
2017-12-04Auto merge of #1175 - nox:rustfmt, r=emiliobors-servo
Remove unstable rustfmt-nightly features
2017-12-04Remove unstable rustfmt-nightly featuresAnthony Ramine
2017-12-03Merge pull request #1173 from nox/tokensEmilio Cobos Álvarez
Move tokens method from TranslationUnit to Cursor
2017-12-03Move tokens method from TranslationUnit to CursorAnthony Ramine
This makes it easier to call it without passing around a TranslationUnit, which will prove itself useful to parse `__attribute__` nodes.
2017-11-30Auto merge of #1159 - snewt:feat/970-quickcheck-fuzzing, r=fitzgenbors-servo
Property testing with quickcheck This PR represents an attempt to address issue #970. It also represents a portion of the meta issue for fuzzing #972. The code base reflected here uses quickcheck to generate C headers that include a variety of types including basic types, structs, unions, function prototypes and function pointers. The headers generated by quickcheck are passed to the `csmith-fuzzing/predicate.py` script. Examples of headers generated by this iteration of the tooling can be viewed [here](https://gist.github.com/snewt/03ce934f35c5b085807d2d5cf11d1d5c). At the top of each header are two simple struct definitions, `whitelistable` and `blacklistable`. Those types are present in the vector that represents otherwise primitive types used to generate. They represent a naive approach to exposing custom types without having to intuit generated type names like `struct_21_8` though _any actual whitelisting logic isn't implemented here_. Test success is measured by the success of the `csmith-fuzzing/predicate.py` script. This means that for a test to pass the following must be true: - bindgen doesn't panic - the resulting bindings compile - the resulting bindings layout tests pass #### Usage ```bash cd tests/property_test cargo test ``` Some things I'm unsure of: #### Where should this feature live? At the moment it lives in `tests/property_test` but isn't run when `cargo test` is invoked from bindgen's cargo manifest directory. #### What's an acceptable ammount of time for these tests to take? At this point, the source is genereated in ~1 second but the files are large enough that it takes the `predicate.py` script ~30 seconds to run through each one. In order for the tests to run in under a minute only 2 are generated by quickcheck by default. This can be changed in the `test_bindgen` function of the `tests/property_test/tests/fuzzed-c-headers.rs` file. #### How do we expose the generated code for easy inspection? For now the `run_predicate_script` function in the `tests/property_test/tests/fuzzed-c-headers.rs` file contains a commented block that will copy generated source in the `tests/property_test/tests` directory. Should it be easier? #### Special casing There is some logic in the fuzzer that disallows 0 sized arrays because tests will regulary fail due to issues documented in #684 and #1153. Should this be special casing? #### Does the fuzzer warrant its own crate? After any iterations the reviewers are interested in required to make this a functional testing tool, should/could the fuzzing library be made into its own crate? I didn't move in that direction yet because having it all in one place seemed like the best way to figure out what works an doesn't but I'm interested in whether it might be useful as a standalone library. #### What does it look like to expose more useful functionality? I'm looking forward to feedback on how to make this a more useful tool and one that provides the right configurability. Thanks! r? @fitzgen
2017-11-29Address requested changes to quickchecking crate.Shea Newton
- Remove `whitelistable` and `blacklistable` types. - Rename test crate directory from `property_test` to `quickchecking`. - Add new CI job that checks that this crate continues to build. - Revise matching logic to be more idomatic. - Phase out modular arithmetic in favor of `gen_range`. - Incorporate `unreachable!` into match statements. - Revise logic for accessing random element of vector, favor `choose` over `nth`. - Proper punctuation and capitalization in comments. - Using actual structures rather than converting everything to strings in order to leverage type system. - Add `#![deny(missing_docs)]` and filled in documentation required for the project to build again. - Add special case logic so we don't generate structs with `long double` fields as it will cause tests to fail unitl issue \#550 is resolved Note on making sure we don't lose test cases we're interested in preserving: We're copying the directories `TempDir` makes so we get things like this: ``` ├── bindgen_prop.1WYe3F5HZU1c │   └── prop_test.h ├── bindgen_prop.H4SLI1JX0jd8 │   └── prop_test.h ``` I'm not sure that `TempDir` makes any claims about uniqueness, so collisions probably aren't impossible. I'm up for any suggestions on a more bulletproof solution. _Tasks not addressed by this PR:_ * TODO: Add `cargo features` logic to allow generating problematic code. * TODO: Make a [bin] target with CLI to manage test settings. * TODO: Whitelisting and opaque types. * TODO: Generate bitfields, C++, I-bogus-codegen cases. Figured this would be a good point to update the PR but if any of the above TODO items should be incorporated before moving forward I'm up for it! Thanks for taking another look! r? @fitzgen
2017-11-28Auto merge of #1163 - fitzgen:remove-unnecessary-ci-jobs, r=emiliobors-servo
Remove unnecessary ci jobs And then in the process I noticed that we weren't running the layout tests for any of the libclang version-specific expectation files, so I also fixed that. r? @emilio or @pepyakin
2017-11-28Ensure that we run layout tests from libclang version-specific expectationsNick Fitzgerald
This adds a build.rs to generate #[path="$FILE"] mod $FILE_AS_IDENT; for each $FILE in our libclang version-specific directories. We need to do this to get those files' layout tests to run because cargo doesn't automatically pick up tests in subdirectories.
2017-11-28Don't run test expectations' layout tests with multiple libclang versionsNick Fitzgerald
Only generating bindings depends on which libclang version we are dealing with. Running the test expectations' layout tests does not change between libclang versions, so these were redundant tests. Note that we have not been testing the expected bindings that differ across libclang versions (the nested sub-directories aren't automatically picked up by cargo) and this commit does not change that.
2017-11-28Auto merge of #1162 - tamird:enum-naming-consistency, r=emiliobors-servo
Properly handle namespaces for enum configuration options ...by using canonical_path rather than canonical_name. Fixes #1125. r? @emilio
2017-11-27Properly handle namespaces for enum configuration optionsTamir Duberstein
...by using canonical_path rather than canonical_name. Fixes #1125.
2017-11-27Squashed commit.Adam Baxter
2017-11-23Auto merge of #1158 - glyn:large-bitfield-units, r=emiliobors-servo
Support bitfield allocation units larger than 64 bits Individual bitfields are still limited to at most 64 bits, but this restriction can be weakened when Rust supports `u128`. This implements issue #816. Usage notes: * Since common code is added to each generated binding, a program which uses more than one binding may need to work around the duplication by including each binding in its own module. * The values created by bitfield allocation unit constructors can be assigned directly to the corresponding struct fields with no need for transmutation. Implementation notes: `__BindgenBitfieldUnit` represents a bitfield allocation unit using a `Storage` type accessible as a slice of `u8`. The alignment of the unit is inherited from an `Align` type by virtue of the field: ``` align: [Align; 0], ``` The position of this field in the struct is irrelevant. It is assumed that the alignment of the `Storage` type is no larger than the alignment of the `Align` type, which will be true if the `Storage` type is, for example, an array of `u8`. This assumption is checked in a debug assertion. Although the double underscore (__) prefix is reserved for implementations of C++, there are precedents for this convention elsewhere in bindgen and so the convention is adopted here too. Acknowledgement: Thanks to @fitzgen for an initial implementation of `__BindgenBitfieldUnit` and code to integrate it into bindgen. r? @emilio
2017-11-22This PR represents an attempt to address issue #970. It also representsShea Newton
a portion of the meta issue for fuzzing #972. The code base reflected here uses quickcheck to generate C headers that include a variety of types including basic types, structs, unions, function prototypes and function pointers. The headers generated by quickcheck are passed to the `csmith-fuzzing/predicate.py` script. Examples of headers generated by this iteration of the tooling can be viewed [here](https://gist.github.com/snewt/03ce934f35c5b085807d2d5cf11d1d5c). At the top of each header are two simple struct definitions, `whitelistable` and `blacklistable`. Those types are present in the vector that represents otherwise primitive types used to generate. They represent a naive approach to exposing custom types without having to intuit generated type names like `struct_21_8` though _any actual whitelisting logic isn't implemented here_. Test success is measured by the success of the `csmith-fuzzing/predicate.py` script. This means that for a test to pass the following must be true: - bindgen doesn't panic - the resulting bindings compile - the resulting bindings layout tests pass ```bash cd tests/property_test cargo test ``` Some things I'm unsure of: At the moment it lives in `tests/property_test` but isn't run when `cargo test` is invoked from bindgen's cargo manifest directory. At this point, the source is genereated in ~1 second but the files are large enough that it takes the `predicate.py` script ~30 seconds to run through each one. In order for the tests to run in under a minute only 2 are generated by quickcheck by default. This can be changed in the `test_bindgen` function of the `tests/property_test/tests/fuzzed-c-headers.rs` file. For now the `run_predicate_script` function in the `tests/property_test/tests/fuzzed-c-headers.rs` file contains a commented block that will copy generated source in the `tests/property_test/tests` directory. Should it be easier? There is some logic in the fuzzer that disallows 0 sized arrays because tests will regulary fail due to issues documented in #684 and #1153. Should this be special casing? After any iterations the reviewers are interested in required to make this a functional testing tool, should/could the fuzzing library be made into its own crate? I didn't move in that direction yet because having it all in one place seemed like the best way to figure out what works an doesn't but I'm interested in whether it might be useful as a standalone library. I'm looking forward to feedback on how to make this a more useful tool and one that provides the right configurability. Thanks! r? @fitzgen
2017-11-21Support bitfield allocation units larger than 64 bitsNick Fitzgerald
Individual bitfields are still limited to at most 64 bits, but this restriction can be weakened when Rust supports u128. This implements issue #816. Usage notes: * Since common code is added to each generated binding, a program which uses more than one binding may need to work around the duplication by including each binding in its own module. * The values created by bitfield allocation unit constructors can be assigned directly to the corresponding struct fields with no need for transmutation. Implementation notes: __BindgenBitfieldUnit represents a bitfield allocation unit using a Storage type accessible as a slice of u8. The alignment of the unit is inherited from an Align type by virtue of the field: align: [Align; 0], The position of this field in the struct is irrelevant. The alignment of the Storage type is intended to be no larger than the alignment of the Align type, which will be true if the Storage type is, for example, an array of u8. Although the double underscore (__) prefix is reserved for implementations of C++, there are precedents for this convention elsewhere in bindgen and so the convention is adopted here too. Acknowledgement: Thanks to @fitzgen for an initial implementation of __BindgenBitfieldUnit and code to integrate it into bindgen.
2017-11-20Auto merge of #1157 - tamird:use-ptr-null, r=emiliobors-servo
Generate ptr::null rather than zero literal
2017-11-18Generate ptr::null rather than zero literalTamir Duberstein
2017-11-16Auto merge of #1152 - glyn:document-integration-tests, r=emiliobors-servo
Improve documentation of the integration tests Also note the need to rebuild bindgen when running a single test. r? @emilio
2017-11-16Improve documentation of the integration testsGlyn Normington
Also: * disable rustfmt in the integration test, to avoid it causing problems, since it is not needed. * note the need to rebuild bindgen when running a single test.
2017-11-13Auto merge of #1149 - glyn:avoid-accesses-outside-self, r=emiliobors-servo
Avoid bitfield getters and setters accessing memory beyond "self" This fixes https://github.com/rust-lang-nursery/rust-bindgen/issues/954. r? @emilio
2017-11-13Avoid bitfield getters and setters accessing memory beyond "self"Glyn Normington
This fixes https://github.com/rust-lang-nursery/rust-bindgen/issues/954.
2017-11-10Auto merge of #1148 - roblabla:bugfix-unnecessaryWriteModeRustfmt, r=fitzgenbors-servo
Remove unnecessary flag from rustfmt invocation From rustfmt docs, the --write-mode flag is unecessary when passing the flag to stdin. If we leave it there, rustfmt-nightly complains that it cannot find the file named --write-mode, so let's remove the flag. here's the logs when I leave the flag : ``` Error: file `--write-mode=display` does not exist Error { repr: Custom(Custom { kind: Other, error: StringError("Internal rustfmt error") }) } ``` <details> <summary>The build.rs : </summary> ```rust extern crate bindgen; use std::env; use std::path::PathBuf; fn main() { println!("cargo:rustc-link-lib=static=transistor.nro"); println!("cargo:rustc-link-search=native=libtransistor/build/lib"); let bindings = bindgen::Builder::default() .header("libtransistor/include/libtransistor/nx.h") // Don't use host headers, to make sure we're building against newlib .clang_arg("-nostdinc") // Include the newlib/transistor headers, and the clang builtin headers .clang_args(&["-isystem", "/usr/lib/clang/5.0.0/include"]) .clang_args(&["-isystem", "libtransistor/newlib/newlib/libc/include"]) .clang_args(&["-isystem", "libtransistor/newlib/newlib/libc/sys/switch/include"]) .clang_arg("-Ilibtransistor/include") // We don't need to define those types, rust has them already anyways. // Blacklisting avoids a bug in bindgen where it creates cyclic references // (pub type u8 = u8) .blacklist_type("u(8|16|32|64)") .rustfmt_bindings(true) .rustfmt_configuration_file(None) .generate() .expect("Unable to generate bindings"); let out_path = PathBuf::from(env::var("OUT_DIR").unwrap()); bindings .write_to_file(out_path.join("bindings.rs")) .expect("Couldn't write bindings!"); } ``` </details>
2017-11-10Remove unnecessary flag from rustfmt invocationroblabla
From rustfmt docs, the --write-mode flag is unecessary when passing the flag to stdin. If we leave it there, rustfmt-nightly complains that it cannot find the file named --write-mode, so let's remove the flag.
2017-11-10Auto merge of #1146 - seemyvest:fix-metadata, r=emiliobors-servo
Don't unwrap header metadata Fix for a comment in #1092. r? @fitzgen
2017-11-10Don't unwrap header metadataseemyvest
2017-11-03Auto merge of #1141 - fitzgen:bitfield-without-layout, r=emiliobors-servo
Make bitfield unit allocation fallible Instead of panicking when we see a bitfield that does not have a layout, return an error up the stack. If we get an error when allocating bitfields into units, then make the whole struct opaque. Fixes #1140 r? @pepyakin or @emilio
2017-11-03Make bitfield unit allocation fallibleNick Fitzgerald
Instead of panicking when we see a bitfield that does not have a layout, return an error up the stack. If we get an error when allocating bitfields into units, then make the whole struct opaque. Fixes #1140
2017-11-02Auto merge of #1138 - fitzgen:stop-using-deprecated-methods, r=emiliobors-servo
Stop using deprecated methods r? @pepyakin