From 2dc04b460484faf17423a787f364a13f770b4523 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Sun, 27 Apr 2014 20:23:58 +0000 Subject: [PATCH] Add emitThumbSet to the arm target streamer. This fixes the asm printer implementation and lets the parser be unaware of what .thumb_set is. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@207381 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/MC/MCStreamer.h | 2 ++ lib/Target/ARM/AsmParser/ARMAsmParser.cpp | 31 +------------------ .../ARM/MCTargetDesc/ARMELFStreamer.cpp | 23 ++++++++++++++ .../ARM/MCTargetDesc/ARMTargetStreamer.cpp | 4 +++ test/MC/ARM/thumb_set.s | 5 +++ 5 files changed, 35 insertions(+), 30 deletions(-) diff --git a/include/llvm/MC/MCStreamer.h b/include/llvm/MC/MCStreamer.h index 6fa61ebf82a..b1a80b9abb0 100644 --- a/include/llvm/MC/MCStreamer.h +++ b/include/llvm/MC/MCStreamer.h @@ -121,6 +121,8 @@ public: virtual void AnnotateTLSDescriptorSequence(const MCSymbolRefExpr *SRE); + virtual void emitThumbSet(MCSymbol *Symbol, const MCExpr *Value); + void finish() override; /// Callback used to implement the ldr= pseudo. diff --git a/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/lib/Target/ARM/AsmParser/ARMAsmParser.cpp index 6eea56795ba..a8227fcc10b 100644 --- a/lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ b/lib/Target/ARM/AsmParser/ARMAsmParser.cpp @@ -9372,36 +9372,7 @@ bool ARMAsmParser::parseDirectiveThumbSet(SMLoc L) { Lex(); MCSymbol *Alias = getContext().GetOrCreateSymbol(Name); - if (const MCSymbolRefExpr *SRE = dyn_cast(Value)) { - MCSymbol *Sym = getContext().LookupSymbol(SRE->getSymbol().getName()); - if (!Sym->isDefined()) { - getStreamer().EmitSymbolAttribute(Sym, MCSA_Global); - getStreamer().EmitAssignment(Alias, Value); - return false; - } - - const MCObjectFileInfo::Environment Format = - getContext().getObjectFileInfo()->getObjectFileType(); - switch (Format) { - case MCObjectFileInfo::IsCOFF: { - char Type = COFF::IMAGE_SYM_DTYPE_FUNCTION << COFF::SCT_COMPLEX_TYPE_SHIFT; - getStreamer().EmitCOFFSymbolType(Type); - // .set values are always local in COFF - getStreamer().EmitSymbolAttribute(Alias, MCSA_Local); - break; - } - case MCObjectFileInfo::IsELF: - getStreamer().EmitSymbolAttribute(Alias, MCSA_ELF_TypeFunction); - break; - case MCObjectFileInfo::IsMachO: - break; - } - } - - // FIXME: set the function as being a thumb function via the assembler - getStreamer().EmitThumbFunc(Alias); - getStreamer().EmitAssignment(Alias, Value); - + getTargetStreamer().emitThumbSet(Alias, Value); return false; } diff --git a/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp b/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp index 982ba384deb..e8351063c2e 100644 --- a/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp +++ b/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp @@ -140,6 +140,7 @@ class ARMTargetAsmStreamer : public ARMTargetStreamer { void finishAttributeSection() override; void AnnotateTLSDescriptorSequence(const MCSymbolRefExpr *SRE) override; + void emitThumbSet(MCSymbol *Symbol, const MCExpr *Value) override; public: ARMTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS, @@ -261,6 +262,10 @@ ARMTargetAsmStreamer::AnnotateTLSDescriptorSequence(const MCSymbolRefExpr *S) { OS << "\t.tlsdescseq\t" << S->getSymbol().getName(); } +void ARMTargetAsmStreamer::emitThumbSet(MCSymbol *Symbol, const MCExpr *Value) { + OS << "\t.thumb_set\t" << *Symbol << ", " << *Value << '\n'; +} + void ARMTargetAsmStreamer::emitInst(uint32_t Inst, char Suffix) { OS << "\t.inst"; if (Suffix) @@ -410,6 +415,7 @@ private: void emitLabel(MCSymbol *Symbol) override; void AnnotateTLSDescriptorSequence(const MCSymbolRefExpr *SRE) override; + void emitThumbSet(MCSymbol *Symbol, const MCExpr *Value) override; size_t calculateContentSize() const; @@ -998,6 +1004,23 @@ void ARMTargetELFStreamer::AnnotateTLSDescriptorSequence(const MCSymbolRefExpr *S) { getStreamer().EmitFixup(S, FK_Data_4); } + +void ARMTargetELFStreamer::emitThumbSet(MCSymbol *Symbol, const MCExpr *Value) { + if (const MCSymbolRefExpr *SRE = dyn_cast(Value)) { + // FIXME: Doing a lookup in here is a hack. + MCSymbol *Sym = + getStreamer().getContext().LookupSymbol(SRE->getSymbol().getName()); + if (!Sym->isDefined()) { + getStreamer().EmitSymbolAttribute(Sym, MCSA_Global); + getStreamer().EmitAssignment(Symbol, Value); + return; + } + } + + getStreamer().EmitThumbFunc(Symbol); + getStreamer().EmitAssignment(Symbol, Value); +} + void ARMTargetELFStreamer::emitInst(uint32_t Inst, char Suffix) { getStreamer().emitInst(Inst, Suffix); } diff --git a/lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp b/lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp index 6e8a62cd2e8..e3cfb05b379 100644 --- a/lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp +++ b/lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp @@ -246,3 +246,7 @@ void ARMTargetStreamer::AnnotateTLSDescriptorSequence( const MCSymbolRefExpr *SRE) { llvm_unreachable("unimplemented"); } + +void ARMTargetStreamer::emitThumbSet(MCSymbol *Symbol, const MCExpr *Value) { + llvm_unreachable("unimplemented"); +} diff --git a/test/MC/ARM/thumb_set.s b/test/MC/ARM/thumb_set.s index d0bc9858ddc..650e1e5f40e 100644 --- a/test/MC/ARM/thumb_set.s +++ b/test/MC/ARM/thumb_set.s @@ -1,6 +1,9 @@ @ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s | llvm-readobj -t \ @ RUN: | FileCheck %s +@ RUN: llvm-mc -triple armv7-eabi -filetype asm -o - %s \ +@ RUN: | FileCheck --check-prefix=ASM %s + .syntax unified .arm @@ -11,6 +14,8 @@ arm_func: .thumb_set alias_arm_func, arm_func +@ ASM: .thumb_set alias_arm_func, arm_func + .thumb .type thumb_func,%function