11689e0cf55205042b830fdbe3fc5f7b483997334Daniel Dunbar//===- lib/MC/MCSymbol.cpp - MCSymbol implementation ----------------------===//
21689e0cf55205042b830fdbe3fc5f7b483997334Daniel Dunbar//
31689e0cf55205042b830fdbe3fc5f7b483997334Daniel Dunbar//                     The LLVM Compiler Infrastructure
41689e0cf55205042b830fdbe3fc5f7b483997334Daniel Dunbar//
51689e0cf55205042b830fdbe3fc5f7b483997334Daniel Dunbar// This file is distributed under the University of Illinois Open Source
61689e0cf55205042b830fdbe3fc5f7b483997334Daniel Dunbar// License. See LICENSE.TXT for details.
71689e0cf55205042b830fdbe3fc5f7b483997334Daniel Dunbar//
81689e0cf55205042b830fdbe3fc5f7b483997334Daniel Dunbar//===----------------------------------------------------------------------===//
91689e0cf55205042b830fdbe3fc5f7b483997334Daniel Dunbar
101689e0cf55205042b830fdbe3fc5f7b483997334Daniel Dunbar#include "llvm/MC/MCSymbol.h"
118d627d31531ad45fecca82d52cd34092c7c4cc1dDaniel Dunbar#include "llvm/MC/MCExpr.h"
12f24dd5c560fe9d162045528624d105d31327ffddDavid Greene#include "llvm/Support/Debug.h"
131689e0cf55205042b830fdbe3fc5f7b483997334Daniel Dunbar#include "llvm/Support/raw_ostream.h"
141689e0cf55205042b830fdbe3fc5f7b483997334Daniel Dunbarusing namespace llvm;
151689e0cf55205042b830fdbe3fc5f7b483997334Daniel Dunbar
168906ff1b9dfde28f1ff00706643ca10843b26e01Daniel Dunbar// Sentinel value for the absolute pseudo section.
178906ff1b9dfde28f1ff00706643ca10843b26e01Daniel Dunbarconst MCSection *MCSymbol::AbsolutePseudoSection =
188906ff1b9dfde28f1ff00706643ca10843b26e01Daniel Dunbar  reinterpret_cast<const MCSection *>(1);
198906ff1b9dfde28f1ff00706643ca10843b26e01Daniel Dunbar
20e19f9783231d7881efbcf2876c11f7914cf516f1Chris Lattnerstatic bool isAcceptableChar(char C) {
21e19f9783231d7881efbcf2876c11f7914cf516f1Chris Lattner  if ((C < 'a' || C > 'z') &&
22e19f9783231d7881efbcf2876c11f7914cf516f1Chris Lattner      (C < 'A' || C > 'Z') &&
23e19f9783231d7881efbcf2876c11f7914cf516f1Chris Lattner      (C < '0' || C > '9') &&
24e19f9783231d7881efbcf2876c11f7914cf516f1Chris Lattner      C != '_' && C != '$' && C != '.' && C != '@')
25aadb35f809144596d0bc5a0ae27f212f790057dfChris Lattner    return false;
26e19f9783231d7881efbcf2876c11f7914cf516f1Chris Lattner  return true;
27e19f9783231d7881efbcf2876c11f7914cf516f1Chris Lattner}
28e19f9783231d7881efbcf2876c11f7914cf516f1Chris Lattner
29c5252da873d547a19069eaf9030fec203f128f66Dmitri Gribenko/// NameNeedsQuoting - Return true if the identifier \p Str needs quotes to be
306edec7b34a7f16e0af7fa5947b69805238d6fe6cChris Lattner/// syntactically correct.
316edec7b34a7f16e0af7fa5947b69805238d6fe6cChris Lattnerstatic bool NameNeedsQuoting(StringRef Str) {
32e19f9783231d7881efbcf2876c11f7914cf516f1Chris Lattner  assert(!Str.empty() && "Cannot create an empty MCSymbol");
332684d9e3c702b2ef9fd430155d94671d12fa994fJim Grosbach
34aadb35f809144596d0bc5a0ae27f212f790057dfChris Lattner  // If any of the characters in the string is an unacceptable character, force
35aadb35f809144596d0bc5a0ae27f212f790057dfChris Lattner  // quotes.
36e19f9783231d7881efbcf2876c11f7914cf516f1Chris Lattner  for (unsigned i = 0, e = Str.size(); i != e; ++i)
37e19f9783231d7881efbcf2876c11f7914cf516f1Chris Lattner    if (!isAcceptableChar(Str[i]))
381689e0cf55205042b830fdbe3fc5f7b483997334Daniel Dunbar      return true;
391689e0cf55205042b830fdbe3fc5f7b483997334Daniel Dunbar  return false;
401689e0cf55205042b830fdbe3fc5f7b483997334Daniel Dunbar}
411689e0cf55205042b830fdbe3fc5f7b483997334Daniel Dunbar
4294ed5fca3f5ab5acb74e70b8393b837131e7110cRafael Espindolaconst MCSymbol &MCSymbol::AliasedSymbol() const {
4394ed5fca3f5ab5acb74e70b8393b837131e7110cRafael Espindola  const MCSymbol *S = this;
4494ed5fca3f5ab5acb74e70b8393b837131e7110cRafael Espindola  while (S->isVariable()) {
4594ed5fca3f5ab5acb74e70b8393b837131e7110cRafael Espindola    const MCExpr *Value = S->getVariableValue();
4694ed5fca3f5ab5acb74e70b8393b837131e7110cRafael Espindola    if (Value->getKind() != MCExpr::SymbolRef)
4794ed5fca3f5ab5acb74e70b8393b837131e7110cRafael Espindola      return *S;
4894ed5fca3f5ab5acb74e70b8393b837131e7110cRafael Espindola    const MCSymbolRefExpr *Ref = static_cast<const MCSymbolRefExpr*>(Value);
4994ed5fca3f5ab5acb74e70b8393b837131e7110cRafael Espindola    S = &Ref->getSymbol();
5094ed5fca3f5ab5acb74e70b8393b837131e7110cRafael Espindola  }
5194ed5fca3f5ab5acb74e70b8393b837131e7110cRafael Espindola  return *S;
5294ed5fca3f5ab5acb74e70b8393b837131e7110cRafael Espindola}
5394ed5fca3f5ab5acb74e70b8393b837131e7110cRafael Espindola
548d627d31531ad45fecca82d52cd34092c7c4cc1dDaniel Dunbarvoid MCSymbol::setVariableValue(const MCExpr *Value) {
55db9835d0895337eb94c19e3a30b7d3fc8fcddfd5Rafael Espindola  assert(!IsUsed && "Cannot set a variable that has already been used.");
568d627d31531ad45fecca82d52cd34092c7c4cc1dDaniel Dunbar  assert(Value && "Invalid variable value!");
578d627d31531ad45fecca82d52cd34092c7c4cc1dDaniel Dunbar  this->Value = Value;
582d7fd61e94e2db0586ad9d5d26c1e7c5510a006dDaniel Dunbar
5990604ab725da8a2a57cf3ca1541b14b95d619040Daniel Dunbar  // Variables should always be marked as in the same "section" as the value.
6090604ab725da8a2a57cf3ca1541b14b95d619040Daniel Dunbar  const MCSection *Section = Value->FindAssociatedSection();
6193a1a0dbda3e5e449a6b498f753130d0c240cacdJim Grosbach  if (Section)
6290604ab725da8a2a57cf3ca1541b14b95d619040Daniel Dunbar    setSection(*Section);
6393a1a0dbda3e5e449a6b498f753130d0c240cacdJim Grosbach  else
6490604ab725da8a2a57cf3ca1541b14b95d619040Daniel Dunbar    setUndefined();
658d627d31531ad45fecca82d52cd34092c7c4cc1dDaniel Dunbar}
668d627d31531ad45fecca82d52cd34092c7c4cc1dDaniel Dunbar
6710b318bcb39218d2ed525e4862c854bc8d1baf63Chris Lattnervoid MCSymbol::print(raw_ostream &OS) const {
68acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner  // The name for this MCSymbol is required to be a valid target name.  However,
69acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner  // some targets support quoting names with funny characters.  If the name
70acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner  // contains a funny character, then print it quoted.
716edec7b34a7f16e0af7fa5947b69805238d6fe6cChris Lattner  if (!NameNeedsQuoting(getName())) {
721689e0cf55205042b830fdbe3fc5f7b483997334Daniel Dunbar    OS << getName();
73e19f9783231d7881efbcf2876c11f7914cf516f1Chris Lattner    return;
74e19f9783231d7881efbcf2876c11f7914cf516f1Chris Lattner  }
752684d9e3c702b2ef9fd430155d94671d12fa994fJim Grosbach
764afcedfad11555e2c755a31eb04c0e5bdbb2a4a1Chris Lattner  OS << '"' << getName() << '"';
771689e0cf55205042b830fdbe3fc5f7b483997334Daniel Dunbar}
781689e0cf55205042b830fdbe3fc5f7b483997334Daniel Dunbar
79286c4dc355b8be6806081b23c3097485821c7642Manman Ren#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
801689e0cf55205042b830fdbe3fc5f7b483997334Daniel Dunbarvoid MCSymbol::dump() const {
8110b318bcb39218d2ed525e4862c854bc8d1baf63Chris Lattner  print(dbgs());
821689e0cf55205042b830fdbe3fc5f7b483997334Daniel Dunbar}
83cc77eece74c8db09acc2af425e7e6c88a5bb30d1Manman Ren#endif
84