From 1689e0cf55205042b830fdbe3fc5f7b483997334 Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Fri, 14 Aug 2009 03:41:23 +0000 Subject: [PATCH] Add MCSymbol::{print, dump} git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78983 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/MC/MCSymbol.h | 7 ++++++ lib/MC/MCSymbol.cpp | 49 ++++++++++++++++++++++++++++++++++++++ lib/MC/MCValue.cpp | 10 +++++--- 3 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 lib/MC/MCSymbol.cpp diff --git a/include/llvm/MC/MCSymbol.h b/include/llvm/MC/MCSymbol.h index de6dc5fcb87..e857ebab70b 100644 --- a/include/llvm/MC/MCSymbol.h +++ b/include/llvm/MC/MCSymbol.h @@ -20,6 +20,7 @@ namespace llvm { class MCSection; class MCContext; + class raw_ostream; /// MCSymbol - Instances of this class represent a symbol name in the MC file, /// and MCSymbols are created and unique'd by the MCContext class. @@ -61,6 +62,12 @@ namespace llvm { void setExternal(bool Value) { IsExternal = Value; } const std::string &getName() const { return Name; } + + /// print - Print the value to the stream \arg OS. + void print(raw_ostream &OS) const; + + /// dump - Print the value to stderr. + void dump() const; }; } // end namespace llvm diff --git a/lib/MC/MCSymbol.cpp b/lib/MC/MCSymbol.cpp new file mode 100644 index 00000000000..d032017ca47 --- /dev/null +++ b/lib/MC/MCSymbol.cpp @@ -0,0 +1,49 @@ +//===- lib/MC/MCSymbol.cpp - MCSymbol implementation ----------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "llvm/MC/MCSymbol.h" +#include "llvm/Support/raw_ostream.h" + +using namespace llvm; + +/// NeedsQuoting - Return true if the string \arg Str needs quoting, i.e., it +/// does not match [a-zA-Z_.][a-zA-Z0-9_.]*. +// +// FIXME: This could be more permissive, do we care? +static inline bool NeedsQuoting(const StringRef &Str) { + if (Str.empty()) + return true; + + // Check that first character is in [a-zA-Z_.]. + if (!((Str[0] >= 'a' && Str[0] <= 'z') || + (Str[0] >= 'A' && Str[0] <= 'Z') || + (Str[0] == '_' || Str[0] == '.'))) + return true; + + // Check subsequent characters are in [a-zA-Z0-9_.]. + for (unsigned i = 1, e = Str.size(); i != e; ++i) + if (!((Str[i] >= 'a' && Str[i] <= 'z') || + (Str[i] >= 'A' && Str[i] <= 'Z') || + (Str[i] >= '0' && Str[i] <= '9') || + (Str[i] == '_' || Str[i] == '.'))) + return true; + + return false; +} + +void MCSymbol::print(raw_ostream &OS) const { + if (NeedsQuoting(getName())) + OS << '"' << getName() << '"'; + else + OS << getName(); +} + +void MCSymbol::dump() const { + print(errs()); +} diff --git a/lib/MC/MCValue.cpp b/lib/MC/MCValue.cpp index 9c7317096ce..c7923da764e 100644 --- a/lib/MC/MCValue.cpp +++ b/lib/MC/MCValue.cpp @@ -18,9 +18,13 @@ void MCValue::print(raw_ostream &OS) const { return; } - OS << getSymA(); - if (getSymB()) - OS << " - " << getSymB(); + getSymA()->print(OS); + + if (getSymB()) { + OS << " - "; + getSymB()->print(OS); + } + if (getConstant()) OS << " + " << getConstant(); } -- 2.34.1