Skip to main content

Options

Struct Options 

Source
pub struct Options {
    pub level: OptLevel,
    pub toggles: Vec<(String, bool)>,
    pub fuel: HashMap<String, u32>,
    pub global_fuel: Option<u32>,
    pub gates: Gates,
    pub dumps: Dumps,
    pub verify: bool,
    pub interposition: Pic,
}
Expand description

What the command line asked the optimizer for.

Fields§

§level: OptLevel

Which pipeline to start from.

§toggles: Vec<(String, bool)>

The passes -f<name> added and -fno-<name> removed, in the order they were given, so that the last mention of a pass is the one that decides.

§fuel: HashMap<String, u32>

What -fpass-fuel=<pass>=<n> limited, by pass name.

§global_fuel: Option<u32>

What -fpass-fuel-global=<n> limited the whole pipeline to, across every pass.

This is the outer search of the two in section 4.5 of spec/optimizer/04-pass-manager.md. Halving this finds the pass, and halving -fpass-fuel for that pass finds the rewrite inside it. Two searches of twenty compilations each beat one search over a space nobody knows the shape of.

§gates: Gates

What -fdisable-<pass> and -fenable-<pass> said about which functions a pass runs on.

§dumps: Dumps

What -fdump-ir= asked to see.

§verify: bool

Whether the verifier runs after every pass that changed anything.

§interposition: Pic

Which definitions in this module something else may replace at load time.

The analyses that read a body and write down what they found have to stop at a name like that, because the body they read is not the one that will run. Pic::Library is the answer when the object may end up in a shared library and the exported names in it are interposable, which is what -fPIC alone means and is gcc’s default.

Pic::Executable is the answer for everything else, and that includes -fno-semantic-interposition, where the build has promised that the definition here is the one that runs. It is a promise and not a deduction, and it is the one every distribution makes, because a library that cannot inline its own functions into each other pays for the possibility of an interposition that never happens.

This is not the same value the code generator is given. How an address is reached does not change under that promise, and gcc does not change it either: a variable a shared library exports is still read out of the global offset table, because the promise is about which definition runs rather than about how many copies of the variable there are.

Implementations§

Source§

impl Options

Source

pub fn for_level(level: OptLevel) -> Self

The options a level asks for on its own.

Source

pub fn chosen(&self) -> Vec<&'static str>

The passes the level and the -f flags chose, in order, before the gates are consulted.

A pass named by -f<name> that the level did not choose is appended, because the only place it could go that does not need an ordering rule nobody wrote down is the end.

Source

pub fn passes(&self) -> Vec<&'static dyn Pass>

The passes that will run, in order, over at least one function.

A pass -fenable-<name> reached that the level did not choose is appended after them, for the same reason and in the same place. It runs only over the functions the gate names, which is the whole point of the flag: a pass being in this list is not the same question as a pass running on the function somebody is looking at.

Trait Implementations§

Source§

impl Clone for Options

Source§

fn clone(&self) -> Options

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Options

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for Options

Source§

fn default() -> Self

The default level with nothing added to it, and the verifier on in a debug build, which is what section 9.10 asks for.

Source§

impl Eq for Options

Source§

impl PartialEq for Options

Source§

fn eq(&self, other: &Options) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for Options

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.