]> git.lizzy.rs Git - rust.git/commitdiff
Implement sym operands for global asm
authorbjorn3 <17426603+bjorn3@users.noreply.github.com>
Sun, 5 Feb 2023 18:42:30 +0000 (18:42 +0000)
committerbjorn3 <17426603+bjorn3@users.noreply.github.com>
Sun, 5 Feb 2023 18:48:40 +0000 (18:48 +0000)
src/global_asm.rs

index 9aee4908c5ca1c02e5100c5f7b2e3adeda862129..46c78ce6a1e344d251c62256d4db238f62154351 100644 (file)
@@ -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 { .. }