70 lines
1.8 KiB
Rust
70 lines
1.8 KiB
Rust
use super::BackendTypes;
|
|
use crate::mir::operand::OperandRef;
|
|
use crate::mir::place::PlaceRef;
|
|
use rustc_ast::{InlineAsmOptions, InlineAsmTemplatePiece};
|
|
use rustc_hir::def_id::DefId;
|
|
use rustc_middle::ty::Instance;
|
|
use rustc_span::Span;
|
|
use rustc_target::asm::InlineAsmRegOrRegClass;
|
|
|
|
#[derive(Debug)]
|
|
pub enum InlineAsmOperandRef<'tcx, B: BackendTypes + ?Sized> {
|
|
In {
|
|
reg: InlineAsmRegOrRegClass,
|
|
value: OperandRef<'tcx, B::Value>,
|
|
},
|
|
Out {
|
|
reg: InlineAsmRegOrRegClass,
|
|
late: bool,
|
|
place: Option<PlaceRef<'tcx, B::Value>>,
|
|
},
|
|
InOut {
|
|
reg: InlineAsmRegOrRegClass,
|
|
late: bool,
|
|
in_value: OperandRef<'tcx, B::Value>,
|
|
out_place: Option<PlaceRef<'tcx, B::Value>>,
|
|
},
|
|
Const {
|
|
string: String,
|
|
},
|
|
SymFn {
|
|
instance: Instance<'tcx>,
|
|
},
|
|
SymStatic {
|
|
def_id: DefId,
|
|
},
|
|
Label {
|
|
label: B::BasicBlock,
|
|
},
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
pub enum GlobalAsmOperandRef<'tcx> {
|
|
Const { string: String },
|
|
SymFn { instance: Instance<'tcx> },
|
|
SymStatic { def_id: DefId },
|
|
}
|
|
|
|
pub trait AsmBuilderMethods<'tcx>: BackendTypes {
|
|
/// Take an inline assembly expression and splat it out via LLVM
|
|
fn codegen_inline_asm(
|
|
&mut self,
|
|
template: &[InlineAsmTemplatePiece],
|
|
operands: &[InlineAsmOperandRef<'tcx, Self>],
|
|
options: InlineAsmOptions,
|
|
line_spans: &[Span],
|
|
instance: Instance<'_>,
|
|
dest: Option<Self::BasicBlock>,
|
|
catch_funclet: Option<(Self::BasicBlock, Option<&Self::Funclet>)>,
|
|
);
|
|
}
|
|
|
|
pub trait AsmMethods<'tcx> {
|
|
fn codegen_global_asm(
|
|
&self,
|
|
template: &[InlineAsmTemplatePiece],
|
|
operands: &[GlobalAsmOperandRef<'tcx>],
|
|
options: InlineAsmOptions,
|
|
line_spans: &[Span],
|
|
);
|
|
}
|