[PATCH] D38302: [X86][MC] Fixed crash when assembling a file that contains section with 64-bit alignment (PR34726)

Rafael Avila de Espindola via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 3 15:40:13 PDT 2017


Do you actually have a use case for such a large alignment or you just
want to fix a crash? If fixing a crash, it might be better to just
produce a clean error saying that such a large alignment is not supported.

In case we do need to support it:

Konstantin Belochapka via Phabricator via llvm-commits
<llvm-commits at lists.llvm.org> writes:

> Index: lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp
> ===================================================================
> --- lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp
> +++ lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp
> @@ -776,9 +776,9 @@
>    MCSection &BSSSection = *OFI.getBSSSection();
>    MCA.registerSection(BSSSection);
>  
> -  TextSection.setAlignment(std::max(16u, TextSection.getAlignment()));
> -  DataSection.setAlignment(std::max(16u, DataSection.getAlignment()));
> -  BSSSection.setAlignment(std::max(16u, BSSSection.getAlignment()));
> +  TextSection.setAlignment(std::max((uint64_t)16u, TextSection.getAlignment()));
> +  DataSection.setAlignment(std::max((uint64_t)16u, DataSection.getAlignment()));
> +  BSSSection.setAlignment(std::max((uint64_t)16u, BSSSection.getAlignment()));

Can you use 16ULL?

> Index: include/llvm/MC/MCStreamer.h
> ===================================================================
> --- include/llvm/MC/MCStreamer.h
> +++ include/llvm/MC/MCStreamer.h
> @@ -509,15 +509,15 @@
>    /// \param ByteAlignment - The alignment of the symbol if
>    /// non-zero. This must be a power of 2.
>    virtual void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
> -                                unsigned ByteAlignment) = 0;
> +                                uint64_t ByteAlignment) = 0;
>  
>    /// \brief Emit a local common (.lcomm) symbol.
>    ///
>    /// \param Symbol - The common symbol to emit.
>    /// \param Size - The size of the common symbol.
>    /// \param ByteAlignment - The alignment of the common symbol in bytes.
>    virtual void EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size,
> -                                     unsigned ByteAlignment);
> +                                     uint64_t ByteAlignment);
>  
>    /// \brief Emit the zerofill section and an optional symbol.
>    ///
> @@ -527,7 +527,7 @@
>    /// \param ByteAlignment - The alignment of the zerofill symbol if
>    /// non-zero. This must be a power of 2 on some targets.
>    virtual void EmitZerofill(MCSection *Section, MCSymbol *Symbol = nullptr,
> -                            uint64_t Size = 0, unsigned ByteAlignment = 0) = 0;
> +                            uint64_t Size = 0, uint64_t ByteAlignment = 0) = 0;
>  
>    /// \brief Emit a thread local bss (.tbss) symbol.
>    ///
> @@ -537,7 +537,7 @@
>    /// \param ByteAlignment - The alignment of the thread local common symbol
>    /// if non-zero.  This must be a power of 2 on some targets.
>    virtual void EmitTBSSSymbol(MCSection *Section, MCSymbol *Symbol,
> -                              uint64_t Size, unsigned ByteAlignment = 0);
> +                              uint64_t Size, uint64_t ByteAlignment = 0);
>  
>    /// @}
>    /// \name Generating Data
> @@ -682,9 +682,9 @@
>    /// \param MaxBytesToEmit - The maximum numbers of bytes to emit, or 0. If
>    /// the alignment cannot be reached in this many bytes, no bytes are
>    /// emitted.
> -  virtual void EmitValueToAlignment(unsigned ByteAlignment, int64_t Value = 0,
> +  virtual void EmitValueToAlignment(uint64_t ByteAlignment, int64_t Value = 0,
>                                      unsigned ValueSize = 1,
> -                                    unsigned MaxBytesToEmit = 0);
> +                                    uint64_t MaxBytesToEmit = 0);
>  
>    /// \brief Emit nops until the byte alignment \p ByteAlignment is reached.
>    ///
> @@ -696,8 +696,8 @@
>    /// \param MaxBytesToEmit - The maximum numbers of bytes to emit, or 0. If
>    /// the alignment cannot be reached in this many bytes, no bytes are
>    /// emitted.
> -  virtual void EmitCodeAlignment(unsigned ByteAlignment,
> -                                 unsigned MaxBytesToEmit = 0);
> +  virtual void EmitCodeAlignment(uint64_t ByteAlignment,
> +                                 uint64_t MaxBytesToEmit = 0);

I think we are missing tests for some of these (common symbols for
example).

>    /// \brief Emit some number of copies of \p Value until the byte offset \p
>    /// Offset is reached.
> Index: include/llvm/MC/MCSection.h
> ===================================================================
> --- include/llvm/MC/MCSection.h
> +++ include/llvm/MC/MCSection.h
> @@ -59,7 +59,7 @@
>    MCSymbol *Begin;
>    MCSymbol *End = nullptr;
>    /// The alignment requirement of this section.
> -  unsigned Alignment = 1;
> +  uint64_t Alignment = 1;
>    /// The section index in the assemblers section list.
>    unsigned Ordinal = 0;
>    /// The index of this section in the layout order.
> @@ -114,8 +114,8 @@
>    MCSymbol *getEndSymbol(MCContext &Ctx);
>    bool hasEnded() const;
>  
> -  unsigned getAlignment() const { return Alignment; }
> -  void setAlignment(unsigned Value) { Alignment = Value; }
> +  uint64_t getAlignment() const { return Alignment; }
> +  void setAlignment(uint64_t Value) { Alignment = Value; }

Does this change the size of a MCSection? Can you assert that ALignment
is a power of 2 and store the log?

> Index: include/llvm/MC/MCFragment.h
> ===================================================================
> --- include/llvm/MC/MCFragment.h
> +++ include/llvm/MC/MCFragment.h
> @@ -278,7 +278,7 @@
>  
>  class MCAlignFragment : public MCFragment {
>    /// Alignment - The alignment to ensure, in bytes.
> -  unsigned Alignment;
> +  uint64_t Alignment;

Same as above.

Cheers,
Rafael


More information about the llvm-commits mailing list