summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2014-04-27 17:10:46 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2014-04-27 17:10:46 +0000
commit70883a252ca14648774609146cb533593254a6a4 (patch)
tree8699a3867234d19f7151587d187dec01ef6672ab
parent189a2a91c7d4f897856984b387db9cc58d103556 (diff)
downloadllvm-70883a252ca14648774609146cb533593254a6a4.tar.gz
llvm-70883a252ca14648774609146cb533593254a6a4.tar.bz2
llvm-70883a252ca14648774609146cb533593254a6a4.tar.xz
Avoid using MCSymbolData on the asm streamer.
Only the object streamers need to track if a symbol should be marked thumb or not. This ports the ELF case. The COFF case is not ported since it is currently not working for some other reason (I will report a bug). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@207366 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/MC/MCAsmStreamer.cpp14
-rw-r--r--lib/Target/ARM/AsmParser/ARMAsmParser.cpp28
-rw-r--r--lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp13
3 files changed, 13 insertions, 42 deletions
diff --git a/lib/MC/MCAsmStreamer.cpp b/lib/MC/MCAsmStreamer.cpp
index 62a9e82674..5d094cc870 100644
--- a/lib/MC/MCAsmStreamer.cpp
+++ b/lib/MC/MCAsmStreamer.cpp
@@ -59,10 +59,6 @@ private:
EHPrivateExtern = 1 << 2 };
DenseMap<const MCSymbol*, unsigned> FlagMap;
- // Using std::unordered_map to ensure pointers to MCSymbolData remain valid
- // over insertions/removals from the SymbolMap.
- std::unordered_map<const MCSymbol*, MCSymbolData> SymbolMap;
-
void EmitRegisterName(int64_t Register);
void EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame) override;
void EmitCFIEndProcImpl(MCDwarfFrameInfo &Frame) override;
@@ -258,8 +254,6 @@ public:
void EmitRawTextImpl(StringRef String) override;
void FinishImpl() override;
-
- virtual MCSymbolData &getOrCreateSymbolData(const MCSymbol *Symbol) override;
};
} // end anonymous namespace.
@@ -1472,14 +1466,6 @@ void MCAsmStreamer::FinishImpl() {
EmitFrames(AsmBackend.get(), false);
}
-MCSymbolData &MCAsmStreamer::getOrCreateSymbolData(const MCSymbol *Symbol) {
- auto Iter = SymbolMap.find(Symbol);
- if (Iter == SymbolMap.end())
- Iter = SymbolMap.insert(
- Iter, std::make_pair(Symbol, MCSymbolData(*Symbol, nullptr, 0)));
- return Iter->second;
-}
-
MCStreamer *llvm::createAsmStreamer(MCContext &Context,
formatted_raw_ostream &OS,
bool isVerboseAsm, bool useCFI,
diff --git a/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
index d1cfde11ec..6eea56795b 100644
--- a/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
+++ b/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
@@ -22,9 +22,7 @@
#include "llvm/MC/MCAssembler.h"
#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCDisassembler.h"
-#include "llvm/MC/MCELF.h"
#include "llvm/MC/MCELFStreamer.h"
-#include "llvm/MC/MCELFSymbolFlags.h"
#include "llvm/MC/MCExpr.h"
#include "llvm/MC/MCInst.h"
#include "llvm/MC/MCInstrDesc.h"
@@ -8364,32 +8362,6 @@ void ARMAsmParser::onLabelParsed(MCSymbol *Symbol) {
if (NextSymbolIsThumb) {
getParser().getStreamer().EmitThumbFunc(Symbol);
NextSymbolIsThumb = false;
- return;
- }
-
- if (!isThumb())
- return;
-
- const MCObjectFileInfo::Environment Format =
- getContext().getObjectFileInfo()->getObjectFileType();
- switch (Format) {
- case MCObjectFileInfo::IsCOFF: {
- const MCSymbolData &SD =
- getParser().getStreamer().getOrCreateSymbolData(Symbol);
- char Type = COFF::IMAGE_SYM_DTYPE_FUNCTION << COFF::SCT_COMPLEX_TYPE_SHIFT;
- if (SD.getFlags() & (Type << COFF::SF_TypeShift))
- getParser().getStreamer().EmitThumbFunc(Symbol);
- break;
- }
- case MCObjectFileInfo::IsELF: {
- const MCSymbolData &SD =
- getParser().getStreamer().getOrCreateSymbolData(Symbol);
- if (MCELF::GetType(SD) & (ELF::STT_FUNC << ELF_STT_Shift))
- getParser().getStreamer().EmitThumbFunc(Symbol);
- break;
- }
- case MCObjectFileInfo::IsMachO:
- break;
}
}
diff --git a/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp b/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp
index 3e87c6a7a8..982ba384de 100644
--- a/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp
+++ b/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp
@@ -30,6 +30,7 @@
#include "llvm/MC/MCExpr.h"
#include "llvm/MC/MCInst.h"
#include "llvm/MC/MCInstPrinter.h"
+#include "llvm/MC/MCObjectFileInfo.h"
#include "llvm/MC/MCObjectStreamer.h"
#include "llvm/MC/MCRegisterInfo.h"
#include "llvm/MC/MCSection.h"
@@ -406,6 +407,7 @@ private:
void emitFPU(unsigned FPU) override;
void emitInst(uint32_t Inst, char Suffix = '\0') override;
void finishAttributeSection() override;
+ void emitLabel(MCSymbol *Symbol) override;
void AnnotateTLSDescriptorSequence(const MCSymbolRefExpr *SRE) override;
@@ -981,6 +983,17 @@ void ARMTargetELFStreamer::finishAttributeSection() {
Contents.clear();
FPU = ARM::INVALID_FPU;
}
+
+void ARMTargetELFStreamer::emitLabel(MCSymbol *Symbol) {
+ ARMELFStreamer &Streamer = getStreamer();
+ if (!Streamer.IsThumb)
+ return;
+
+ const MCSymbolData &SD = Streamer.getOrCreateSymbolData(Symbol);
+ if (MCELF::GetType(SD) & (ELF::STT_FUNC << ELF_STT_Shift))
+ Streamer.EmitThumbFunc(Symbol);
+}
+
void
ARMTargetELFStreamer::AnnotateTLSDescriptorSequence(const MCSymbolRefExpr *S) {
getStreamer().EmitFixup(S, FK_Data_4);