mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-27 06:35:30 +00:00
94ed5fca3f
variable if recursing fails to simplify it. Factor AliasedSymbol to be a method of MCSymbol. Update MCAssembler::EvaluateFixup to match the change in EvaluateAsRelocatableImpl. Remove the WeakRefExpr hack, as the object writer now sees the weakref with no extra effort needed. Nothing else is using MCTargetExpr, but keep it for now. Now that the ELF writer sees relocations with aliases, handle .weak foo2 foo2: .weak bar2 .set bar2,foo2 .quad bar2 the same way gas does and produce a relocation with bar2. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@119152 91177308-0d34-0410-b5e6-96231b3b80d8
81 lines
2.4 KiB
C++
81 lines
2.4 KiB
C++
//===- 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/MC/MCExpr.h"
|
|
#include "llvm/Support/Debug.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
using namespace llvm;
|
|
|
|
// Sentinel value for the absolute pseudo section.
|
|
const MCSection *MCSymbol::AbsolutePseudoSection =
|
|
reinterpret_cast<const MCSection *>(1);
|
|
|
|
static bool isAcceptableChar(char C) {
|
|
if ((C < 'a' || C > 'z') &&
|
|
(C < 'A' || C > 'Z') &&
|
|
(C < '0' || C > '9') &&
|
|
C != '_' && C != '$' && C != '.' && C != '@')
|
|
return false;
|
|
return true;
|
|
}
|
|
|
|
/// NameNeedsQuoting - Return true if the identifier \arg Str needs quotes to be
|
|
/// syntactically correct.
|
|
static bool NameNeedsQuoting(StringRef Str) {
|
|
assert(!Str.empty() && "Cannot create an empty MCSymbol");
|
|
|
|
// If any of the characters in the string is an unacceptable character, force
|
|
// quotes.
|
|
for (unsigned i = 0, e = Str.size(); i != e; ++i)
|
|
if (!isAcceptableChar(Str[i]))
|
|
return true;
|
|
return false;
|
|
}
|
|
|
|
const MCSymbol &MCSymbol::AliasedSymbol() const {
|
|
const MCSymbol *S = this;
|
|
while (S->isVariable()) {
|
|
const MCExpr *Value = S->getVariableValue();
|
|
if (Value->getKind() != MCExpr::SymbolRef)
|
|
return *S;
|
|
const MCSymbolRefExpr *Ref = static_cast<const MCSymbolRefExpr*>(Value);
|
|
S = &Ref->getSymbol();
|
|
}
|
|
return *S;
|
|
}
|
|
|
|
void MCSymbol::setVariableValue(const MCExpr *Value) {
|
|
assert(!IsUsed && "Cannot set a variable that has already been used.");
|
|
assert(Value && "Invalid variable value!");
|
|
assert((isUndefined() || (isAbsolute() && isa<MCConstantExpr>(Value))) &&
|
|
"Invalid redefinition!");
|
|
this->Value = Value;
|
|
|
|
// Mark the variable as absolute as appropriate.
|
|
if (isa<MCConstantExpr>(Value))
|
|
setAbsolute();
|
|
}
|
|
|
|
void MCSymbol::print(raw_ostream &OS) const {
|
|
// The name for this MCSymbol is required to be a valid target name. However,
|
|
// some targets support quoting names with funny characters. If the name
|
|
// contains a funny character, then print it quoted.
|
|
if (!NameNeedsQuoting(getName())) {
|
|
OS << getName();
|
|
return;
|
|
}
|
|
|
|
OS << '"' << getName() << '"';
|
|
}
|
|
|
|
void MCSymbol::dump() const {
|
|
print(dbgs());
|
|
}
|