[llvm] 386f1c1 - [Object] Remove conditional layout of bitfields in MachO::relocation_info.

Lang Hames via llvm-commits llvm-commits at lists.llvm.org
Thu Apr 16 17:08:12 PDT 2020


This broke llvm-objcopy on big-endian platforms. I'm working on a fix for
this now.

-- Lang.

On Thu, Apr 16, 2020 at 4:19 PM Lang Hames via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

>
> Author: Lang Hames
> Date: 2020-04-16T16:17:36-07:00
> New Revision: 386f1c114d5952c13760cb3368d41d09d8ba099c
>
> URL:
> https://github.com/llvm/llvm-project/commit/386f1c114d5952c13760cb3368d41d09d8ba099c
> DIFF:
> https://github.com/llvm/llvm-project/commit/386f1c114d5952c13760cb3368d41d09d8ba099c.diff
>
> LOG: [Object] Remove conditional layout of bitfields in
> MachO::relocation_info.
>
> This removes the conditional layout of relocation_info bitfields that was
> introduced in 3ccd677bf (svn r358839). The platform relocation_info
> struct (defined in usr/include/mach-o/reloc.h) does not define the layout
> of
> this struct differently on big-endian platforms and we want to keep the
> LLVM
> and platform definitions in sync.
>
> To fix the bug that 3ccd677bf addressed this patch modifies JITLink to
> construct
> its relocation_info structs from the raw relocation words using shift and
> mask
> operations.
>
> Added:
>
>
> Modified:
>     llvm/include/llvm/BinaryFormat/MachO.h
>     llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.h
>     llvm/lib/ExecutionEngine/JITLink/MachO_arm64.cpp
>     llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp
>
> Removed:
>
>
>
>
> ################################################################################
> diff  --git a/llvm/include/llvm/BinaryFormat/MachO.h
> b/llvm/include/llvm/BinaryFormat/MachO.h
> index 53959182e987..0010f36e8b89 100644
> --- a/llvm/include/llvm/BinaryFormat/MachO.h
> +++ b/llvm/include/llvm/BinaryFormat/MachO.h
> @@ -952,13 +952,8 @@ struct fat_arch_64 {
>  // Structs from <mach-o/reloc.h>
>  struct relocation_info {
>    int32_t r_address;
> -#if defined(BYTE_ORDER) && defined(BIG_ENDIAN) && (BYTE_ORDER ==
> BIG_ENDIAN)
> -  uint32_t r_type : 4,  r_extern : 1, r_length : 2, r_pcrel : 1,
> -      r_symbolnum : 24;
> -#else
>    uint32_t r_symbolnum : 24, r_pcrel : 1, r_length : 2, r_extern : 1,
>        r_type : 4;
> -#endif
>  };
>
>  struct scattered_relocation_info {
>
> diff  --git a/llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.h
> b/llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.h
> index 06d4787fc43c..ffe010054ff5 100644
> --- a/llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.h
> +++ b/llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.h
> @@ -153,6 +153,20 @@ class MachOLinkGraphBuilder {
>    static Scope getScope(StringRef Name, uint8_t Type);
>    static bool isAltEntry(const NormalizedSymbol &NSym);
>
> +  MachO::relocation_info
> +  getRelocationInfo(const object::relocation_iterator RelItr) {
> +    MachO::any_relocation_info ARI =
> +        getObject().getRelocation(RelItr->getRawDataRefImpl());
> +    MachO::relocation_info RI;
> +    RI.r_address = ARI.r_word0;
> +    RI.r_symbolnum = ARI.r_word1 & 0xffffff;
> +    RI.r_pcrel = (ARI.r_word1 >> 24) & 1;
> +    RI.r_length = (ARI.r_word1 >> 25) & 3;
> +    RI.r_extern = (ARI.r_word1 >> 27) & 1;
> +    RI.r_type = (ARI.r_word1 >> 28);
> +    return RI;
> +  }
> +
>  private:
>    static unsigned getPointerSize(const object::MachOObjectFile &Obj);
>    static support::endianness getEndianness(const object::MachOObjectFile
> &Obj);
>
> diff  --git a/llvm/lib/ExecutionEngine/JITLink/MachO_arm64.cpp
> b/llvm/lib/ExecutionEngine/JITLink/MachO_arm64.cpp
> index cc3940393bfc..55c7b36142a0 100644
> --- a/llvm/lib/ExecutionEngine/JITLink/MachO_arm64.cpp
> +++ b/llvm/lib/ExecutionEngine/JITLink/MachO_arm64.cpp
> @@ -92,15 +92,6 @@ class MachOLinkGraphBuilder_arm64 : public
> MachOLinkGraphBuilder {
>          ", length=" + formatv("{0:d}", RI.r_length));
>    }
>
> -  MachO::relocation_info
> -  getRelocationInfo(const object::relocation_iterator RelItr) {
> -    MachO::any_relocation_info ARI =
> -        getObject().getRelocation(RelItr->getRawDataRefImpl());
> -    MachO::relocation_info RI;
> -    memcpy(&RI, &ARI, sizeof(MachO::relocation_info));
> -    return RI;
> -  }
> -
>    using PairRelocInfo =
>        std::tuple<MachOARM64RelocationKind, Symbol *, uint64_t>;
>
>
> diff  --git a/llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp
> b/llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp
> index 05e323b18d80..9abeddfb1920 100644
> --- a/llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp
> +++ b/llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp
> @@ -95,15 +95,6 @@ class MachOLinkGraphBuilder_x86_64 : public
> MachOLinkGraphBuilder {
>          ", length=" + formatv("{0:d}", RI.r_length));
>    }
>
> -  MachO::relocation_info
> -  getRelocationInfo(const object::relocation_iterator RelItr) {
> -    MachO::any_relocation_info ARI =
> -        getObject().getRelocation(RelItr->getRawDataRefImpl());
> -    MachO::relocation_info RI;
> -    memcpy(&RI, &ARI, sizeof(MachO::relocation_info));
> -    return RI;
> -  }
> -
>    using PairRelocInfo = std::tuple<MachOX86RelocationKind, Symbol *,
> uint64_t>;
>
>    // Parses paired SUBTRACTOR/UNSIGNED relocations and, on success,
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200416/55d4a0e8/attachment-0001.html>


More information about the llvm-commits mailing list