1 //! Representation of Cranelift IR functions.
2 
3 mod atomic_rmw_op;
4 mod builder;
5 pub mod constant;
6 pub mod dfg;
7 pub mod entities;
8 mod extfunc;
9 mod extname;
10 pub mod function;
11 mod globalvalue;
12 mod heap;
13 pub mod immediates;
14 pub mod instructions;
15 pub mod jumptable;
16 pub mod layout;
17 pub(crate) mod libcall;
18 mod memflags;
19 mod progpoint;
20 mod sourceloc;
21 pub mod stackslot;
22 mod table;
23 mod trapcode;
24 pub mod types;
25 mod valueloc;
26 
27 #[cfg(feature = "enable-serde")]
28 use serde::{Deserialize, Serialize};
29 
30 pub use crate::ir::atomic_rmw_op::AtomicRmwOp;
31 pub use crate::ir::builder::{
32     InsertBuilder, InstBuilder, InstBuilderBase, InstInserterBase, ReplaceBuilder,
33 };
34 pub use crate::ir::constant::{ConstantData, ConstantOffset, ConstantPool};
35 pub use crate::ir::dfg::{DataFlowGraph, ValueDef};
36 pub use crate::ir::entities::{
37     Block, Constant, FuncRef, GlobalValue, Heap, Immediate, Inst, JumpTable, SigRef, StackSlot,
38     Table, Value,
39 };
40 pub use crate::ir::extfunc::{
41     AbiParam, ArgumentExtension, ArgumentPurpose, ExtFuncData, Signature,
42 };
43 pub use crate::ir::extname::ExternalName;
44 pub use crate::ir::function::{DisplayFunctionAnnotations, Function};
45 pub use crate::ir::globalvalue::GlobalValueData;
46 pub use crate::ir::heap::{HeapData, HeapStyle};
47 pub use crate::ir::instructions::{
48     InstructionData, Opcode, ValueList, ValueListPool, VariableArgs,
49 };
50 pub use crate::ir::jumptable::JumpTableData;
51 pub use crate::ir::layout::Layout;
52 pub use crate::ir::libcall::{get_probestack_funcref, LibCall};
53 pub use crate::ir::memflags::{Endianness, MemFlags};
54 pub use crate::ir::progpoint::{ExpandedProgramPoint, ProgramOrder, ProgramPoint};
55 pub use crate::ir::sourceloc::SourceLoc;
56 pub use crate::ir::stackslot::{StackLayoutInfo, StackSlotData, StackSlotKind, StackSlots};
57 pub use crate::ir::table::TableData;
58 pub use crate::ir::trapcode::TrapCode;
59 pub use crate::ir::types::Type;
60 pub use crate::ir::valueloc::{ArgumentLoc, ValueLoc};
61 pub use crate::value_label::LabelValueLoc;
62 pub use cranelift_codegen_shared::condcodes;
63 
64 use crate::binemit;
65 use crate::entity::{entity_impl, PrimaryMap, SecondaryMap};
66 use crate::isa;
67 
68 /// Map of value locations.
69 pub type ValueLocations = SecondaryMap<Value, ValueLoc>;
70 
71 /// Map of jump tables.
72 pub type JumpTables = PrimaryMap<JumpTable, JumpTableData>;
73 
74 /// Map of instruction encodings.
75 pub type InstEncodings = SecondaryMap<Inst, isa::Encoding>;
76 
77 /// Code offsets for blocks.
78 pub type BlockOffsets = SecondaryMap<Block, binemit::CodeOffset>;
79 
80 /// Code offsets for Jump Tables.
81 pub type JumpTableOffsets = SecondaryMap<JumpTable, binemit::CodeOffset>;
82 
83 /// Source locations for instructions.
84 pub type SourceLocs = SecondaryMap<Inst, SourceLoc>;
85 
86 /// Marked with a label value.
87 #[derive(Copy, Clone, PartialEq, Eq, Hash)]
88 #[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
89 pub struct ValueLabel(u32);
90 entity_impl!(ValueLabel, "val");
91 
92 /// A label of a Value.
93 #[derive(Debug, Clone)]
94 #[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
95 pub struct ValueLabelStart {
96     /// Source location when it is in effect
97     pub from: SourceLoc,
98 
99     /// The label index.
100     pub label: ValueLabel,
101 }
102 
103 /// Value label assignements: label starts or value aliases.
104 #[derive(Debug, Clone)]
105 #[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
106 pub enum ValueLabelAssignments {
107     /// Original value labels assigned at transform.
108     Starts(alloc::vec::Vec<ValueLabelStart>),
109 
110     /// A value alias to original value.
111     Alias {
112         /// Source location when it is in effect
113         from: SourceLoc,
114 
115         /// The label index.
116         value: Value,
117     },
118 }
119