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 kind

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 · 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.

§

impl<T> Instrument for T

§

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

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

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
§

impl<D> OwoColorize for D

§

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

Set the foreground color generically Read more
§

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

Set the background color generically. Read more
§

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

Change the foreground color to black
§

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

Change the background color to black
§

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

Change the foreground color to red
§

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

Change the background color to red
§

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

Change the foreground color to green
§

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

Change the background color to green
§

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

Change the foreground color to yellow
§

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

Change the background color to yellow
§

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

Change the foreground color to blue
§

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

Change the background color to blue
§

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

Change the foreground color to magenta
§

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

Change the background color to magenta
§

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

Change the foreground color to purple
§

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

Change the background color to purple
§

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

Change the foreground color to cyan
§

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

Change the background color to cyan
§

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

Change the foreground color to white
§

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

Change the background color to white
§

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

Change the foreground color to the terminal default
§

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

Change the background color to the terminal default
§

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

Change the foreground color to bright black
§

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

Change the background color to bright black
§

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

Change the foreground color to bright red
§

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

Change the background color to bright red
§

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

Change the foreground color to bright green
§

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

Change the background color to bright green
§

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

Change the foreground color to bright yellow
§

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

Change the background color to bright yellow
§

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

Change the foreground color to bright blue
§

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

Change the background color to bright blue
§

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

Change the foreground color to bright magenta
§

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

Change the background color to bright magenta
§

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

Change the foreground color to bright purple
§

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

Change the background color to bright purple
§

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

Change the foreground color to bright cyan
§

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

Change the background color to bright cyan
§

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

Change the foreground color to bright white
§

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

Change the background color to bright white
§

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

Make the text bold
§

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

Make the text dim
§

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

Make the text italicized
§

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

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

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

Swap the foreground and background colors
§

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

Hide the text
§

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

Cross out the text
§

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
§

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
§

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

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

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

Sets the foreground color to an RGB value.
§

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

Sets the background color to an RGB value.
§

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

Apply a runtime-determined style
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
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.
§

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

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

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
§

fn with_current_subscriber(self) -> WithDispatch<Self>

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