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