about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/global_asm.rs18
1 files changed, 16 insertions, 2 deletions
diff --git a/src/global_asm.rs b/src/global_asm.rs
index 9aee4908c5c..46c78ce6a1e 100644
--- a/src/global_asm.rs
+++ b/src/global_asm.rs
@@ -39,8 +39,22 @@ pub(crate) fn codegen_global_asm_item(tcx: TyCtxt<'_>, global_asm: &mut String,
                             );
                             global_asm.push_str(&string);
                         }
-                        InlineAsmOperand::SymFn { anon_const: _ } => todo!(),
-                        InlineAsmOperand::SymStatic { path: _, def_id: _ } => todo!(),
+                        InlineAsmOperand::SymFn { anon_const } => {
+                            let ty = tcx.typeck_body(anon_const.body).node_type(anon_const.hir_id);
+                            let instance = match ty.kind() {
+                                &ty::FnDef(def_id, substs) => Instance::new(def_id, substs),
+                                _ => span_bug!(op_sp, "asm sym is not a function"),
+                            };
+                            let symbol = tcx.symbol_name(instance);
+                            // FIXME handle the case where the function was made private to the
+                            // current codegen unit
+                            global_asm.push_str(symbol.name);
+                        }
+                        InlineAsmOperand::SymStatic { path: _, def_id } => {
+                            let instance = Instance::mono(tcx, def_id).polymorphize(tcx);
+                            let symbol = tcx.symbol_name(instance);
+                            global_asm.push_str(symbol.name);
+                        }
                         InlineAsmOperand::In { .. }
                         | InlineAsmOperand::Out { .. }
                         | InlineAsmOperand::InOut { .. }