diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/contrib/llvm-project/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp b/contrib/llvm-project/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp index f51fbdcd84da..f558ca8d2d9f 100644 --- a/contrib/llvm-project/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp +++ b/contrib/llvm-project/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp @@ -441,10 +441,12 @@ public: friend class ARMTargetELFStreamer; ARMELFStreamer(MCContext &Context, std::unique_ptr<MCAsmBackend> TAB, - std::unique_ptr<MCObjectWriter> OW, std::unique_ptr<MCCodeEmitter> Emitter, - bool IsThumb) - : MCELFStreamer(Context, std::move(TAB), std::move(OW), std::move(Emitter)), - IsThumb(IsThumb) { + std::unique_ptr<MCObjectWriter> OW, + std::unique_ptr<MCCodeEmitter> Emitter, bool IsThumb, + bool IsAndroid) + : MCELFStreamer(Context, std::move(TAB), std::move(OW), + std::move(Emitter)), + IsThumb(IsThumb), IsAndroid(IsAndroid) { EHReset(); } @@ -657,11 +659,10 @@ private: uint64_t Offset) { auto *Symbol = cast<MCSymbolELF>(getContext().getOrCreateSymbol( Name + "." + Twine(MappingSymbolCounter++))); - EmitLabel(Symbol, Loc, F); + EmitLabelAtPos(Symbol, Loc, F, Offset); Symbol->setType(ELF::STT_NOTYPE); Symbol->setBinding(ELF::STB_LOCAL); Symbol->setExternal(false); - Symbol->setOffset(Offset); } void EmitThumbFunc(MCSymbol *Func) override { @@ -687,6 +688,7 @@ private: void EmitFixup(const MCExpr *Expr, MCFixupKind Kind); bool IsThumb; + bool IsAndroid; int64_t MappingSymbolCounter = 0; DenseMap<const MCSection *, std::unique_ptr<ElfMappingSymbolInfo>> @@ -1269,7 +1271,12 @@ void ARMELFStreamer::emitFnEnd() { // Emit the exception index table entry SwitchToExIdxSection(*FnStart); - if (PersonalityIndex < ARM::EHABI::NUM_PERSONALITY_INDEX) + // The EHABI requires a dependency preserving R_ARM_NONE relocation to the + // personality routine to protect it from an arbitrary platform's static + // linker garbage collection. We disable this for Android where the unwinder + // is either dynamically linked or directly references the personality + // routine. + if (PersonalityIndex < ARM::EHABI::NUM_PERSONALITY_INDEX && !IsAndroid) EmitPersonalityFixup(GetAEABIUnwindPersonalityName(PersonalityIndex)); const MCSymbolRefExpr *FnStartRef = @@ -1504,9 +1511,11 @@ MCELFStreamer *createARMELFStreamer(MCContext &Context, std::unique_ptr<MCAsmBackend> TAB, std::unique_ptr<MCObjectWriter> OW, std::unique_ptr<MCCodeEmitter> Emitter, - bool RelaxAll, bool IsThumb) { - ARMELFStreamer *S = new ARMELFStreamer(Context, std::move(TAB), std::move(OW), - std::move(Emitter), IsThumb); + bool RelaxAll, bool IsThumb, + bool IsAndroid) { + ARMELFStreamer *S = + new ARMELFStreamer(Context, std::move(TAB), std::move(OW), + std::move(Emitter), IsThumb, IsAndroid); // FIXME: This should eventually end up somewhere else where more // intelligent flag decisions can be made. For now we are just maintaining // the status quo for ARM and setting EF_ARM_EABI_VER5 as the default. |
