-
-
Notifications
You must be signed in to change notification settings - Fork 50
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Support fine-grained control over Target Features #12
Comments
After merging all the arch PRs, I realized that everyone did their own thing when it comes to #[derive]s and wording on the various structs, which made the docs feel kind-of disjointed. This PR makes everything much more uniform. For example, all implementors of the `Register` trait are now guaranteed to implement `Debug`, `Default`, and `Clone`, the latter of which being particularly useful when writing tests. There is an argument to be made that `Eq` and `PartialEq` should also be auto-derived, but aside from writing assert tests, I'm not too sure when those would be useful? Additionally, I've changed all instances of `struct FooArch;` to `enum FooArch{}`, which ensures that `Arch` implementations are purely a type level construct. I may have to revert this at some point, depending on how #12 gets tackled, but for now, having Arch implementations as enums makes more sense.
After merging all the arch PRs, I realized that everyone did their own thing when it comes to #[derive]s and wording on the various structs, which made the docs feel kind-of disjointed. This PR makes everything much more uniform. For example, all implementors of the `Register` trait are now guaranteed to implement `Debug`, `Default`, `Clone`, `Eq`, and `PartialEq`. Additionally, I've changed all instances of `struct FooArch;` to `enum FooArch{}`, which ensures that `Arch` implementations are purely a type level construct. I may have to revert this at some point, depending on how #12 gets tackled, but for now, having Arch implementations as enums makes more sense.
After merging all the arch PRs, I realized that everyone did their own thing when it comes to #[derive]s and wording on the various structs, which made the docs feel kind-of disjointed. This PR makes everything much more uniform. For example, all implementors of the `Register` trait are now guaranteed to implement `Debug`, `Default`, `Clone`, and `PartialEq`. Note that this does _not_ include `Eq`, as some architectures have explicit IEEE floating point registers (i.e: PowerPC), which do not implement `Eq`. Additionally, I've changed all instances of `struct FooArch;` to `enum FooArch{}`, which ensures that `Arch` implementations are purely a type level construct. I may have to revert this at some point, depending on how #12 gets tackled, but for now, having Arch implementations as enums makes more sense.
Hmm, I wonder if a quick-and-dirty solution might be to create some sort of "arch builder" macro? Instead of exposing types that implement A rough sketch of what the end-user API might look like: arch_builder! {
name: CustomX86,
arch: x86_64,
features: [
core, sse, segments, avx
]
} Not sure what the implementation might look like, but this would fix the immediate problem of how to easily compose different Arch traits. Of course, this approach isn't that great, since macro-based codegen is kinda hacky in my book. That said, I wanted to write this idea down before I forgot it, since it might be a good jumping off point in the future. |
So here's something interesting: https://sourceware.org/gdb/onlinedocs/gdb/Target-Description-Format.html#Inclusion Turns out target description XMLs support using For example: target.xml <?xml version="1.0"?>
<!DOCTYPE target SYSTEM "gdb-target.dtd">
<target version="1.0">
<architecture>i386:x86-64</architecture>
<xi:include href="core64-regs.xml"/>
</target> core64-regs.xml <?xml version="1.0"?>
<!DOCTYPE target SYSTEM "gdb-target.dtd">
<feature name="org.gnu.gdb.i386.core">
...
</feature> I'm definitely going to update the |
I plan on working on this by implementing #109 (comment) i.e. making the This will help with unifying the MIPS architecture and trimming the ridiculously large list of AArch64 system registers that's reported to the GDB client (e.g. because the HW doesn't support an optional feature or because the GDB server can assume that the code won't ever run at certain ELs). |
Aside from specifying the core architecture of the target, the Target Description XML is also used to specify various features of the architecture. As the docs say: "Features are currently used to describe available CPU registers and the types of their contents"
e.g: for x86, the core registers are defined under the
org.gnu.gdb.i386.core
feature, while the optional SSE registers are defined under theorg.gnu.gdb.i386.sse
feature.Currently, the
Arch
trait isn't very well suited to describing features, requiring a separate implementation for each set of features. i.e: if an architecture has 3 different features, A, B, and C, each with their own registers, there would have to be 3! (i.e: 6) different register structs to describe each set of features!I'd like to preserve the current "described at compile time" approach to the
Arch
trait, and I think with a little bit of experimentation, it shouldn't be too hard to find some sort of ergonomic trait-based solution to the problem.Some general ideas:
target_features_xml
method accept aFnMut(&'static str)
callback (instead of returningOption<'static str>
, as that would allow building up an XML file in "chunks" based on which features are available.The text was updated successfully, but these errors were encountered: