summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
Diffstat (limited to 'llvm')
-rw-r--r--llvm/include/llvm/MC/MCAssembler.h26
-rw-r--r--llvm/include/llvm/MC/MCSymbol.h19
-rw-r--r--llvm/lib/MC/MCAssembler.cpp17
3 files changed, 37 insertions, 25 deletions
diff --git a/llvm/include/llvm/MC/MCAssembler.h b/llvm/include/llvm/MC/MCAssembler.h
index ffe9d829214..a27482c32a9 100644
--- a/llvm/include/llvm/MC/MCAssembler.h
+++ b/llvm/include/llvm/MC/MCAssembler.h
@@ -676,7 +676,7 @@ class MCAssembler {
public:
typedef iplist<MCSectionData> SectionDataListType;
- typedef std::vector<std::unique_ptr<MCSymbolData>> SymbolDataListType;
+ typedef std::vector<MCSymbolData *> SymbolDataListType;
typedef SectionDataListType::const_iterator const_iterator;
typedef SectionDataListType::iterator iterator;
@@ -734,11 +734,6 @@ private:
// FIXME: Avoid this indirection?
DenseMap<const MCSection *, MCSectionData *> SectionMap;
- /// The map of symbols to their associated assembler backend data.
- //
- // FIXME: Avoid this indirection?
- DenseMap<const MCSymbol *, MCSymbolData *> SymbolMap;
-
std::vector<IndirectSymbolData> IndirectSymbols;
std::vector<DataRegionData> DataRegions;
@@ -1039,7 +1034,7 @@ public:
}
bool hasSymbolData(const MCSymbol &Symbol) const {
- return SymbolMap.lookup(&Symbol) != nullptr;
+ return Symbol.getUnsafeData().isInitialized();
}
MCSymbolData &getSymbolData(const MCSymbol &Symbol) {
@@ -1048,23 +1043,18 @@ public:
}
const MCSymbolData &getSymbolData(const MCSymbol &Symbol) const {
- MCSymbolData *Entry = SymbolMap.lookup(&Symbol);
- assert(Entry && "Missing symbol data!");
- return *Entry;
+ return Symbol.getData();
}
MCSymbolData &getOrCreateSymbolData(const MCSymbol &Symbol,
bool *Created = nullptr) {
- MCSymbolData *&Entry = SymbolMap[&Symbol];
-
if (Created)
- *Created = !Entry;
- if (!Entry) {
- Symbols.emplace_back(new MCSymbolData(Symbol, nullptr, 0));
- Entry = Symbols.back().get();
+ *Created = !hasSymbolData(Symbol);
+ if (!hasSymbolData(Symbol)) {
+ Symbol.getUnsafeData().initialize(Symbol, nullptr, 0);
+ Symbols.push_back(&Symbol.getData());
}
-
- return *Entry;
+ return Symbol.getData();
}
const_file_name_iterator file_names_begin() const {
diff --git a/llvm/include/llvm/MC/MCSymbol.h b/llvm/include/llvm/MC/MCSymbol.h
index 08ee59c9b09..67b06456825 100644
--- a/llvm/include/llvm/MC/MCSymbol.h
+++ b/llvm/include/llvm/MC/MCSymbol.h
@@ -27,7 +27,7 @@ class MCSection;
class MCContext;
class raw_ostream;
-// FIXME: Same concerns as with SectionData.
+// TODO: Merge completely with MCSymbol.
class MCSymbolData {
const MCSymbol *Symbol;
@@ -64,10 +64,12 @@ class MCSymbolData {
public:
// Only for use as sentinel.
MCSymbolData();
- MCSymbolData(const MCSymbol &Symbol, MCFragment *Fragment, uint64_t Offset);
+ void initialize(const MCSymbol &Symbol, MCFragment *Fragment,
+ uint64_t Offset);
/// \name Accessors
/// @{
+ bool isInitialized() const { return Symbol; }
const MCSymbol &getSymbol() const { return *Symbol; }
@@ -185,6 +187,8 @@ class MCSymbol {
/// IsUsed - True if this symbol has been used.
mutable unsigned IsUsed : 1;
+ mutable MCSymbolData Data;
+
private: // MCContext creates and uniques these.
friend class MCExpr;
friend class MCContext;
@@ -204,6 +208,17 @@ public:
/// getName - Get the symbol name.
StringRef getName() const { return Name; }
+ /// Get associated symbol data.
+ MCSymbolData &getData() const {
+ assert(Data.isInitialized() && "Missing symbol data!");
+ return Data;
+ }
+
+ /// Get unsafe symbol data (even if uninitialized).
+ ///
+ /// Don't assert on uninitialized data; just return it.
+ MCSymbolData &getUnsafeData() const { return Data; }
+
/// \name Accessors
/// @{
diff --git a/llvm/lib/MC/MCAssembler.cpp b/llvm/lib/MC/MCAssembler.cpp
index b4b9a478241..ff230dfd9f9 100644
--- a/llvm/lib/MC/MCAssembler.cpp
+++ b/llvm/lib/MC/MCAssembler.cpp
@@ -360,10 +360,18 @@ void MCSectionData::setBundleLockState(BundleLockStateType NewState) {
MCSymbolData::MCSymbolData() : Symbol(nullptr) {}
-MCSymbolData::MCSymbolData(const MCSymbol &Symbol, MCFragment *Fragment,
- uint64_t Offset)
- : Symbol(&Symbol), Fragment(Fragment), Offset(Offset), SymbolSize(nullptr),
- CommonAlign(-1U), Flags(0), Index(0) {}
+void MCSymbolData::initialize(const MCSymbol &Symbol, MCFragment *Fragment,
+ uint64_t Offset) {
+ assert(!isInitialized() && "Expected uninitialized symbol");
+
+ this->Symbol = &Symbol;
+ this->Fragment.setPointer(Fragment);
+ this->Offset = Offset;
+ this->SymbolSize = nullptr;
+ this->CommonAlign = -1U;
+ this->Flags = 0;
+ this->Index = 0;
+}
/* *** */
@@ -383,7 +391,6 @@ void MCAssembler::reset() {
Sections.clear();
Symbols.clear();
SectionMap.clear();
- SymbolMap.clear();
IndirectSymbols.clear();
DataRegions.clear();
LinkerOptions.clear();
OpenPOWER on IntegriCloud