diff --git a/lld/Common/ErrorHandler.cpp b/lld/Common/ErrorHandler.cpp --- a/lld/Common/ErrorHandler.cpp +++ b/lld/Common/ErrorHandler.cpp @@ -107,6 +107,13 @@ SmallString<128> s; raw_svector_ostream os(s); DiagnosticPrinterRawOStream dp(os); + + // For an inline asm diagnostic, prepend the module name to get something like + // "$module :1:5: ". + if (auto *dism = dyn_cast(&di)) + if (dism->isInlineAsmDiag()) + os << dism->getModuleName() << ' '; + di.print(dp); switch (di.getSeverity()) { case DS_Error: diff --git a/lld/test/ELF/lto/inline-asm-err.ll b/lld/test/ELF/lto/inline-asm-err.ll new file mode 100644 --- /dev/null +++ b/lld/test/ELF/lto/inline-asm-err.ll @@ -0,0 +1,19 @@ +; REQUIRES: x86 +; RUN: llvm-as %s -o %t.bc +; RUN: not ld.lld -shared %t.bc -o /dev/null 2>&1 | FileCheck %s --check-prefix=REGULAR + +;; For regular LTO, the original module name is lost. +; REGULAR: error: ld-temp.o :1:2: invalid instruction mnemonic 'invalid' + +; RUN: opt -module-summary %s -o %t.bc +; RUN: not ld.lld -shared %t.bc -o /dev/null 2>&1 | FileCheck %s --check-prefix=THIN + +; THIN: error: {{.*}}.bc :1:2: invalid instruction mnemonic 'invalid' + +target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +define void @foo() { + call void asm "invalid", ""() + ret void +} diff --git a/lld/test/MachO/lto-module-asm-err.ll b/lld/test/MachO/lto-module-asm-err.ll new file mode 100644 --- /dev/null +++ b/lld/test/MachO/lto-module-asm-err.ll @@ -0,0 +1,22 @@ +; REQUIRES: x86 +; RUN: llvm-as %s -o %t.bc +; RUN: not %lld %t.bc -o /dev/null 2>&1 | FileCheck %s --check-prefix=REGULAR + +;; For regular LTO, the original module name is lost. +;; TODO Fix the line number +; REGULAR: error: ld-temp.o :3:1: invalid instruction mnemonic 'invalid' + +; RUN: opt -module-summary %s -o %t.bc +; RUN: not %lld %t.bc -o /dev/null 2>&1 | FileCheck %s --check-prefix=THIN + +; THIN: error: {{.*}}.bc :2:1: invalid instruction mnemonic 'invalid' + +target triple = "x86_64-apple-macosx10.15.0" +target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" + +module asm ".text" +module asm "invalid" + +define void @main() { + ret void +} diff --git a/llvm/include/llvm/IR/DiagnosticInfo.h b/llvm/include/llvm/IR/DiagnosticInfo.h --- a/llvm/include/llvm/IR/DiagnosticInfo.h +++ b/llvm/include/llvm/IR/DiagnosticInfo.h @@ -1049,18 +1049,20 @@ /// Diagnostic information for SMDiagnostic reporting. class DiagnosticInfoSrcMgr : public DiagnosticInfo { const SMDiagnostic &Diagnostic; + StringRef ModName; // For inlineasm !srcloc translation. bool InlineAsmDiag; unsigned LocCookie; public: - DiagnosticInfoSrcMgr(const SMDiagnostic &Diagnostic, + DiagnosticInfoSrcMgr(const SMDiagnostic &Diagnostic, StringRef ModName, bool InlineAsmDiag = true, unsigned LocCookie = 0) : DiagnosticInfo(DK_SrcMgr, getDiagnosticSeverity(Diagnostic.getKind())), - Diagnostic(Diagnostic), InlineAsmDiag(InlineAsmDiag), + Diagnostic(Diagnostic), ModName(ModName), InlineAsmDiag(InlineAsmDiag), LocCookie(LocCookie) {} + StringRef getModuleName() const { return ModName; } bool isInlineAsmDiag() const { return InlineAsmDiag; } const SMDiagnostic &getSMDiag() const { return Diagnostic; } unsigned getLocCookie() const { return LocCookie; } diff --git a/llvm/lib/CodeGen/MachineModuleInfo.cpp b/llvm/lib/CodeGen/MachineModuleInfo.cpp --- a/llvm/lib/CodeGen/MachineModuleInfo.cpp +++ b/llvm/lib/CodeGen/MachineModuleInfo.cpp @@ -400,12 +400,14 @@ // FIXME: Do this for new pass manager. LLVMContext &Ctx = M.getContext(); MMI.getContext().setDiagnosticHandler( - [&Ctx](const SMDiagnostic &SMD, bool IsInlineAsm, const SourceMgr &SrcMgr, - std::vector &LocInfos) { + [&Ctx, &M](const SMDiagnostic &SMD, bool IsInlineAsm, + const SourceMgr &SrcMgr, + std::vector &LocInfos) { unsigned LocCookie = 0; if (IsInlineAsm) LocCookie = getLocCookie(SMD, SrcMgr, LocInfos); - Ctx.diagnose(DiagnosticInfoSrcMgr(SMD, IsInlineAsm, LocCookie)); + Ctx.diagnose( + DiagnosticInfoSrcMgr(SMD, M.getName(), IsInlineAsm, LocCookie)); }); MMI.DbgInfoAvailable = !M.debug_compile_units().empty(); return false;