Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit a656349

Browse files
committed
Move InlineAsmTemplatePiece and InlineAsmOptions to librustc_ast
1 parent 330bdf8 commit a656349

File tree

20 files changed

+108
-105
lines changed

20 files changed

+108
-105
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3625,13 +3625,13 @@ dependencies = [
36253625
name = "rustc_ast"
36263626
version = "0.0.0"
36273627
dependencies = [
3628+
"bitflags",
36283629
"log",
36293630
"rustc_data_structures",
36303631
"rustc_index",
36313632
"rustc_lexer",
36323633
"rustc_macros",
36333634
"rustc_span",
3634-
"rustc_target",
36353635
"scoped-tls",
36363636
"serialize",
36373637
"smallvec 1.4.0",

src/librustc_ast/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,4 @@ rustc_index = { path = "../librustc_index" }
1919
rustc_lexer = { path = "../librustc_lexer" }
2020
rustc_macros = { path = "../librustc_macros" }
2121
smallvec = { version = "1.0", features = ["union", "may_dangle"] }
22-
rustc_target = { path = "../librustc_target" }
22+
bitflags = "1.2.1"

src/librustc_ast/ast.rs

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ use rustc_serialize::{self, Decoder, Encoder};
3434
use rustc_span::source_map::{respan, Spanned};
3535
use rustc_span::symbol::{kw, sym, Ident, Symbol};
3636
use rustc_span::{Span, DUMMY_SP};
37-
use rustc_target::asm::{InlineAsmOptions, InlineAsmTemplatePiece};
3837

3938
use std::convert::TryFrom;
4039
use std::fmt;
@@ -1876,6 +1875,60 @@ pub enum InlineAsmRegOrRegClass {
18761875
RegClass(Symbol),
18771876
}
18781877

1878+
bitflags::bitflags! {
1879+
#[derive(RustcEncodable, RustcDecodable, HashStable_Generic)]
1880+
pub struct InlineAsmOptions: u8 {
1881+
const PURE = 1 << 0;
1882+
const NOMEM = 1 << 1;
1883+
const READONLY = 1 << 2;
1884+
const PRESERVES_FLAGS = 1 << 3;
1885+
const NORETURN = 1 << 4;
1886+
const NOSTACK = 1 << 5;
1887+
const ATT_SYNTAX = 1 << 6;
1888+
}
1889+
}
1890+
1891+
#[derive(Clone, PartialEq, RustcEncodable, RustcDecodable, Debug, HashStable_Generic)]
1892+
pub enum InlineAsmTemplatePiece {
1893+
String(String),
1894+
Placeholder { operand_idx: usize, modifier: Option<char>, span: Span },
1895+
}
1896+
1897+
impl fmt::Display for InlineAsmTemplatePiece {
1898+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1899+
match self {
1900+
Self::String(s) => {
1901+
for c in s.chars() {
1902+
match c {
1903+
'{' => f.write_str("{{")?,
1904+
'}' => f.write_str("}}")?,
1905+
_ => write!(f, "{}", c.escape_debug())?,
1906+
}
1907+
}
1908+
Ok(())
1909+
}
1910+
Self::Placeholder { operand_idx, modifier: Some(modifier), .. } => {
1911+
write!(f, "{{{}:{}}}", operand_idx, modifier)
1912+
}
1913+
Self::Placeholder { operand_idx, modifier: None, .. } => {
1914+
write!(f, "{{{}}}", operand_idx)
1915+
}
1916+
}
1917+
}
1918+
}
1919+
1920+
impl InlineAsmTemplatePiece {
1921+
/// Rebuilds the asm template string from its pieces.
1922+
pub fn to_string(s: &[Self]) -> String {
1923+
use fmt::Write;
1924+
let mut out = String::new();
1925+
for p in s.iter() {
1926+
let _ = write!(out, "{}", p);
1927+
}
1928+
out
1929+
}
1930+
}
1931+
18791932
/// Inline assembly operand.
18801933
///
18811934
/// E.g., `out("eax") result` as in `asm!("mov eax, 2", out("eax") result)`.

src/librustc_ast_lowering/expr.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -980,7 +980,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
980980
struct_span_err!(self.sess, sp, E0472, "asm! is unsupported on this target").emit();
981981
return hir::ExprKind::Err;
982982
};
983-
if asm.options.contains(asm::InlineAsmOptions::ATT_SYNTAX) {
983+
if asm.options.contains(InlineAsmOptions::ATT_SYNTAX) {
984984
match asm_arch {
985985
asm::InlineAsmArch::X86 | asm::InlineAsmArch::X86_64 => {}
986986
_ => self
@@ -1070,7 +1070,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
10701070

10711071
// Validate template modifiers against the register classes for the operands
10721072
for p in &asm.template {
1073-
if let asm::InlineAsmTemplatePiece::Placeholder {
1073+
if let InlineAsmTemplatePiece::Placeholder {
10741074
operand_idx,
10751075
modifier: Some(modifier),
10761076
span: placeholder_span,

src/librustc_ast_pretty/pprust.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use rustc_ast::ast::{self, BlockCheckMode, PatKind, RangeEnd, RangeSyntax};
55
use rustc_ast::ast::{Attribute, GenericArg, MacArgs};
66
use rustc_ast::ast::{GenericBound, SelfKind, TraitBoundModifier};
77
use rustc_ast::ast::{InlineAsmOperand, InlineAsmRegOrRegClass};
8+
use rustc_ast::ast::{InlineAsmOptions, InlineAsmTemplatePiece};
89
use rustc_ast::attr;
910
use rustc_ast::ptr::P;
1011
use rustc_ast::token::{self, BinOpToken, DelimToken, Nonterminal, Token, TokenKind};
@@ -15,7 +16,6 @@ use rustc_span::edition::Edition;
1516
use rustc_span::source_map::{SourceMap, Spanned};
1617
use rustc_span::symbol::{kw, sym, Ident, IdentPrinter, Symbol};
1718
use rustc_span::{BytePos, FileName, Span};
18-
use rustc_target::asm::{InlineAsmOptions, InlineAsmTemplatePiece};
1919

2020
use std::borrow::Cow;
2121

src/librustc_builtin_macros/asm.rs

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,13 @@ use rustc_expand::base::{self, *};
1010
use rustc_parse::parser::Parser;
1111
use rustc_span::symbol::{kw, sym, Symbol};
1212
use rustc_span::{InnerSpan, Span};
13-
use rustc_target::asm::{InlineAsmOptions, InlineAsmTemplatePiece};
1413

1514
struct AsmArgs {
1615
template: P<ast::Expr>,
1716
operands: Vec<(ast::InlineAsmOperand, Span)>,
1817
named_args: FxHashMap<Symbol, usize>,
1918
reg_args: FxHashSet<usize>,
20-
options: InlineAsmOptions,
19+
options: ast::InlineAsmOptions,
2120
options_span: Option<Span>,
2221
}
2322

@@ -57,7 +56,7 @@ fn parse_args<'a>(
5756
operands: vec![],
5857
named_args: FxHashMap::default(),
5958
reg_args: FxHashSet::default(),
60-
options: InlineAsmOptions::empty(),
59+
options: ast::InlineAsmOptions::empty(),
6160
options_span: None,
6261
};
6362

@@ -204,22 +203,22 @@ fn parse_args<'a>(
204203
}
205204
}
206205

207-
if args.options.contains(InlineAsmOptions::NOMEM)
208-
&& args.options.contains(InlineAsmOptions::READONLY)
206+
if args.options.contains(ast::InlineAsmOptions::NOMEM)
207+
&& args.options.contains(ast::InlineAsmOptions::READONLY)
209208
{
210209
let span = args.options_span.unwrap();
211210
ecx.struct_span_err(span, "the `nomem` and `readonly` options are mutually exclusive")
212211
.emit();
213212
}
214-
if args.options.contains(InlineAsmOptions::PURE)
215-
&& args.options.contains(InlineAsmOptions::NORETURN)
213+
if args.options.contains(ast::InlineAsmOptions::PURE)
214+
&& args.options.contains(ast::InlineAsmOptions::NORETURN)
216215
{
217216
let span = args.options_span.unwrap();
218217
ecx.struct_span_err(span, "the `pure` and `noreturn` options are mutually exclusive")
219218
.emit();
220219
}
221-
if args.options.contains(InlineAsmOptions::PURE)
222-
&& !args.options.intersects(InlineAsmOptions::NOMEM | InlineAsmOptions::READONLY)
220+
if args.options.contains(ast::InlineAsmOptions::PURE)
221+
&& !args.options.intersects(ast::InlineAsmOptions::NOMEM | ast::InlineAsmOptions::READONLY)
223222
{
224223
let span = args.options_span.unwrap();
225224
ecx.struct_span_err(
@@ -245,14 +244,14 @@ fn parse_args<'a>(
245244
_ => {}
246245
}
247246
}
248-
if args.options.contains(InlineAsmOptions::PURE) && !have_real_output {
247+
if args.options.contains(ast::InlineAsmOptions::PURE) && !have_real_output {
249248
ecx.struct_span_err(
250249
args.options_span.unwrap(),
251250
"asm with `pure` option must have at least one output",
252251
)
253252
.emit();
254253
}
255-
if args.options.contains(InlineAsmOptions::NORETURN) && !outputs_sp.is_empty() {
254+
if args.options.contains(ast::InlineAsmOptions::NORETURN) && !outputs_sp.is_empty() {
256255
let err = ecx
257256
.struct_span_err(outputs_sp, "asm outputs are not allowed with the `noreturn` option");
258257

@@ -270,20 +269,20 @@ fn parse_options<'a>(p: &mut Parser<'a>, args: &mut AsmArgs) -> Result<(), Diagn
270269

271270
while !p.eat(&token::CloseDelim(token::DelimToken::Paren)) {
272271
if p.eat(&token::Ident(sym::pure, false)) {
273-
args.options |= InlineAsmOptions::PURE;
272+
args.options |= ast::InlineAsmOptions::PURE;
274273
} else if p.eat(&token::Ident(sym::nomem, false)) {
275-
args.options |= InlineAsmOptions::NOMEM;
274+
args.options |= ast::InlineAsmOptions::NOMEM;
276275
} else if p.eat(&token::Ident(sym::readonly, false)) {
277-
args.options |= InlineAsmOptions::READONLY;
276+
args.options |= ast::InlineAsmOptions::READONLY;
278277
} else if p.eat(&token::Ident(sym::preserves_flags, false)) {
279-
args.options |= InlineAsmOptions::PRESERVES_FLAGS;
278+
args.options |= ast::InlineAsmOptions::PRESERVES_FLAGS;
280279
} else if p.eat(&token::Ident(sym::noreturn, false)) {
281-
args.options |= InlineAsmOptions::NORETURN;
280+
args.options |= ast::InlineAsmOptions::NORETURN;
282281
} else if p.eat(&token::Ident(sym::nostack, false)) {
283-
args.options |= InlineAsmOptions::NOSTACK;
282+
args.options |= ast::InlineAsmOptions::NOSTACK;
284283
} else {
285284
p.expect(&token::Ident(sym::att_syntax, false))?;
286-
args.options |= InlineAsmOptions::ATT_SYNTAX;
285+
args.options |= ast::InlineAsmOptions::ATT_SYNTAX;
287286
}
288287

289288
// Allow trailing commas
@@ -395,7 +394,9 @@ fn expand_preparsed_asm(ecx: &mut ExtCtxt<'_>, sp: Span, args: AsmArgs) -> P<ast
395394
let mut template = vec![];
396395
for piece in unverified_pieces {
397396
match piece {
398-
parse::Piece::String(s) => template.push(InlineAsmTemplatePiece::String(s.to_string())),
397+
parse::Piece::String(s) => {
398+
template.push(ast::InlineAsmTemplatePiece::String(s.to_string()))
399+
}
399400
parse::Piece::NextArgument(arg) => {
400401
let span = arg_spans.next().unwrap_or(template_sp);
401402

@@ -467,7 +468,7 @@ fn expand_preparsed_asm(ecx: &mut ExtCtxt<'_>, sp: Span, args: AsmArgs) -> P<ast
467468

468469
if let Some(operand_idx) = operand_idx {
469470
used[operand_idx] = true;
470-
template.push(InlineAsmTemplatePiece::Placeholder {
471+
template.push(ast::InlineAsmTemplatePiece::Placeholder {
471472
operand_idx,
472473
modifier,
473474
span,

src/librustc_codegen_llvm/asm.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use crate::type_of::LayoutLlvmExt;
66
use crate::value::Value;
77

88
use rustc_ast::ast::LlvmAsmDialect;
9+
use rustc_ast::ast::{InlineAsmOptions, InlineAsmTemplatePiece};
910
use rustc_codegen_ssa::mir::operand::OperandValue;
1011
use rustc_codegen_ssa::mir::place::PlaceRef;
1112
use rustc_codegen_ssa::traits::*;

src/librustc_codegen_ssa/traits/asm.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
use super::BackendTypes;
22
use crate::mir::operand::OperandRef;
33
use crate::mir::place::PlaceRef;
4+
use rustc_ast::ast::{InlineAsmOptions, InlineAsmTemplatePiece};
45
use rustc_hir::def_id::DefId;
56
use rustc_hir::{GlobalAsm, LlvmInlineAsmInner};
67
use rustc_middle::ty::Instance;
78
use rustc_span::Span;
8-
use rustc_target::asm::{InlineAsmOptions, InlineAsmRegOrRegClass, InlineAsmTemplatePiece};
9+
use rustc_target::asm::InlineAsmRegOrRegClass;
910

1011
#[derive(Debug)]
1112
pub enum InlineAsmOperandRef<'tcx, B: BackendTypes + ?Sized> {

src/librustc_hir/arena.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ macro_rules! arena_types {
1515
[few] hir_krate: rustc_hir::Crate<$tcx>,
1616
[] arm: rustc_hir::Arm<$tcx>,
1717
[] asm_operand: rustc_hir::InlineAsmOperand<$tcx>,
18-
[] asm_template: rustc_target::asm::InlineAsmTemplatePiece,
18+
[] asm_template: rustc_ast::ast::InlineAsmTemplatePiece,
1919
[] attribute: rustc_ast::ast::Attribute,
2020
[] block: rustc_hir::Block<$tcx>,
2121
[] bare_fn_ty: rustc_hir::BareFnTy<$tcx>,

src/librustc_hir/hir.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use rustc_ast::ast::{self, CrateSugar, LlvmAsmDialect};
77
use rustc_ast::ast::{AttrVec, Attribute, FloatTy, IntTy, Label, LitKind, StrStyle, UintTy};
88
pub use rustc_ast::ast::{BorrowKind, ImplPolarity, IsAuto};
99
pub use rustc_ast::ast::{CaptureBy, Movability, Mutability};
10+
use rustc_ast::ast::{InlineAsmOptions, InlineAsmTemplatePiece};
1011
use rustc_ast::node_id::NodeMap;
1112
use rustc_ast::util::parser::ExprPrecedence;
1213
use rustc_data_structures::fx::FxHashSet;
@@ -15,7 +16,7 @@ use rustc_macros::HashStable_Generic;
1516
use rustc_span::source_map::{SourceMap, Spanned};
1617
use rustc_span::symbol::{kw, sym, Ident, Symbol};
1718
use rustc_span::{MultiSpan, Span, DUMMY_SP};
18-
use rustc_target::asm::{InlineAsmOptions, InlineAsmRegOrRegClass, InlineAsmTemplatePiece};
19+
use rustc_target::asm::InlineAsmRegOrRegClass;
1920
use rustc_target::spec::abi::Abi;
2021

2122
use smallvec::SmallVec;

0 commit comments

Comments
 (0)