From a930111c70604b2e5630e8c9377685ee54a5d554 Mon Sep 17 00:00:00 2001 From: Oliver Stannard Date: Tue, 6 Mar 2018 14:07:01 +0000 Subject: [PATCH] [Asm] Add debug printing for assembler macros This adds some debug printing (gated behind the "asm-macros" debug flag) which can help tracing complicated assembly macros. Differential revision: https://reviews.llvm.org/D43937 llvm-svn: 326795 --- llvm/include/llvm/MC/MCAsmMacro.h | 7 +++++++ llvm/include/llvm/MC/MCContext.h | 9 ++++++++- llvm/lib/MC/CMakeLists.txt | 1 + llvm/lib/MC/MCAsmMacro.cpp | 42 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 llvm/lib/MC/MCAsmMacro.cpp diff --git a/llvm/include/llvm/MC/MCAsmMacro.h b/llvm/include/llvm/MC/MCAsmMacro.h index dac8d1a..4f4eee5 100644 --- a/llvm/include/llvm/MC/MCAsmMacro.h +++ b/llvm/include/llvm/MC/MCAsmMacro.h @@ -11,6 +11,7 @@ #define LLVM_MC_MCASMMACRO_H #include "llvm/MC/MCParser/MCAsmLexer.h" +#include "llvm/Support/Debug.h" namespace llvm { @@ -21,6 +22,9 @@ struct MCAsmMacroParameter { bool Vararg = false; MCAsmMacroParameter() = default; + + void dump() const { dump(dbgs()); } + void dump(raw_ostream &OS) const; }; typedef std::vector MCAsmMacroParameters; @@ -32,6 +36,9 @@ struct MCAsmMacro { public: MCAsmMacro(StringRef N, StringRef B, MCAsmMacroParameters P) : Name(N), Body(B), Parameters(std::move(P)) {} + + void dump() const { dump(dbgs()); } + void dump(raw_ostream &OS) const; }; } // namespace llvm diff --git a/llvm/include/llvm/MC/MCContext.h b/llvm/include/llvm/MC/MCContext.h index c4abef1..3f45301 100644 --- a/llvm/include/llvm/MC/MCContext.h +++ b/llvm/include/llvm/MC/MCContext.h @@ -634,10 +634,17 @@ namespace llvm { } void defineMacro(StringRef Name, MCAsmMacro Macro) { + DEBUG_WITH_TYPE("asm-macros", dbgs() << "Defining new macro:\n"; + Macro.dump()); MacroMap.insert(std::make_pair(Name, std::move(Macro))); } - void undefineMacro(StringRef Name) { MacroMap.erase(Name); } + void undefineMacro(StringRef Name) { + if (MacroMap.erase(Name)) { + DEBUG_WITH_TYPE("asm-macros", + dbgs() << "Un-defining macro: " << Name << "\n"); + } + } }; } // end namespace llvm diff --git a/llvm/lib/MC/CMakeLists.txt b/llvm/lib/MC/CMakeLists.txt index b9e23d1..ba36d99 100644 --- a/llvm/lib/MC/CMakeLists.txt +++ b/llvm/lib/MC/CMakeLists.txt @@ -7,6 +7,7 @@ add_llvm_library(LLVMMC MCAsmInfoDarwin.cpp MCAsmInfoELF.cpp MCAsmInfoWasm.cpp + MCAsmMacro.cpp MCAsmStreamer.cpp MCAssembler.cpp MCCodeEmitter.cpp diff --git a/llvm/lib/MC/MCAsmMacro.cpp b/llvm/lib/MC/MCAsmMacro.cpp new file mode 100644 index 0000000..b030767 --- /dev/null +++ b/llvm/lib/MC/MCAsmMacro.cpp @@ -0,0 +1,42 @@ +//===- MCAsmMacro.h - Assembly Macros ---------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "llvm/MC/MCAsmMacro.h" +#include "llvm/Support/raw_ostream.h" + +using namespace llvm; + +void MCAsmMacroParameter::dump(raw_ostream &OS) const { + OS << "\"" << Name << "\""; + if (Required) + OS << ":req"; + if (Vararg) + OS << ":vararg"; + if (!Value.empty()) { + OS << " = "; + bool first = true; + for (const AsmToken &T : Value) { + if (!first) + OS << ", "; + first = false; + T.dump(); + } + } + OS << "\n"; +} + +void MCAsmMacro::dump(raw_ostream &OS) const { + OS << "Macro " << Name << ":\n"; + OS << " Parameters:\n"; + for (const MCAsmMacroParameter &P : Parameters) { + OS << " "; + P.dump(); + } + OS << " (BEGIN BODY)" << Body << "(END BODY)\n"; +} -- 2.7.4