about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAmanieu d'Antras <amanieu@gmail.com>2021-04-11 20:51:28 +0100
committerAmanieu d'Antras <amanieu@gmail.com>2021-05-13 22:31:57 +0100
commitd342a3490b6f85f5bec80a7b90a576e5044719aa (patch)
tree3e1887a66c82d751bbe8100abf357b0769d8d6f2
parent40a62a998fafc81d8b21260a151831b5d79537d8 (diff)
downloadrust-d342a3490b6f85f5bec80a7b90a576e5044719aa.tar.gz
rust-d342a3490b6f85f5bec80a7b90a576e5044719aa.zip
Add support for const operands and options to global_asm!
On x86, the default syntax is also switched to Intel to match asm!
-rw-r--r--src/driver/aot.rs17
1 files changed, 14 insertions, 3 deletions
diff --git a/src/driver/aot.rs b/src/driver/aot.rs
index e5f06551bb6..004e6bddaf3 100644
--- a/src/driver/aot.rs
+++ b/src/driver/aot.rs
@@ -3,6 +3,7 @@
 
 use std::path::PathBuf;
 
+use rustc_ast::{InlineAsmOptions, InlineAsmTemplatePiece};
 use rustc_codegen_ssa::back::linker::LinkerInfo;
 use rustc_codegen_ssa::{CodegenResults, CompiledModule, CrateInfo, ModuleKind};
 use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
@@ -125,9 +126,19 @@ fn module_codegen(
             MonoItem::Static(def_id) => crate::constant::codegen_static(tcx, &mut module, def_id),
             MonoItem::GlobalAsm(item_id) => {
                 let item = cx.tcx.hir().item(item_id);
-                if let rustc_hir::ItemKind::GlobalAsm(rustc_hir::GlobalAsm { asm }) = item.kind {
-                    cx.global_asm.push_str(&*asm.as_str());
-                    cx.global_asm.push_str("\n\n");
+                if let rustc_hir::ItemKind::GlobalAsm(asm) = item.kind {
+                    if !asm.options.contains(InlineAsmOptions::ATT_SYNTAX) {
+                        cx.global_asm.push_str("\n.intel_syntax noprefix\n");
+                    } else {
+                        cx.global_asm.push_str("\n.att_syntax\n");
+                    }
+                    for piece in asm.template {
+                        match *piece {
+                            InlineAsmTemplatePiece::String(ref s) => cx.global_asm.push_str(s),
+                            InlineAsmTemplatePiece::Placeholder { .. } => todo!(),
+                        }
+                    }
+                    cx.global_asm.push_str("\n.att_syntax\n\n");
                 } else {
                     bug!("Expected GlobalAsm found {:?}", item);
                 }