1 use super::BackendTypes;
2 use crate::mir::operand::OperandRef;
3 use crate::mir::place::PlaceRef;
4 use rustc_ast::{InlineAsmOptions, InlineAsmTemplatePiece};
5 use rustc_hir::def_id::DefId;
6 use rustc_middle::ty::Instance;
8 use rustc_target::asm::InlineAsmRegOrRegClass;
11 pub enum InlineAsmOperandRef<'tcx, B: BackendTypes + ?Sized> {
13 reg: InlineAsmRegOrRegClass,
14 value: OperandRef<'tcx, B::Value>,
17 reg: InlineAsmRegOrRegClass,
19 place: Option<PlaceRef<'tcx, B::Value>>,
22 reg: InlineAsmRegOrRegClass,
24 in_value: OperandRef<'tcx, B::Value>,
25 out_place: Option<PlaceRef<'tcx, B::Value>>,
31 instance: Instance<'tcx>,
39 pub enum GlobalAsmOperandRef<'tcx> {
40 Const { string: String },
41 SymFn { instance: Instance<'tcx> },
42 SymStatic { def_id: DefId },
45 pub trait AsmBuilderMethods<'tcx>: BackendTypes {
46 /// Take an inline assembly expression and splat it out via LLVM
47 fn codegen_inline_asm(
49 template: &[InlineAsmTemplatePiece],
50 operands: &[InlineAsmOperandRef<'tcx, Self>],
51 options: InlineAsmOptions,
53 instance: Instance<'_>,
54 dest_catch_funclet: Option<(Self::BasicBlock, Self::BasicBlock, Option<&Self::Funclet>)>,
58 pub trait AsmMethods<'tcx> {
59 fn codegen_global_asm(
61 template: &[InlineAsmTemplatePiece],
62 operands: &[GlobalAsmOperandRef<'tcx>],
63 options: InlineAsmOptions,