1
Fork 0
rust/compiler/rustc_codegen_ssa/src/traits/asm.rs

73 lines
1.8 KiB
Rust
Raw Normal View History

use super::BackendTypes;
2020-02-17 21:36:01 +00:00
use crate::mir::operand::OperandRef;
2019-02-09 23:31:47 +09:00
use crate::mir::place::PlaceRef;
2020-04-27 23:26:11 +05:30
use rustc_ast::{InlineAsmOptions, InlineAsmTemplatePiece};
2020-02-17 21:36:01 +00:00
use rustc_hir::def_id::DefId;
use rustc_hir::LlvmInlineAsmInner;
2020-02-17 21:36:01 +00:00
use rustc_middle::ty::Instance;
use rustc_span::Span;
use rustc_target::asm::InlineAsmRegOrRegClass;
2020-02-17 21:36:01 +00:00
#[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,
},
}
#[derive(Debug)]
pub enum GlobalAsmOperandRef {
Const { string: String },
}
pub trait AsmBuilderMethods<'tcx>: BackendTypes {
/// Take an inline assembly expression and splat it out via LLVM
fn codegen_llvm_inline_asm(
&mut self,
ia: &LlvmInlineAsmInner,
outputs: Vec<PlaceRef<'tcx, Self::Value>>,
inputs: Vec<Self::Value>,
span: Span,
) -> bool;
2020-02-17 21:36:01 +00:00
/// 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,
2020-05-26 20:07:59 +01:00
line_spans: &[Span],
2020-02-17 21:36:01 +00:00
);
}
pub trait AsmMethods {
fn codegen_global_asm(
&self,
template: &[InlineAsmTemplatePiece],
operands: &[GlobalAsmOperandRef],
options: InlineAsmOptions,
line_spans: &[Span],
);
}