Skip to main content

Linker

Struct Linker 

Source
pub struct Linker { /* private fields */ }
Expand description

The Linker is responsible for analyzing the input modules and libraries provided to the assembler, and linking them together.

The core conceptual data structure of the linker is the module graph, which is implemented by a vector of module nodes, and a call graph, which is implemented as an adjacency matrix of item nodes and the outgoing edges from those nodes, representing references from that item to another symbol (typically as the result of procedure invocation, hence “call” graph).

Each item/symbol known to the linker is given a global item index, which is actually a pair of indices: a module index (which indexes into the vector of module nodes), and an item index (which indexes into the items defined by a module). These global item indices function as a unique identifier within the linker, to a specific item, and can be resolved to either the original syntax tree of the item, or to metadata about the item retrieved from previously- assembled MAST.

The process of linking involves two phases:

  1. Setting up the linker context, by providing the set of inputs to link together
  2. Analyzing and rewriting the symbols known to the linker, as needed, to ensure that all symbol references are resolved to concrete definitions.

The assembler will call Self::link once it has provided all inputs that it wants to link, which will, when successful, return the set of module indices corresponding to the modules that comprise the public interface of the assembled artifact. The assembler then constructs the MAST starting from the exported procedures of those modules, recursively tracing the call graph based on whether or not the callee is statically or dynamically linked. In the static linking case, any procedures referenced in a statically-linked library or module will be included in the assembled artifact. In the dynamic linking case, referenced procedures are instead referenced in the assembled artifact only by their MAST root.

Implementations§

Source§

impl Linker

Constructors

Source

pub fn new(source_manager: Arc<dyn SourceManager>) -> Self

Instantiate a new Linker, using the provided SourceManager to resolve source info.

Registers library and all of its modules with the linker, according to its linkage

Registers a set of MAST modules with the linker.

If called directly, the modules will default to being dynamically linked. You must use Self::link_library if you wish to statically link a set of assembled modules.

Registers a MAST module with the linker.

If called directly, the module will default to being dynamically linked. You must use Self::link_library if you wish to statically link module.

Registers a set of AST modules with the linker.

See Self::link_module for more details.

Registers an AST module with the linker.

A module provided to this method is presumed to be dynamically linked, unless specifically handled otherwise by the assembler. In particular, the assembler will only statically link the set of AST modules provided to Self::link, as they are expected to comprise the public interface of the assembled artifact.

§Errors

This operation can fail for the following reasons:

  • Module with same Path is in the graph already
  • Too many modules in the graph
§Panics

This function will panic if the number of modules exceeds the maximum representable ModuleIndex value, u16::MAX.

Source§

impl Linker

Kernels

Source

pub fn kernel(&self) -> &Kernel

Source

pub fn has_nonempty_kernel(&self) -> bool

Source§

impl Linker

Analysis

Links modules using the current state of the linker.

Returns the module indices corresponding to the provided modules, which are expected to provide the public interface of the final assembled artifact.

Links kernel using the current state of the linker.

Returns the module index of the kernel module, which is expected to provide the public interface of the final assembled kernel.

This differs from link in that we allow all AST modules in the module graph access to kernel features, e.g. caller, as if they are defined by the kernel module itself.

Source§

impl Linker

Accessors/Queries

Source

pub fn libraries(&self) -> impl Iterator<Item = &LinkLibrary>

Get an iterator over the external libraries the linker has linked against

Source

pub fn topological_sort_from_root( &self, caller: GlobalItemIndex, ) -> Result<Vec<GlobalItemIndex>, CycleError>

Compute the topological sort of the callgraph rooted at caller

Source

pub fn get_procedure_index_by_digest( &self, procedure_digest: &Word, ) -> Option<GlobalItemIndex>

Returns a procedure index which corresponds to the provided procedure digest.

Note that there can be many procedures with the same digest - due to having the same code, and/or using different decorators which don’t affect the MAST root. This method returns an arbitrary one.

Source

pub fn resolve_invoke_target( &self, caller: &SymbolResolutionContext, target: &InvocationTarget, ) -> Result<SymbolResolution, LinkerError>

Resolves target from the perspective of caller.

Source

pub fn resolve_alias_target( &self, caller: &SymbolResolutionContext, target: &Alias, ) -> Result<SymbolResolution, LinkerError>

Resolves target from the perspective of caller.

Source

pub fn resolve_path( &self, caller: &SymbolResolutionContext, path: &Path, ) -> Result<SymbolResolution, LinkerError>

Resolves path from the perspective of caller.

Source

pub fn find_module_index(&self, path: &Path) -> Option<ModuleIndex>

Resolve a Path to a ModuleIndex in this graph

Source

pub fn find_module(&self, path: &Path) -> Option<&LinkModule>

Resolve a Path to a Module in this graph

Trait Implementations§

Source§

impl Clone for Linker

Source§

fn clone(&self) -> Linker

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 Linker

Source§

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

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

impl Index<GlobalItemIndex> for Linker

Source§

type Output = Symbol

The returned type after indexing.
Source§

fn index(&self, index: GlobalItemIndex) -> &Self::Output

Performs the indexing (container[index]) operation. Read more
Source§

impl Index<ModuleIndex> for Linker

Source§

type Output = LinkModule

The returned type after indexing.
Source§

fn index(&self, index: ModuleIndex) -> &Self::Output

Performs the indexing (container[index]) operation. Read more

Auto Trait Implementations§

§

impl Freeze for Linker

§

impl !RefUnwindSafe for Linker

§

impl !Send for Linker

§

impl !Sync for Linker

§

impl Unpin for Linker

§

impl UnsafeUnpin for Linker

§

impl !UnwindSafe for Linker

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> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<D> OwoColorize for D

Source§

fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>
where C: Color,

Set the foreground color generically Read more
Source§

fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>
where C: Color,

Set the background color generically. Read more
Source§

fn black(&self) -> FgColorDisplay<'_, Black, Self>

Change the foreground color to black
Source§

fn on_black(&self) -> BgColorDisplay<'_, Black, Self>

Change the background color to black
Source§

fn red(&self) -> FgColorDisplay<'_, Red, Self>

Change the foreground color to red
Source§

fn on_red(&self) -> BgColorDisplay<'_, Red, Self>

Change the background color to red
Source§

fn green(&self) -> FgColorDisplay<'_, Green, Self>

Change the foreground color to green
Source§

fn on_green(&self) -> BgColorDisplay<'_, Green, Self>

Change the background color to green
Source§

fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>

Change the foreground color to yellow
Source§

fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>

Change the background color to yellow
Source§

fn blue(&self) -> FgColorDisplay<'_, Blue, Self>

Change the foreground color to blue
Source§

fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>

Change the background color to blue
Source§

fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to magenta
Source§

fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to magenta
Source§

fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to purple
Source§

fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to purple
Source§

fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>

Change the foreground color to cyan
Source§

fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>

Change the background color to cyan
Source§

fn white(&self) -> FgColorDisplay<'_, White, Self>

Change the foreground color to white
Source§

fn on_white(&self) -> BgColorDisplay<'_, White, Self>

Change the background color to white
Source§

fn default_color(&self) -> FgColorDisplay<'_, Default, Self>

Change the foreground color to the terminal default
Source§

fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>

Change the background color to the terminal default
Source§

fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>

Change the foreground color to bright black
Source§

fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>

Change the background color to bright black
Source§

fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>

Change the foreground color to bright red
Source§

fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>

Change the background color to bright red
Source§

fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>

Change the foreground color to bright green
Source§

fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>

Change the background color to bright green
Source§

fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>

Change the foreground color to bright yellow
Source§

fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>

Change the background color to bright yellow
Source§

fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>

Change the foreground color to bright blue
Source§

fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>

Change the background color to bright blue
Source§

fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright magenta
Source§

fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright magenta
Source§

fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright purple
Source§

fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright purple
Source§

fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>

Change the foreground color to bright cyan
Source§

fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>

Change the background color to bright cyan
Source§

fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>

Change the foreground color to bright white
Source§

fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>

Change the background color to bright white
Source§

fn bold(&self) -> BoldDisplay<'_, Self>

Make the text bold
Source§

fn dimmed(&self) -> DimDisplay<'_, Self>

Make the text dim
Source§

fn italic(&self) -> ItalicDisplay<'_, Self>

Make the text italicized
Source§

fn underline(&self) -> UnderlineDisplay<'_, Self>

Make the text underlined
Make the text blink
Make the text blink (but fast!)
Source§

fn reversed(&self) -> ReversedDisplay<'_, Self>

Swap the foreground and background colors
Source§

fn hidden(&self) -> HiddenDisplay<'_, Self>

Hide the text
Source§

fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>

Cross out the text
Source§

fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the foreground color at runtime. Only use if you do not know which color will be used at compile-time. If the color is constant, use either OwoColorize::fg or a color-specific method, such as OwoColorize::green, Read more
Source§

fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the background color at runtime. Only use if you do not know what color to use at compile-time. If the color is constant, use either OwoColorize::bg or a color-specific method, such as OwoColorize::on_yellow, Read more
Source§

fn fg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> FgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the foreground color to a specific RGB value.
Source§

fn bg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> BgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the background color to a specific RGB value.
Source§

fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self>

Sets the foreground color to an RGB value.
Source§

fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self>

Sets the background color to an RGB value.
Source§

fn style(&self, style: Style) -> Styled<&Self>

Apply a runtime-determined style
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
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 = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

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.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more