pub struct GlobalVariableTable { /* private fields */ }Expand description
This table is used to lay out and link together global variables for a Program.
See the docs for Linkage, GlobalVariableData, and GlobalVariableTable::declare for more details.
Implementations§
Source§impl GlobalVariableTable
impl GlobalVariableTable
pub fn new(conflict_strategy: ConflictResolutionStrategy) -> Self
Sourcepub fn iter<'a, 'b: 'a>(&'b self) -> Iter<'a, GlobalVariableAdapter>
pub fn iter<'a, 'b: 'a>(&'b self) -> Iter<'a, GlobalVariableAdapter>
Get a double-ended iterator over the current table layout
Sourcepub fn exists(&self, name: Ident) -> bool
pub fn exists(&self, name: Ident) -> bool
Returns true if a global variable with name has been declared
Sourcepub fn find(&self, name: Ident) -> Option<GlobalVariable>
pub fn find(&self, name: Ident) -> Option<GlobalVariable>
Looks up a GlobalVariable by name.
Sourcepub fn get(&self, id: GlobalVariable) -> &GlobalVariableData
pub fn get(&self, id: GlobalVariable) -> &GlobalVariableData
Gets the data associated with the given GlobalVariable
Sourcepub fn contains_key(&self, id: GlobalVariable) -> bool
pub fn contains_key(&self, id: GlobalVariable) -> bool
Checks if the given id can be found in this table
Sourcepub fn remove(&mut self, id: GlobalVariable)
pub fn remove(&mut self, id: GlobalVariable)
Removes the global variable associated with id from this table
The actual definition remains behind, in order to ensure that id
remains valid should there be any other outstanding references,
however the data is removed from the layout, and will not be
seen when traversing the table.
Sourcepub fn size_in_bytes(&self) -> usize
pub fn size_in_bytes(&self) -> usize
Computes the total size in bytes of the table, as it is currently laid out.
Sourcepub unsafe fn offset_of(&self, id: GlobalVariable) -> u32
pub unsafe fn offset_of(&self, id: GlobalVariable) -> u32
Computes the offset, in bytes, of the given GlobalVariable from the
start of the segment in which globals are allocated, assuming that the
layout of the global variable table up to and including id remains
unchanged.
§Safety
This should only be used once all data segments and global variables have been declared, and the layout of the table has been decided. It is technically safe to use offsets obtained before all global variables are declared, IF the data segments and global variable layout up to and including those global variables remains unchanged after that point.
If the offset for a given global variable is obtained, and the heap layout is subsequently changed in such a way that the original offset is no longer accurate, bad things will happen.
Sourcepub fn get_constant(&self, id: Constant) -> Arc<ConstantData>
pub fn get_constant(&self, id: Constant) -> Arc<ConstantData>
Get the constant data associated with id
Sourcepub fn insert_constant(&mut self, data: ConstantData) -> Constant
pub fn insert_constant(&mut self, data: ConstantData) -> Constant
Inserts the given constant data into this table without allocating a global
Sourcepub fn insert_refcounted_constant(
&mut self,
data: Arc<ConstantData>,
) -> Constant
pub fn insert_refcounted_constant( &mut self, data: Arc<ConstantData>, ) -> Constant
Inserts the given constant data into this table without allocating a global
Sourcepub fn contains_constant(&self, data: &ConstantData) -> bool
pub fn contains_constant(&self, data: &ConstantData) -> bool
Returns true if the given constant data is in the constant pool
Sourcepub fn constants(
&self,
) -> impl Iterator<Item = (Constant, Arc<ConstantData>)> + '_
pub fn constants( &self, ) -> impl Iterator<Item = (Constant, Arc<ConstantData>)> + '_
Traverse all of the constants in the table
Sourcepub fn has_constants(&self) -> bool
pub fn has_constants(&self) -> bool
Returns true if the table has constant data stored
Sourcepub fn declare(
&mut self,
name: Ident,
ty: Type,
linkage: Linkage,
init: Option<ConstantData>,
) -> Result<GlobalVariable, GlobalVariableError>
pub fn declare( &mut self, name: Ident, ty: Type, linkage: Linkage, init: Option<ConstantData>, ) -> Result<GlobalVariable, GlobalVariableError>
Declares a new global variable with the given symbol name, type, linkage, and optional initializer.
If successful, Ok is returned, with the GlobalVariable corresponding to the data for the
symbol.
Returns an error if the specification of the global is invalid in any way, or the declaration conflicts with a previous declaration of the same name.
NOTE: While similar to try_insert, a key difference is that try_declare does not attempt
to resolve conflicts. If the given name has been previously declared, and the
declarations are not identical, then an error will be returned. This is because conflict
resolution is a process performed when linking together modules. Declaring globals is
done during the initial construction of a module, where any attempt to rename a global
variable locally would cause unexpected issues as references to that global are emitted.
Once a module is constructed, globals it declares with internal linkage can be renamed
freely, as the name is no longer significant.
Sourcepub fn try_insert(
&mut self,
data: GlobalVariableData,
) -> Result<(GlobalVariable, bool), GlobalVariableError>
pub fn try_insert( &mut self, data: GlobalVariableData, ) -> Result<(GlobalVariable, bool), GlobalVariableError>
Attempt to insert the given GlobalVariableData into this table.
Returns the id of the global variable in the table, along with a flag indicating whether the global symbol was renamed to resolve a conflict with an existing symbol. The caller is expected to handle such renames so that any references to the original name that are affected can be updated.
If there was an unresolvable conflict, an error will be returned.
Sourcepub fn set_initializer(
&mut self,
gv: GlobalVariable,
init: ConstantData,
) -> Result<(), GlobalVariableError>
pub fn set_initializer( &mut self, gv: GlobalVariable, init: ConstantData, ) -> Result<(), GlobalVariableError>
This sets the initializer for the given GlobalVariable to init.
This function will return Err if any of the following occur:
- The global variable already has an initializer
- The given data does not match the type of the global variable, i.e. more data than the type supports.
If the data is smaller than the type of the global variable, the data will be zero-extended to fill it out.
NOTE: The initializer data is expected to be in little-endian order.
Trait Implementations§
Source§impl Debug for GlobalVariableTable
impl Debug for GlobalVariableTable
Auto Trait Implementations§
impl !Freeze for GlobalVariableTable
impl !RefUnwindSafe for GlobalVariableTable
impl !Send for GlobalVariableTable
impl !Sync for GlobalVariableTable
impl Unpin for GlobalVariableTable
impl !UnwindSafe for GlobalVariableTable
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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 moreSource§impl<D> OwoColorize for D
impl<D> OwoColorize for D
Source§fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
Source§fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
Source§fn black(&self) -> FgColorDisplay<'_, Black, Self>
fn black(&self) -> FgColorDisplay<'_, Black, Self>
Source§fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
Source§fn red(&self) -> FgColorDisplay<'_, Red, Self>
fn red(&self) -> FgColorDisplay<'_, Red, Self>
Source§fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
Source§fn green(&self) -> FgColorDisplay<'_, Green, Self>
fn green(&self) -> FgColorDisplay<'_, Green, Self>
Source§fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
Source§fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
Source§fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
Source§fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
Source§fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
Source§fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
Source§fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
Source§fn white(&self) -> FgColorDisplay<'_, White, Self>
fn white(&self) -> FgColorDisplay<'_, White, Self>
Source§fn on_white(&self) -> BgColorDisplay<'_, White, Self>
fn on_white(&self) -> BgColorDisplay<'_, White, Self>
Source§fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
Source§fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
Source§fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
Source§fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
Source§fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
Source§fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
Source§fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
Source§fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
Source§fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
Source§fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
Source§fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
Source§fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
Source§fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
Source§fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
Source§fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
Source§fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
Source§fn bold(&self) -> BoldDisplay<'_, Self>
fn bold(&self) -> BoldDisplay<'_, Self>
Source§fn dimmed(&self) -> DimDisplay<'_, Self>
fn dimmed(&self) -> DimDisplay<'_, Self>
Source§fn italic(&self) -> ItalicDisplay<'_, Self>
fn italic(&self) -> ItalicDisplay<'_, Self>
Source§fn underline(&self) -> UnderlineDisplay<'_, Self>
fn underline(&self) -> UnderlineDisplay<'_, Self>
Source§fn blink(&self) -> BlinkDisplay<'_, Self>
fn blink(&self) -> BlinkDisplay<'_, Self>
Source§fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
Source§fn reversed(&self) -> ReversedDisplay<'_, Self>
fn reversed(&self) -> ReversedDisplay<'_, Self>
Source§fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
Source§fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::fg or
a color-specific method, such as OwoColorize::green, Read moreSource§fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::bg or
a color-specific method, such as OwoColorize::on_yellow, Read more