diff options
author | Saleem Abdulrasool <compnerd@compnerd.org> | 2014-01-30 04:02:47 +0000 |
---|---|---|
committer | Saleem Abdulrasool <compnerd@compnerd.org> | 2014-01-30 04:02:47 +0000 |
commit | 56e06e86406421bd0d4ea86e07cca3621dbf2382 (patch) | |
tree | 35365d85b9dc017cd9d3a26007607fa7567daa07 /llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp | |
parent | a3f12bdeecaae4a8c17483f096d4c30a02036dd8 (diff) | |
download | bcm5719-llvm-56e06e86406421bd0d4ea86e07cca3621dbf2382.tar.gz bcm5719-llvm-56e06e86406421bd0d4ea86e07cca3621dbf2382.zip |
ARM: suuport .tlsdescseq directive
This enhances the ARMAsmParser to handle .tlsdescseq directives. This is a
slightly special relocation. We must be able to generate them, but not consume
them in assembly. The relocation is meant to assist the linker in generating a
TLS descriptor sequence. The ELF target streamer is enhanced to append
additional fixups into the current segment and that is used to emit the new
R_ARM_TLS_DESCSEQ relocations.
llvm-svn: 200448
Diffstat (limited to 'llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp')
-rw-r--r-- | llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp index efee318a047..c2e3503278b 100644 --- a/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp +++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp @@ -139,6 +139,8 @@ class ARMTargetAsmStreamer : public ARMTargetStreamer { virtual void emitInst(uint32_t Inst, char Suffix = '\0'); virtual void finishAttributeSection(); + virtual void AnnotateTLSDescriptorSequence(const MCSymbolRefExpr *SRE); + public: ARMTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS, MCInstPrinter &InstPrinter, bool VerboseAsm); @@ -241,6 +243,10 @@ void ARMTargetAsmStreamer::emitFPU(unsigned FPU) { } void ARMTargetAsmStreamer::finishAttributeSection() { } +void +ARMTargetAsmStreamer::AnnotateTLSDescriptorSequence(const MCSymbolRefExpr *S) { + OS << "\t.tlsdescseq\t" << S->getSymbol().getName(); +} void ARMTargetAsmStreamer::emitInst(uint32_t Inst, char Suffix) { OS << "\t.inst"; @@ -397,6 +403,8 @@ private: virtual void emitInst(uint32_t Inst, char Suffix = '\0'); virtual void finishAttributeSection(); + virtual void AnnotateTLSDescriptorSequence(const MCSymbolRefExpr *SRE); + size_t calculateContentSize() const; public: @@ -605,6 +613,8 @@ private: void SwitchToExTabSection(const MCSymbol &FnStart); void SwitchToExIdxSection(const MCSymbol &FnStart); + void EmitFixup(const MCExpr *Expr, MCFixupKind Kind); + bool IsThumb; int64_t MappingSymbolCounter; @@ -953,6 +963,10 @@ void ARMTargetELFStreamer::finishAttributeSection() { Contents.clear(); FPU = ARM::INVALID_FPU; } +void +ARMTargetELFStreamer::AnnotateTLSDescriptorSequence(const MCSymbolRefExpr *S) { + getStreamer().EmitFixup(S, FK_Data_4); +} void ARMTargetELFStreamer::emitInst(uint32_t Inst, char Suffix) { getStreamer().emitInst(Inst, Suffix); } @@ -1011,6 +1025,11 @@ inline void ARMELFStreamer::SwitchToExIdxSection(const MCSymbol &FnStart) { SectionKind::getDataRel(), FnStart); } +void ARMELFStreamer::EmitFixup(const MCExpr *Expr, MCFixupKind Kind) { + MCDataFragment *Frag = getOrCreateDataFragment(); + Frag->getFixups().push_back(MCFixup::Create(Frag->getContents().size(), Expr, + Kind)); +} void ARMELFStreamer::Reset() { ExTab = NULL; |