MCSymbol.cpp revision 221345
1198090Srdivacky//===- lib/MC/MCSymbol.cpp - MCSymbol implementation ----------------------===// 2198090Srdivacky// 3198090Srdivacky// The LLVM Compiler Infrastructure 4198090Srdivacky// 5198090Srdivacky// This file is distributed under the University of Illinois Open Source 6198090Srdivacky// License. See LICENSE.TXT for details. 7198090Srdivacky// 8198090Srdivacky//===----------------------------------------------------------------------===// 9198090Srdivacky 10198090Srdivacky#include "llvm/MC/MCSymbol.h" 11208599Srdivacky#include "llvm/MC/MCExpr.h" 12202375Srdivacky#include "llvm/Support/Debug.h" 13198090Srdivacky#include "llvm/Support/raw_ostream.h" 14198090Srdivackyusing namespace llvm; 15198090Srdivacky 16198090Srdivacky// Sentinel value for the absolute pseudo section. 17198090Srdivackyconst MCSection *MCSymbol::AbsolutePseudoSection = 18198090Srdivacky reinterpret_cast<const MCSection *>(1); 19198090Srdivacky 20198090Srdivackystatic bool isAcceptableChar(char C) { 21198090Srdivacky if ((C < 'a' || C > 'z') && 22198090Srdivacky (C < 'A' || C > 'Z') && 23198090Srdivacky (C < '0' || C > '9') && 24198090Srdivacky C != '_' && C != '$' && C != '.' && C != '@') 25198090Srdivacky return false; 26198090Srdivacky return true; 27198090Srdivacky} 28198090Srdivacky 29202878Srdivacky/// NameNeedsQuoting - Return true if the identifier \arg Str needs quotes to be 30202878Srdivacky/// syntactically correct. 31202878Srdivackystatic bool NameNeedsQuoting(StringRef Str) { 32198090Srdivacky assert(!Str.empty() && "Cannot create an empty MCSymbol"); 33198090Srdivacky 34198090Srdivacky // If any of the characters in the string is an unacceptable character, force 35198090Srdivacky // quotes. 36198090Srdivacky for (unsigned i = 0, e = Str.size(); i != e; ++i) 37198090Srdivacky if (!isAcceptableChar(Str[i])) 38198090Srdivacky return true; 39198090Srdivacky return false; 40198090Srdivacky} 41198090Srdivacky 42218893Sdimconst MCSymbol &MCSymbol::AliasedSymbol() const { 43218893Sdim const MCSymbol *S = this; 44218893Sdim while (S->isVariable()) { 45218893Sdim const MCExpr *Value = S->getVariableValue(); 46218893Sdim if (Value->getKind() != MCExpr::SymbolRef) 47218893Sdim return *S; 48218893Sdim const MCSymbolRefExpr *Ref = static_cast<const MCSymbolRefExpr*>(Value); 49218893Sdim S = &Ref->getSymbol(); 50218893Sdim } 51218893Sdim return *S; 52218893Sdim} 53218893Sdim 54208599Srdivackyvoid MCSymbol::setVariableValue(const MCExpr *Value) { 55218893Sdim assert(!IsUsed && "Cannot set a variable that has already been used."); 56208599Srdivacky assert(Value && "Invalid variable value!"); 57208599Srdivacky assert((isUndefined() || (isAbsolute() && isa<MCConstantExpr>(Value))) && 58208599Srdivacky "Invalid redefinition!"); 59208599Srdivacky this->Value = Value; 60208599Srdivacky 61221345Sdim // Variables should always be marked as in the same "section" as the value. 62221345Sdim const MCSection *Section = Value->FindAssociatedSection(); 63221345Sdim if (Section) { 64221345Sdim setSection(*Section); 65221345Sdim } else { 66221345Sdim setUndefined(); 67221345Sdim } 68208599Srdivacky} 69208599Srdivacky 70202878Srdivackyvoid MCSymbol::print(raw_ostream &OS) const { 71202878Srdivacky // The name for this MCSymbol is required to be a valid target name. However, 72202878Srdivacky // some targets support quoting names with funny characters. If the name 73202878Srdivacky // contains a funny character, then print it quoted. 74202878Srdivacky if (!NameNeedsQuoting(getName())) { 75198090Srdivacky OS << getName(); 76198090Srdivacky return; 77198090Srdivacky } 78198090Srdivacky 79198090Srdivacky OS << '"' << getName() << '"'; 80198090Srdivacky} 81198090Srdivacky 82198090Srdivackyvoid MCSymbol::dump() const { 83202878Srdivacky print(dbgs()); 84198090Srdivacky} 85