mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-15 07:34:33 +00:00
c28cc093e3
allocated and thus not freed. This is cool except that it contains and std::string so the string data didn't get freed. In any case there is no reason to redundantly store the string data in the MCSymbol anyway, just make the MCSymbol ref the string data in the MCContext StringMap. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@98536 91177308-0d34-0410-b5e6-96231b3b80d8
73 lines
2.4 KiB
C++
73 lines
2.4 KiB
C++
//===- lib/MC/MCContext.cpp - Machine Code Context ------------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/MC/MCContext.h"
|
|
#include "llvm/MC/MCAsmInfo.h"
|
|
#include "llvm/MC/MCSection.h"
|
|
#include "llvm/MC/MCSymbol.h"
|
|
#include "llvm/ADT/SmallString.h"
|
|
#include "llvm/ADT/Twine.h"
|
|
using namespace llvm;
|
|
|
|
MCContext::MCContext(const MCAsmInfo &mai) : MAI(mai), NextUniqueID(0) {
|
|
}
|
|
|
|
MCContext::~MCContext() {
|
|
// NOTE: The sections are all allocated out of a bump pointer allocator,
|
|
// we don't need to free them here.
|
|
}
|
|
|
|
MCSymbol *MCContext::GetOrCreateSymbol(StringRef Name, bool isTemporary) {
|
|
assert(!Name.empty() && "Normal symbols cannot be unnamed!");
|
|
|
|
// Do the lookup and get the entire StringMapEntry. We want access to the
|
|
// key if we are creating the entry.
|
|
StringMapEntry<MCSymbol*> &Entry = Symbols.GetOrCreateValue(Name);
|
|
if (Entry.getValue()) return Entry.getValue();
|
|
|
|
// Ok, the entry doesn't already exist. Have the MCSymbol object itself refer
|
|
// to the copy of the string that is embedded in the StringMapEntry.
|
|
MCSymbol *Result = new (*this) MCSymbol(Entry.getKey(), isTemporary);
|
|
Entry.setValue(Result);
|
|
return Result;
|
|
}
|
|
|
|
MCSymbol *MCContext::GetOrCreateSymbol(const Twine &Name, bool isTemporary) {
|
|
SmallString<128> NameSV;
|
|
Name.toVector(NameSV);
|
|
return GetOrCreateSymbol(NameSV.str(), isTemporary);
|
|
}
|
|
|
|
MCSymbol *MCContext::CreateTempSymbol() {
|
|
return GetOrCreateTemporarySymbol(Twine(MAI.getPrivateGlobalPrefix()) +
|
|
"tmp" + Twine(NextUniqueID++));
|
|
}
|
|
|
|
|
|
MCSymbol *MCContext::GetOrCreateTemporarySymbol(StringRef Name) {
|
|
// If there is no name, create a new anonymous symbol.
|
|
// FIXME: Remove this. This form of the method should always take a name.
|
|
if (Name.empty())
|
|
return GetOrCreateTemporarySymbol(Twine(MAI.getPrivateGlobalPrefix()) +
|
|
"tmp" + Twine(NextUniqueID++));
|
|
|
|
return GetOrCreateSymbol(Name, true);
|
|
}
|
|
|
|
MCSymbol *MCContext::GetOrCreateTemporarySymbol(const Twine &Name) {
|
|
SmallString<128> NameSV;
|
|
Name.toVector(NameSV);
|
|
return GetOrCreateTemporarySymbol(NameSV.str());
|
|
}
|
|
|
|
|
|
MCSymbol *MCContext::LookupSymbol(StringRef Name) const {
|
|
return Symbols.lookup(Name);
|
|
}
|