From 4f6b1719e55a6684ba1efe8c7addd0668037e9d0 Mon Sep 17 00:00:00 2001 From: Brian Cain Date: Thu, 8 Aug 2019 19:13:23 +0000 Subject: [PATCH] [llvm-mc] Add reportWarning() to MCContext Adding reportWarning() to MCContext, so that it can be used from the Hexagon assembler backend. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@368327 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/MC/MCContext.h | 8 +++++++- lib/CodeGen/MachineModuleInfo.cpp | 6 +++--- lib/MC/MCContext.cpp | 19 +++++++++++++++++-- .../Hexagon/MCTargetDesc/HexagonMCChecker.cpp | 7 ++----- test/MC/Hexagon/nowarn.s | 19 +++++++++++++++++++ tools/llvm-mc/llvm-mc.cpp | 6 +++--- 6 files changed, 51 insertions(+), 14 deletions(-) create mode 100644 test/MC/Hexagon/nowarn.s diff --git a/include/llvm/MC/MCContext.h b/include/llvm/MC/MCContext.h index 7e24292cdd1..d5bbff5834d 100644 --- a/include/llvm/MC/MCContext.h +++ b/include/llvm/MC/MCContext.h @@ -22,6 +22,7 @@ #include "llvm/MC/MCAsmMacro.h" #include "llvm/MC/MCDwarf.h" #include "llvm/MC/MCSubtargetInfo.h" +#include "llvm/MC/MCTargetOptions.h" #include "llvm/MC/SectionKind.h" #include "llvm/Support/Allocator.h" #include "llvm/Support/Compiler.h" @@ -275,6 +276,8 @@ namespace llvm { /// Do automatic reset in destructor bool AutoReset; + MCTargetOptions const *TargetOptions; + bool HadError = false; MCSymbol *createSymbolImpl(const StringMapEntry *Name, @@ -298,7 +301,9 @@ namespace llvm { public: explicit MCContext(const MCAsmInfo *MAI, const MCRegisterInfo *MRI, const MCObjectFileInfo *MOFI, - const SourceMgr *Mgr = nullptr, bool DoAutoReset = true); + const SourceMgr *Mgr = nullptr, + MCTargetOptions const *TargetOpts = nullptr, + bool DoAutoReset = true); MCContext(const MCContext &) = delete; MCContext &operator=(const MCContext &) = delete; ~MCContext(); @@ -659,6 +664,7 @@ namespace llvm { bool hadError() { return HadError; } void reportError(SMLoc L, const Twine &Msg); + void reportWarning(SMLoc L, const Twine &Msg); // Unrecoverable error has occurred. Display the best diagnostic we can // and bail via exit(1). For now, most MC backend errors are unrecoverable. // FIXME: We should really do something about that. diff --git a/lib/CodeGen/MachineModuleInfo.cpp b/lib/CodeGen/MachineModuleInfo.cpp index aadcd731979..6ac9d3dfc2e 100644 --- a/lib/CodeGen/MachineModuleInfo.cpp +++ b/lib/CodeGen/MachineModuleInfo.cpp @@ -194,9 +194,9 @@ void MMIAddrLabelMapCallbackPtr::allUsesReplacedWith(Value *V2) { } MachineModuleInfo::MachineModuleInfo(const LLVMTargetMachine *TM) - : ImmutablePass(ID), TM(*TM), - Context(TM->getMCAsmInfo(), TM->getMCRegisterInfo(), - TM->getObjFileLowering(), nullptr, false) { + : ImmutablePass(ID), TM(*TM), + Context(TM->getMCAsmInfo(), TM->getMCRegisterInfo(), + TM->getObjFileLowering(), nullptr, nullptr, false) { initializeMachineModuleInfoPass(*PassRegistry::getPassRegistry()); } diff --git a/lib/MC/MCContext.cpp b/lib/MC/MCContext.cpp index ecd12fdc689..a030f5e4eb0 100644 --- a/lib/MC/MCContext.cpp +++ b/lib/MC/MCContext.cpp @@ -58,11 +58,11 @@ AsSecureLogFileName("as-secure-log-file-name", MCContext::MCContext(const MCAsmInfo *mai, const MCRegisterInfo *mri, const MCObjectFileInfo *mofi, const SourceMgr *mgr, - bool DoAutoReset) + MCTargetOptions const *TargetOpts, bool DoAutoReset) : SrcMgr(mgr), InlineSrcMgr(nullptr), MAI(mai), MRI(mri), MOFI(mofi), Symbols(Allocator), UsedNames(Allocator), CurrentDwarfLoc(0, 0, 0, DWARF2_FLAG_IS_STMT, 0, 0), - AutoReset(DoAutoReset) { + AutoReset(DoAutoReset), TargetOptions(TargetOpts) { SecureLogFile = AsSecureLogFileName; if (SrcMgr && SrcMgr->getNumBuffers()) @@ -691,6 +691,21 @@ void MCContext::reportError(SMLoc Loc, const Twine &Msg) { report_fatal_error(Msg, false); } +void MCContext::reportWarning(SMLoc Loc, const Twine &Msg) { + if (TargetOptions && TargetOptions->MCNoWarn) + return; + if (TargetOptions && TargetOptions->MCFatalWarnings) + reportError(Loc, Msg); + else { + // If we have a source manager use it. Otherwise, try using the inline + // source manager. + if (SrcMgr) + SrcMgr->PrintMessage(Loc, SourceMgr::DK_Warning, Msg); + else if (InlineSrcMgr) + InlineSrcMgr->PrintMessage(Loc, SourceMgr::DK_Warning, Msg); + } +} + void MCContext::reportFatalError(SMLoc Loc, const Twine &Msg) { reportError(Loc, Msg); diff --git a/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.cpp b/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.cpp index fcd3758600c..8b262bd0248 100644 --- a/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.cpp +++ b/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.cpp @@ -726,9 +726,6 @@ void HexagonMCChecker::reportNote(SMLoc Loc, llvm::Twine const &Msg) { } void HexagonMCChecker::reportWarning(Twine const &Msg) { - if (ReportErrors) { - auto SM = Context.getSourceManager(); - if (SM) - SM->PrintMessage(MCB.getLoc(), SourceMgr::DK_Warning, Msg); - } + if (ReportErrors) + Context.reportWarning(MCB.getLoc(), Msg); } diff --git a/test/MC/Hexagon/nowarn.s b/test/MC/Hexagon/nowarn.s new file mode 100644 index 00000000000..f5b24ebe590 --- /dev/null +++ b/test/MC/Hexagon/nowarn.s @@ -0,0 +1,19 @@ +# RUN: llvm-mc -arch=hexagon -mhvx --filetype=asm %s -o - 2>&1 | FileCheck %s +# RUN: llvm-mc --no-warn -arch=hexagon -mhvx --filetype=obj %s -o - | llvm-objdump -d - | FileCheck --check-prefix=CHECK-NOWARN %s +# RUN: not llvm-mc --fatal-warnings -arch=hexagon -mhvx --filetype=asm %s 2>&1 | FileCheck --check-prefix=CHECK-FATAL-WARN %s + + .text + .warning + +{ + v7.tmp = vmem(r28 + #3) + v7:6.w = vadd(v17:16.w, v17:16.w) + v17:16.uw = vunpack(v8.uh) +} + +# CHECK-NOWARN-NOT: warning +# CHECK-FATAL-WARN-NOT: warning +# CHECK-FATAL-WARN: error +# CHECK-FATAL-WARN: error +# CHECK: warning: +# CHECK: warning: diff --git a/tools/llvm-mc/llvm-mc.cpp b/tools/llvm-mc/llvm-mc.cpp index d13a86af919..ac6b464ab07 100644 --- a/tools/llvm-mc/llvm-mc.cpp +++ b/tools/llvm-mc/llvm-mc.cpp @@ -279,7 +279,7 @@ static int fillCommandLineSymbols(MCAsmParser &Parser) { static int AssembleInput(const char *ProgName, const Target *TheTarget, SourceMgr &SrcMgr, MCContext &Ctx, MCStreamer &Str, MCAsmInfo &MAI, MCSubtargetInfo &STI, - MCInstrInfo &MCII, MCTargetOptions &MCOptions) { + MCInstrInfo &MCII, MCTargetOptions const &MCOptions) { std::unique_ptr Parser( createMCAsmParser(SrcMgr, Ctx, Str, MAI)); std::unique_ptr TAP( @@ -316,7 +316,7 @@ int main(int argc, char **argv) { cl::AddExtraVersionPrinter(TargetRegistry::printRegisteredTargetsForVersion); cl::ParseCommandLineOptions(argc, argv, "llvm machine code playground\n"); - MCTargetOptions MCOptions = InitMCTargetOptionsFromFlags(); + const MCTargetOptions MCOptions = InitMCTargetOptionsFromFlags(); setDwarfDebugFlags(argc, argv); setDwarfDebugProducer(); @@ -368,7 +368,7 @@ int main(int argc, char **argv) { // FIXME: This is not pretty. MCContext has a ptr to MCObjectFileInfo and // MCObjectFileInfo needs a MCContext reference in order to initialize itself. MCObjectFileInfo MOFI; - MCContext Ctx(MAI.get(), MRI.get(), &MOFI, &SrcMgr); + MCContext Ctx(MAI.get(), MRI.get(), &MOFI, &SrcMgr, &MCOptions); MOFI.InitMCObjectFileInfo(TheTriple, PIC, Ctx, LargeCodeModel); if (SaveTempLabels) -- 2.40.0