[lld] r365595 - [Coding style change] Rename variables so that they start with a lowercase letter
Rui Ueyama via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 11 00:22:45 PDT 2019
On Thu, Jul 11, 2019 at 6:14 AM Shoaib Meenai <smeenai at fb.com> wrote:
> Would it have been preferable to wait until
> https://reviews.llvm.org/D64123 was shipped and/or wait after the branch
> cut?
>
https://reviews.llvm.org/D64123 was not intended to be submit, as that tool
is for one-time use for converting lld source files. I uploaded the patch
so that people who want to run the tool can apply, build and run it
locally. For LLVM and Clang, I think I need to create a more comprehensive
tool (perhaps based on clang-tidy) because of the size of the source tree,
and that may be worth to be submitted, though.
> Do you have plans for doing the same for LLD COFF and WASM?
>
Yes, I did it already.
> On 7/9/19, 10:00 PM, "llvm-commits on behalf of Rui Ueyama via
> llvm-commits" <llvm-commits-bounces at lists.llvm.org on behalf of
> llvm-commits at lists.llvm.org> wrote:
>
> Author: ruiu
> Date: Tue Jul 9 22:00:37 2019
> New Revision: 365595
>
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D365595-26view-3Drev&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=wqTgCRPiAjNC5Rq0SnDKS5zZ6aodGwtCQH1Vld_r5Ek&e=
> Log:
> [Coding style change] Rename variables so that they start with a
> lowercase letter
>
> This patch is mechanically generated by clang-llvm-rename tool that I
> wrote
> using Clang Refactoring Engine just for creating this patch. You can
> see the
> source code of the tool at
> https://urldefense.proofpoint.com/v2/url?u=https-3A__reviews.llvm.org_D64123&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=VxGujZlYIyFLpJNWaMTK8u7WOocmQLIu6n9zrBBDLiU&e=
> . There's no manual
> post-processing; you can generate the same patch by re-running the
> tool against
> lld's code base.
>
> Here is the main discussion thread to change the LLVM coding style:
>
> https://urldefense.proofpoint.com/v2/url?u=https-3A__lists.llvm.org_pipermail_llvm-2Ddev_2019-2DFebruary_130083.html&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=RXNHRWMvDBxvLShou_cCnBDQOPg1UZW_ZReoG-h5qRQ&e=
> In the discussion thread, I proposed we use lld as a testbed for
> variable
> naming scheme change, and this patch does that.
>
> I chose to rename variables so that they are in camelCase, just
> because that
> is a minimal change to make variables to start with a lowercase letter.
>
> Note to downstream patch maintainers: if you are maintaining a
> downstream lld
> repo, just rebasing ahead of this commit would cause massive merge
> conflicts
> because this patch essentially changes every line in the lld
> subdirectory. But
> there's a remedy.
>
> clang-llvm-rename tool is a batch tool, so you can rename variables in
> your
> downstream repo with the tool. Given that, here is how to rebase your
> repo to
> a commit after the mass renaming:
>
> 1. rebase to the commit just before the mass variable renaming,
> 2. apply the tool to your downstream repo to mass-rename variables
> locally, and
> 3. rebase again to the head.
>
> Most changes made by the tool should be identical for a downstream
> repo and
> for the head, so at the step 3, almost all changes should be merged and
> disappear. I'd expect that there would be some lines that you need to
> merge by
> hand, but that shouldn't be too many.
>
> Differential Revision:
> https://urldefense.proofpoint.com/v2/url?u=https-3A__reviews.llvm.org_D64121&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=OKovn1r-sI6ax8FmjrtKgtOytgB2cD7SxzGUTJ2P-cM&e=
>
> Modified:
> lld/trunk/ELF/AArch64ErrataFix.cpp
> lld/trunk/ELF/AArch64ErrataFix.h
> lld/trunk/ELF/Arch/AArch64.cpp
> lld/trunk/ELF/Arch/AMDGPU.cpp
> lld/trunk/ELF/Arch/ARM.cpp
> lld/trunk/ELF/Arch/AVR.cpp
> lld/trunk/ELF/Arch/Hexagon.cpp
> lld/trunk/ELF/Arch/MSP430.cpp
> lld/trunk/ELF/Arch/Mips.cpp
> lld/trunk/ELF/Arch/MipsArchTree.cpp
> lld/trunk/ELF/Arch/PPC.cpp
> lld/trunk/ELF/Arch/PPC64.cpp
> lld/trunk/ELF/Arch/RISCV.cpp
> lld/trunk/ELF/Arch/SPARCV9.cpp
> lld/trunk/ELF/Arch/X86.cpp
> lld/trunk/ELF/Arch/X86_64.cpp
> lld/trunk/ELF/CallGraphSort.cpp
> lld/trunk/ELF/Config.h
> lld/trunk/ELF/DWARF.cpp
> lld/trunk/ELF/DWARF.h
> lld/trunk/ELF/Driver.cpp
> lld/trunk/ELF/Driver.h
> lld/trunk/ELF/DriverUtils.cpp
> lld/trunk/ELF/EhFrame.cpp
> lld/trunk/ELF/EhFrame.h
> lld/trunk/ELF/ICF.cpp
> lld/trunk/ELF/InputFiles.cpp
> lld/trunk/ELF/InputFiles.h
> lld/trunk/ELF/InputSection.cpp
> lld/trunk/ELF/InputSection.h
> lld/trunk/ELF/LTO.cpp
> lld/trunk/ELF/LTO.h
> lld/trunk/ELF/LinkerScript.cpp
> lld/trunk/ELF/LinkerScript.h
> lld/trunk/ELF/MapFile.cpp
> lld/trunk/ELF/MarkLive.cpp
> lld/trunk/ELF/OutputSections.cpp
> lld/trunk/ELF/OutputSections.h
> lld/trunk/ELF/Relocations.cpp
> lld/trunk/ELF/Relocations.h
> lld/trunk/ELF/ScriptLexer.cpp
> lld/trunk/ELF/ScriptLexer.h
> lld/trunk/ELF/ScriptParser.cpp
> lld/trunk/ELF/ScriptParser.h
> lld/trunk/ELF/SymbolTable.cpp
> lld/trunk/ELF/SymbolTable.h
> lld/trunk/ELF/Symbols.cpp
> lld/trunk/ELF/Symbols.h
> lld/trunk/ELF/SyntheticSections.cpp
> lld/trunk/ELF/SyntheticSections.h
> lld/trunk/ELF/Target.cpp
> lld/trunk/ELF/Target.h
> lld/trunk/ELF/Thunks.cpp
> lld/trunk/ELF/Thunks.h
> lld/trunk/ELF/Writer.cpp
> lld/trunk/ELF/Writer.h
>
> Modified: lld/trunk/ELF/AArch64ErrataFix.cpp
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_AArch64ErrataFix.cpp-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=yZ7pbztjcMNajAStaXuE3ZgIj9FgBoapqVmYAtBzt-I&e=
>
> ==============================================================================
> --- lld/trunk/ELF/AArch64ErrataFix.cpp (original)
> +++ lld/trunk/ELF/AArch64ErrataFix.cpp Tue Jul 9 22:00:37 2019
> @@ -56,8 +56,8 @@ using namespace lld::elf;
>
> // ADRP
> // | 1 | immlo (2) | 1 | 0 0 0 0 | immhi (19) | Rd (5) |
> -static bool isADRP(uint32_t Instr) {
> - return (Instr & 0x9f000000) == 0x90000000;
> +static bool isADRP(uint32_t instr) {
> + return (instr & 0x9f000000) == 0x90000000;
> }
>
> // Load and store bit patterns from ARMv8-A ARM ARM.
> @@ -66,8 +66,8 @@ static bool isADRP(uint32_t Instr) {
>
> // All loads and stores have 1 (at bit postion 27), (0 at bit
> position 25).
> // | op0 x op1 (2) | 1 op2 0 op3 (2) | x | op4 (5) | xxxx | op5 (2) |
> x (10) |
> -static bool isLoadStoreClass(uint32_t Instr) {
> - return (Instr & 0x0a000000) == 0x08000000;
> +static bool isLoadStoreClass(uint32_t instr) {
> + return (instr & 0x0a000000) == 0x08000000;
> }
>
> // LDN/STN multiple no offset
> @@ -82,20 +82,20 @@ static bool isLoadStoreClass(uint32_t In
> // opcode == 0110 ST1 3 registers.
> // opcode == 0111 ST1 1 register.
> // opcode == 1010 ST1 2 registers.
> -static bool isST1MultipleOpcode(uint32_t Instr) {
> - return (Instr & 0x0000f000) == 0x00002000 ||
> - (Instr & 0x0000f000) == 0x00006000 ||
> - (Instr & 0x0000f000) == 0x00007000 ||
> - (Instr & 0x0000f000) == 0x0000a000;
> +static bool isST1MultipleOpcode(uint32_t instr) {
> + return (instr & 0x0000f000) == 0x00002000 ||
> + (instr & 0x0000f000) == 0x00006000 ||
> + (instr & 0x0000f000) == 0x00007000 ||
> + (instr & 0x0000f000) == 0x0000a000;
> }
>
> -static bool isST1Multiple(uint32_t Instr) {
> - return (Instr & 0xbfff0000) == 0x0c000000 &&
> isST1MultipleOpcode(Instr);
> +static bool isST1Multiple(uint32_t instr) {
> + return (instr & 0xbfff0000) == 0x0c000000 &&
> isST1MultipleOpcode(instr);
> }
>
> // Writes to Rn (writeback).
> -static bool isST1MultiplePost(uint32_t Instr) {
> - return (Instr & 0xbfe00000) == 0x0c800000 &&
> isST1MultipleOpcode(Instr);
> +static bool isST1MultiplePost(uint32_t instr) {
> + return (instr & 0xbfe00000) == 0x0c800000 &&
> isST1MultipleOpcode(instr);
> }
>
> // LDN/STN single no offset
> @@ -110,41 +110,41 @@ static bool isST1MultiplePost(uint32_t I
> // opcode == 000 ST1 8-bit.
> // opcode == 010 ST1 16-bit.
> // opcode == 100 ST1 32 or 64-bit (Size determines which).
> -static bool isST1SingleOpcode(uint32_t Instr) {
> - return (Instr & 0x0040e000) == 0x00000000 ||
> - (Instr & 0x0040e000) == 0x00004000 ||
> - (Instr & 0x0040e000) == 0x00008000;
> +static bool isST1SingleOpcode(uint32_t instr) {
> + return (instr & 0x0040e000) == 0x00000000 ||
> + (instr & 0x0040e000) == 0x00004000 ||
> + (instr & 0x0040e000) == 0x00008000;
> }
>
> -static bool isST1Single(uint32_t Instr) {
> - return (Instr & 0xbfff0000) == 0x0d000000 &&
> isST1SingleOpcode(Instr);
> +static bool isST1Single(uint32_t instr) {
> + return (instr & 0xbfff0000) == 0x0d000000 &&
> isST1SingleOpcode(instr);
> }
>
> // Writes to Rn (writeback).
> -static bool isST1SinglePost(uint32_t Instr) {
> - return (Instr & 0xbfe00000) == 0x0d800000 &&
> isST1SingleOpcode(Instr);
> +static bool isST1SinglePost(uint32_t instr) {
> + return (instr & 0xbfe00000) == 0x0d800000 &&
> isST1SingleOpcode(instr);
> }
>
> -static bool isST1(uint32_t Instr) {
> - return isST1Multiple(Instr) || isST1MultiplePost(Instr) ||
> - isST1Single(Instr) || isST1SinglePost(Instr);
> +static bool isST1(uint32_t instr) {
> + return isST1Multiple(instr) || isST1MultiplePost(instr) ||
> + isST1Single(instr) || isST1SinglePost(instr);
> }
>
> // Load/store exclusive
> // | size (2) 00 | 1000 | o2 L o1 | Rs (5) | o0 | Rt2 (5) | Rn (5) |
> Rt (5) |
> // L == 0 for Stores.
> -static bool isLoadStoreExclusive(uint32_t Instr) {
> - return (Instr & 0x3f000000) == 0x08000000;
> +static bool isLoadStoreExclusive(uint32_t instr) {
> + return (instr & 0x3f000000) == 0x08000000;
> }
>
> -static bool isLoadExclusive(uint32_t Instr) {
> - return (Instr & 0x3f400000) == 0x08400000;
> +static bool isLoadExclusive(uint32_t instr) {
> + return (instr & 0x3f400000) == 0x08400000;
> }
>
> // Load register literal
> // | opc (2) 01 | 1 V 00 | imm19 | Rt (5) |
> -static bool isLoadLiteral(uint32_t Instr) {
> - return (Instr & 0x3b000000) == 0x18000000;
> +static bool isLoadLiteral(uint32_t instr) {
> + return (instr & 0x3b000000) == 0x18000000;
> }
>
> // Load/store no-allocate pair
> @@ -152,8 +152,8 @@ static bool isLoadLiteral(uint32_t Instr
> // | opc (2) 10 | 1 V 00 | 0 L | imm7 | Rt2 (5) | Rn (5) | Rt (5) |
> // L == 0 for stores.
> // Never writes to register
> -static bool isSTNP(uint32_t Instr) {
> - return (Instr & 0x3bc00000) == 0x28000000;
> +static bool isSTNP(uint32_t instr) {
> + return (instr & 0x3bc00000) == 0x28000000;
> }
>
> // Load/store register pair
> @@ -161,69 +161,69 @@ static bool isSTNP(uint32_t Instr) {
> // | opc (2) 10 | 1 V 00 | 1 L | imm7 | Rt2 (5) | Rn (5) | Rt (5) |
> // L == 0 for stores, V == 0 for Scalar, V == 1 for Simd/FP
> // Writes to Rn.
> -static bool isSTPPost(uint32_t Instr) {
> - return (Instr & 0x3bc00000) == 0x28800000;
> +static bool isSTPPost(uint32_t instr) {
> + return (instr & 0x3bc00000) == 0x28800000;
> }
>
> // (offset)
> // | opc (2) 10 | 1 V 01 | 0 L | imm7 | Rt2 (5) | Rn (5) | Rt (5) |
> -static bool isSTPOffset(uint32_t Instr) {
> - return (Instr & 0x3bc00000) == 0x29000000;
> +static bool isSTPOffset(uint32_t instr) {
> + return (instr & 0x3bc00000) == 0x29000000;
> }
>
> // (pre-index)
> // | opc (2) 10 | 1 V 01 | 1 L | imm7 | Rt2 (5) | Rn (5) | Rt (5) |
> // Writes to Rn.
> -static bool isSTPPre(uint32_t Instr) {
> - return (Instr & 0x3bc00000) == 0x29800000;
> +static bool isSTPPre(uint32_t instr) {
> + return (instr & 0x3bc00000) == 0x29800000;
> }
>
> -static bool isSTP(uint32_t Instr) {
> - return isSTPPost(Instr) || isSTPOffset(Instr) || isSTPPre(Instr);
> +static bool isSTP(uint32_t instr) {
> + return isSTPPost(instr) || isSTPOffset(instr) || isSTPPre(instr);
> }
>
> // Load/store register (unscaled immediate)
> // | size (2) 11 | 1 V 00 | opc (2) 0 | imm9 | 00 | Rn (5) | Rt (5) |
> // V == 0 for Scalar, V == 1 for Simd/FP.
> -static bool isLoadStoreUnscaled(uint32_t Instr) {
> - return (Instr & 0x3b000c00) == 0x38000000;
> +static bool isLoadStoreUnscaled(uint32_t instr) {
> + return (instr & 0x3b000c00) == 0x38000000;
> }
>
> // Load/store register (immediate post-indexed)
> // | size (2) 11 | 1 V 00 | opc (2) 0 | imm9 | 01 | Rn (5) | Rt (5) |
> -static bool isLoadStoreImmediatePost(uint32_t Instr) {
> - return (Instr & 0x3b200c00) == 0x38000400;
> +static bool isLoadStoreImmediatePost(uint32_t instr) {
> + return (instr & 0x3b200c00) == 0x38000400;
> }
>
> // Load/store register (unprivileged)
> // | size (2) 11 | 1 V 00 | opc (2) 0 | imm9 | 10 | Rn (5) | Rt (5) |
> -static bool isLoadStoreUnpriv(uint32_t Instr) {
> - return (Instr & 0x3b200c00) == 0x38000800;
> +static bool isLoadStoreUnpriv(uint32_t instr) {
> + return (instr & 0x3b200c00) == 0x38000800;
> }
>
> // Load/store register (immediate pre-indexed)
> // | size (2) 11 | 1 V 00 | opc (2) 0 | imm9 | 11 | Rn (5) | Rt (5) |
> -static bool isLoadStoreImmediatePre(uint32_t Instr) {
> - return (Instr & 0x3b200c00) == 0x38000c00;
> +static bool isLoadStoreImmediatePre(uint32_t instr) {
> + return (instr & 0x3b200c00) == 0x38000c00;
> }
>
> // Load/store register (register offset)
> // | size (2) 11 | 1 V 00 | opc (2) 1 | Rm (5) | option (3) S | 10 |
> Rn | Rt |
> -static bool isLoadStoreRegisterOff(uint32_t Instr) {
> - return (Instr & 0x3b200c00) == 0x38200800;
> +static bool isLoadStoreRegisterOff(uint32_t instr) {
> + return (instr & 0x3b200c00) == 0x38200800;
> }
>
> // Load/store register (unsigned immediate)
> // | size (2) 11 | 1 V 01 | opc (2) | imm12 | Rn (5) | Rt (5) |
> -static bool isLoadStoreRegisterUnsigned(uint32_t Instr) {
> - return (Instr & 0x3b000000) == 0x39000000;
> +static bool isLoadStoreRegisterUnsigned(uint32_t instr) {
> + return (instr & 0x3b000000) == 0x39000000;
> }
>
> // Rt is always in bit position 0 - 4.
> -static uint32_t getRt(uint32_t Instr) { return (Instr & 0x1f); }
> +static uint32_t getRt(uint32_t instr) { return (instr & 0x1f); }
>
> // Rn is always in bit position 5 - 9.
> -static uint32_t getRn(uint32_t Instr) { return (Instr >> 5) & 0x1f; }
> +static uint32_t getRn(uint32_t instr) { return (instr >> 5) & 0x1f; }
>
> // C4.1.2 Branches, Exception Generating and System instructions
> // | op0 (3) 1 | 01 op1 (4) | x (22) |
> @@ -232,41 +232,41 @@ static uint32_t getRn(uint32_t Instr) {
> // op0 == x00 101 op1 == xxxx Unconditional Branch immediate.
> // op0 == x01 101 op1 == 0xxx Compare and branch immediate.
> // op0 == x01 101 op1 == 1xxx Test and branch immediate.
> -static bool isBranch(uint32_t Instr) {
> - return ((Instr & 0xfe000000) == 0xd6000000) || // Cond branch.
> - ((Instr & 0xfe000000) == 0x54000000) || // Uncond branch reg.
> - ((Instr & 0x7c000000) == 0x14000000) || // Uncond branch imm.
> - ((Instr & 0x7c000000) == 0x34000000); // Compare and test
> branch.
> +static bool isBranch(uint32_t instr) {
> + return ((instr & 0xfe000000) == 0xd6000000) || // Cond branch.
> + ((instr & 0xfe000000) == 0x54000000) || // Uncond branch reg.
> + ((instr & 0x7c000000) == 0x14000000) || // Uncond branch imm.
> + ((instr & 0x7c000000) == 0x34000000); // Compare and test
> branch.
> }
>
> -static bool isV8SingleRegisterNonStructureLoadStore(uint32_t Instr) {
> - return isLoadStoreUnscaled(Instr) ||
> isLoadStoreImmediatePost(Instr) ||
> - isLoadStoreUnpriv(Instr) || isLoadStoreImmediatePre(Instr) ||
> - isLoadStoreRegisterOff(Instr) ||
> isLoadStoreRegisterUnsigned(Instr);
> +static bool isV8SingleRegisterNonStructureLoadStore(uint32_t instr) {
> + return isLoadStoreUnscaled(instr) ||
> isLoadStoreImmediatePost(instr) ||
> + isLoadStoreUnpriv(instr) || isLoadStoreImmediatePre(instr) ||
> + isLoadStoreRegisterOff(instr) ||
> isLoadStoreRegisterUnsigned(instr);
> }
>
> // Note that this function refers to v8.0 only and does not include
> the
> // additional load and store instructions added for in later
> revisions of
> // the architecture such as the Atomic memory operations introduced
> // in v8.1.
> -static bool isV8NonStructureLoad(uint32_t Instr) {
> - if (isLoadExclusive(Instr))
> +static bool isV8NonStructureLoad(uint32_t instr) {
> + if (isLoadExclusive(instr))
> return true;
> - if (isLoadLiteral(Instr))
> + if (isLoadLiteral(instr))
> return true;
> - else if (isV8SingleRegisterNonStructureLoadStore(Instr)) {
> + else if (isV8SingleRegisterNonStructureLoadStore(instr)) {
> // For Load and Store single register, Loads are derived from a
> // combination of the Size, V and Opc fields.
> - uint32_t Size = (Instr >> 30) & 0xff;
> - uint32_t V = (Instr >> 26) & 0x1;
> - uint32_t Opc = (Instr >> 22) & 0x3;
> + uint32_t size = (instr >> 30) & 0xff;
> + uint32_t v = (instr >> 26) & 0x1;
> + uint32_t opc = (instr >> 22) & 0x3;
> // For the load and store instructions that we are decoding.
> // Opc == 0 are all stores.
> // Opc == 1 with a couple of exceptions are loads. The exceptions
> are:
> // Size == 00 (0), V == 1, Opc == 10 (2) which is a store and
> // Size == 11 (3), V == 0, Opc == 10 (2) which is a prefetch.
> - return Opc != 0 && !(Size == 0 && V == 1 && Opc == 2) &&
> - !(Size == 3 && V == 0 && Opc == 2);
> + return opc != 0 && !(size == 0 && v == 1 && opc == 2) &&
> + !(size == 3 && v == 0 && opc == 2);
> }
> return false;
> }
> @@ -275,18 +275,18 @@ static bool isV8NonStructureLoad(uint32_
> // needed for errata 843419.
>
> // Instruction with writeback updates the index register after the
> load/store.
> -static bool hasWriteback(uint32_t Instr) {
> - return isLoadStoreImmediatePre(Instr) ||
> isLoadStoreImmediatePost(Instr) ||
> - isSTPPre(Instr) || isSTPPost(Instr) ||
> isST1SinglePost(Instr) ||
> - isST1MultiplePost(Instr);
> +static bool hasWriteback(uint32_t instr) {
> + return isLoadStoreImmediatePre(instr) ||
> isLoadStoreImmediatePost(instr) ||
> + isSTPPre(instr) || isSTPPost(instr) ||
> isST1SinglePost(instr) ||
> + isST1MultiplePost(instr);
> }
>
> // For the load and store class of instructions, a load can write to
> the
> // destination register, a load and a store can write to the base
> register when
> // the instruction has writeback.
> -static bool doesLoadStoreWriteToReg(uint32_t Instr, uint32_t Reg) {
> - return (isV8NonStructureLoad(Instr) && getRt(Instr) == Reg) ||
> - (hasWriteback(Instr) && getRn(Instr) == Reg);
> +static bool doesLoadStoreWriteToReg(uint32_t instr, uint32_t reg) {
> + return (isV8NonStructureLoad(instr) && getRt(instr) == reg) ||
> + (hasWriteback(instr) && getRn(instr) == reg);
> }
>
> // Scanner for Cortex-A53 errata 843419
> @@ -318,18 +318,18 @@ static bool doesLoadStoreWriteToReg(uint
> // Return true if the Instruction sequence Adrp, Instr2, and Instr4
> match
> // the erratum sequence. The Adrp, Instr2 and Instr4 correspond to
> 1.), 2.),
> // and 4.) in the Scanner for Cortex-A53 errata comment above.
> -static bool is843419ErratumSequence(uint32_t Instr1, uint32_t Instr2,
> - uint32_t Instr4) {
> - if (!isADRP(Instr1))
> +static bool is843419ErratumSequence(uint32_t instr1, uint32_t instr2,
> + uint32_t instr4) {
> + if (!isADRP(instr1))
> return false;
>
> - uint32_t Rn = getRt(Instr1);
> - return isLoadStoreClass(Instr2) &&
> - (isLoadStoreExclusive(Instr2) || isLoadLiteral(Instr2) ||
> - isV8SingleRegisterNonStructureLoadStore(Instr2) ||
> isSTP(Instr2) ||
> - isSTNP(Instr2) || isST1(Instr2)) &&
> - !doesLoadStoreWriteToReg(Instr2, Rn) &&
> - isLoadStoreRegisterUnsigned(Instr4) && getRn(Instr4) == Rn;
> + uint32_t rn = getRt(instr1);
> + return isLoadStoreClass(instr2) &&
> + (isLoadStoreExclusive(instr2) || isLoadLiteral(instr2) ||
> + isV8SingleRegisterNonStructureLoadStore(instr2) ||
> isSTP(instr2) ||
> + isSTNP(instr2) || isST1(instr2)) &&
> + !doesLoadStoreWriteToReg(instr2, rn) &&
> + isLoadStoreRegisterUnsigned(instr4) && getRn(instr4) == rn;
> }
>
> // Scan the instruction sequence starting at Offset Off from the base
> of
> @@ -338,89 +338,89 @@ static bool is843419ErratumSequence(uint
> // instructions we've scanned.
> // Return the offset of the load or store instruction in IS that we
> want to
> // patch or 0 if no patch required.
> -static uint64_t scanCortexA53Errata843419(InputSection *IS, uint64_t
> &Off,
> - uint64_t Limit) {
> - uint64_t ISAddr = IS->getVA(0);
> +static uint64_t scanCortexA53Errata843419(InputSection *isec,
> uint64_t &off,
> + uint64_t limit) {
> + uint64_t isecAddr = isec->getVA(0);
>
> // Advance Off so that (ISAddr + Off) modulo 0x1000 is at least
> 0xff8.
> - uint64_t InitialPageOff = (ISAddr + Off) & 0xfff;
> - if (InitialPageOff < 0xff8)
> - Off += 0xff8 - InitialPageOff;
> + uint64_t initialPageOff = (isecAddr + off) & 0xfff;
> + if (initialPageOff < 0xff8)
> + off += 0xff8 - initialPageOff;
>
> - bool OptionalAllowed = Limit - Off > 12;
> - if (Off >= Limit || Limit - Off < 12) {
> + bool optionalAllowed = limit - off > 12;
> + if (off >= limit || limit - off < 12) {
> // Need at least 3 4-byte sized instructions to trigger erratum.
> - Off = Limit;
> + off = limit;
> return 0;
> }
>
> - uint64_t PatchOff = 0;
> - const uint8_t *Buf = IS->data().begin();
> - const ulittle32_t *InstBuf = reinterpret_cast<const ulittle32_t
> *>(Buf + Off);
> - uint32_t Instr1 = *InstBuf++;
> - uint32_t Instr2 = *InstBuf++;
> - uint32_t Instr3 = *InstBuf++;
> - if (is843419ErratumSequence(Instr1, Instr2, Instr3)) {
> - PatchOff = Off + 8;
> - } else if (OptionalAllowed && !isBranch(Instr3)) {
> - uint32_t Instr4 = *InstBuf++;
> - if (is843419ErratumSequence(Instr1, Instr2, Instr4))
> - PatchOff = Off + 12;
> + uint64_t patchOff = 0;
> + const uint8_t *buf = isec->data().begin();
> + const ulittle32_t *instBuf = reinterpret_cast<const ulittle32_t
> *>(buf + off);
> + uint32_t instr1 = *instBuf++;
> + uint32_t instr2 = *instBuf++;
> + uint32_t instr3 = *instBuf++;
> + if (is843419ErratumSequence(instr1, instr2, instr3)) {
> + patchOff = off + 8;
> + } else if (optionalAllowed && !isBranch(instr3)) {
> + uint32_t instr4 = *instBuf++;
> + if (is843419ErratumSequence(instr1, instr2, instr4))
> + patchOff = off + 12;
> }
> - if (((ISAddr + Off) & 0xfff) == 0xff8)
> - Off += 4;
> + if (((isecAddr + off) & 0xfff) == 0xff8)
> + off += 4;
> else
> - Off += 0xffc;
> - return PatchOff;
> + off += 0xffc;
> + return patchOff;
> }
>
> class lld::elf::Patch843419Section : public SyntheticSection {
> public:
> - Patch843419Section(InputSection *P, uint64_t Off);
> + Patch843419Section(InputSection *p, uint64_t off);
>
> - void writeTo(uint8_t *Buf) override;
> + void writeTo(uint8_t *buf) override;
>
> size_t getSize() const override { return 8; }
>
> uint64_t getLDSTAddr() const;
>
> // The Section we are patching.
> - const InputSection *Patchee;
> + const InputSection *patchee;
> // The offset of the instruction in the Patchee section we are
> patching.
> - uint64_t PatcheeOffset;
> + uint64_t patcheeOffset;
> // A label for the start of the Patch that we can use as a
> relocation target.
> - Symbol *PatchSym;
> + Symbol *patchSym;
> };
>
> -lld::elf::Patch843419Section::Patch843419Section(InputSection *P,
> uint64_t Off)
> +lld::elf::Patch843419Section::Patch843419Section(InputSection *p,
> uint64_t off)
> : SyntheticSection(SHF_ALLOC | SHF_EXECINSTR, SHT_PROGBITS, 4,
> ".text.patch"),
> - Patchee(P), PatcheeOffset(Off) {
> - this->Parent = P->getParent();
> - PatchSym = addSyntheticLocal(
> + patchee(p), patcheeOffset(off) {
> + this->parent = p->getParent();
> + patchSym = addSyntheticLocal(
> Saver.save("__CortexA53843419_" + utohexstr(getLDSTAddr())),
> STT_FUNC, 0,
> getSize(), *this);
> addSyntheticLocal(Saver.save("$x"), STT_NOTYPE, 0, 0, *this);
> }
>
> uint64_t lld::elf::Patch843419Section::getLDSTAddr() const {
> - return Patchee->getVA(PatcheeOffset);
> + return patchee->getVA(patcheeOffset);
> }
>
> -void lld::elf::Patch843419Section::writeTo(uint8_t *Buf) {
> +void lld::elf::Patch843419Section::writeTo(uint8_t *buf) {
> // Copy the instruction that we will be replacing with a branch in
> the
> // Patchee Section.
> - write32le(Buf, read32le(Patchee->data().begin() + PatcheeOffset));
> + write32le(buf, read32le(patchee->data().begin() + patcheeOffset));
>
> // Apply any relocation transferred from the original
> PatcheeSection.
> // For a SyntheticSection Buf already has OutSecOff added, but
> relocateAlloc
> // also adds OutSecOff so we need to subtract to avoid double
> counting.
> - this->relocateAlloc(Buf - OutSecOff, Buf - OutSecOff + getSize());
> + this->relocateAlloc(buf - outSecOff, buf - outSecOff + getSize());
>
> // Return address is the next instruction after the one we have
> just copied.
> - uint64_t S = getLDSTAddr() + 4;
> - uint64_t P = PatchSym->getVA() + 4;
> - Target->relocateOne(Buf + 4, R_AARCH64_JUMP26, S - P);
> + uint64_t s = getLDSTAddr() + 4;
> + uint64_t p = patchSym->getVA() + 4;
> + target->relocateOne(buf + 4, R_AARCH64_JUMP26, s - p);
> }
>
> void AArch64Err843419Patcher::init() {
> @@ -434,47 +434,47 @@ void AArch64Err843419Patcher::init() {
> // within sections. If there is no next symbol then the half open
> interval is
> // [Symbol Value, End of section). The type, code or data, is
> determined by
> // the mapping symbol name, $x for code, $d for data.
> - auto IsCodeMapSymbol = [](const Symbol *B) {
> - return B->getName() == "$x" || B->getName().startswith("$x.");
> + auto isCodeMapSymbol = [](const Symbol *b) {
> + return b->getName() == "$x" || b->getName().startswith("$x.");
> };
> - auto IsDataMapSymbol = [](const Symbol *B) {
> - return B->getName() == "$d" || B->getName().startswith("$d.");
> + auto isDataMapSymbol = [](const Symbol *b) {
> + return b->getName() == "$d" || b->getName().startswith("$d.");
> };
>
> // Collect mapping symbols for every executable InputSection.
> - for (InputFile *File : ObjectFiles) {
> - auto *F = cast<ObjFile<ELF64LE>>(File);
> - for (Symbol *B : F->getLocalSymbols()) {
> - auto *Def = dyn_cast<Defined>(B);
> - if (!Def)
> + for (InputFile *file : objectFiles) {
> + auto *f = cast<ObjFile<ELF64LE>>(file);
> + for (Symbol *b : f->getLocalSymbols()) {
> + auto *def = dyn_cast<Defined>(b);
> + if (!def)
> continue;
> - if (!IsCodeMapSymbol(Def) && !IsDataMapSymbol(Def))
> + if (!isCodeMapSymbol(def) && !isDataMapSymbol(def))
> continue;
> - if (auto *Sec = dyn_cast_or_null<InputSection>(Def->Section))
> - if (Sec->Flags & SHF_EXECINSTR)
> - SectionMap[Sec].push_back(Def);
> + if (auto *sec = dyn_cast_or_null<InputSection>(def->section))
> + if (sec->flags & SHF_EXECINSTR)
> + sectionMap[sec].push_back(def);
> }
> }
> // For each InputSection make sure the mapping symbols are in
> sorted in
> // ascending order and free from consecutive runs of mapping
> symbols with
> // the same type. For example we must remove the redundant $d.1
> from $x.0
> // $d.0 $d.1 $x.1.
> - for (auto &KV : SectionMap) {
> - std::vector<const Defined *> &MapSyms = KV.second;
> - if (MapSyms.size() <= 1)
> + for (auto &kv : sectionMap) {
> + std::vector<const Defined *> &mapSyms = kv.second;
> + if (mapSyms.size() <= 1)
> continue;
> - llvm::stable_sort(MapSyms, [](const Defined *A, const Defined *B)
> {
> - return A->Value < B->Value;
> + llvm::stable_sort(mapSyms, [](const Defined *a, const Defined *b)
> {
> + return a->value < b->value;
> });
> - MapSyms.erase(
> - std::unique(MapSyms.begin(), MapSyms.end(),
> - [=](const Defined *A, const Defined *B) {
> - return (IsCodeMapSymbol(A) &&
> IsCodeMapSymbol(B)) ||
> - (IsDataMapSymbol(A) &&
> IsDataMapSymbol(B));
> + mapSyms.erase(
> + std::unique(mapSyms.begin(), mapSyms.end(),
> + [=](const Defined *a, const Defined *b) {
> + return (isCodeMapSymbol(a) &&
> isCodeMapSymbol(b)) ||
> + (isDataMapSymbol(a) &&
> isDataMapSymbol(b));
> }),
> - MapSyms.end());
> + mapSyms.end());
> }
> - Initialized = true;
> + initialized = true;
> }
>
> // Insert the PatchSections we have created back into the
> @@ -483,60 +483,60 @@ void AArch64Err843419Patcher::init() {
> // executable sections, although we may need to insert them earlier
> if the
> // InputSectionDescription is larger than the maximum branch range.
> void AArch64Err843419Patcher::insertPatches(
> - InputSectionDescription &ISD, std::vector<Patch843419Section *>
> &Patches) {
> - uint64_t ISLimit;
> - uint64_t PrevISLimit = ISD.Sections.front()->OutSecOff;
> - uint64_t PatchUpperBound = PrevISLimit +
> Target->getThunkSectionSpacing();
> - uint64_t OutSecAddr = ISD.Sections.front()->getParent()->Addr;
> + InputSectionDescription &isd, std::vector<Patch843419Section *>
> &patches) {
> + uint64_t isecLimit;
> + uint64_t prevISLimit = isd.sections.front()->outSecOff;
> + uint64_t patchUpperBound = prevISLimit +
> target->getThunkSectionSpacing();
> + uint64_t outSecAddr = isd.sections.front()->getParent()->addr;
>
> // Set the OutSecOff of patches to the place where we want to
> insert them.
> // We use a similar strategy to Thunk placement. Place patches
> roughly
> // every multiple of maximum branch range.
> - auto PatchIt = Patches.begin();
> - auto PatchEnd = Patches.end();
> - for (const InputSection *IS : ISD.Sections) {
> - ISLimit = IS->OutSecOff + IS->getSize();
> - if (ISLimit > PatchUpperBound) {
> - while (PatchIt != PatchEnd) {
> - if ((*PatchIt)->getLDSTAddr() - OutSecAddr >= PrevISLimit)
> + auto patchIt = patches.begin();
> + auto patchEnd = patches.end();
> + for (const InputSection *isec : isd.sections) {
> + isecLimit = isec->outSecOff + isec->getSize();
> + if (isecLimit > patchUpperBound) {
> + while (patchIt != patchEnd) {
> + if ((*patchIt)->getLDSTAddr() - outSecAddr >= prevISLimit)
> break;
> - (*PatchIt)->OutSecOff = PrevISLimit;
> - ++PatchIt;
> + (*patchIt)->outSecOff = prevISLimit;
> + ++patchIt;
> }
> - PatchUpperBound = PrevISLimit +
> Target->getThunkSectionSpacing();
> + patchUpperBound = prevISLimit +
> target->getThunkSectionSpacing();
> }
> - PrevISLimit = ISLimit;
> + prevISLimit = isecLimit;
> }
> - for (; PatchIt != PatchEnd; ++PatchIt) {
> - (*PatchIt)->OutSecOff = ISLimit;
> + for (; patchIt != patchEnd; ++patchIt) {
> + (*patchIt)->outSecOff = isecLimit;
> }
>
> // merge all patch sections. We use the OutSecOff assigned above to
> // determine the insertion point. This is ok as we only merge into
> an
> // InputSectionDescription once per pass, and at the end of the pass
> // assignAddresses() will recalculate all the OutSecOff values.
> - std::vector<InputSection *> Tmp;
> - Tmp.reserve(ISD.Sections.size() + Patches.size());
> - auto MergeCmp = [](const InputSection *A, const InputSection *B) {
> - if (A->OutSecOff < B->OutSecOff)
> + std::vector<InputSection *> tmp;
> + tmp.reserve(isd.sections.size() + patches.size());
> + auto mergeCmp = [](const InputSection *a, const InputSection *b) {
> + if (a->outSecOff < b->outSecOff)
> return true;
> - if (A->OutSecOff == B->OutSecOff && isa<Patch843419Section>(A) &&
> - !isa<Patch843419Section>(B))
> + if (a->outSecOff == b->outSecOff && isa<Patch843419Section>(a) &&
> + !isa<Patch843419Section>(b))
> return true;
> return false;
> };
> - std::merge(ISD.Sections.begin(), ISD.Sections.end(),
> Patches.begin(),
> - Patches.end(), std::back_inserter(Tmp), MergeCmp);
> - ISD.Sections = std::move(Tmp);
> + std::merge(isd.sections.begin(), isd.sections.end(),
> patches.begin(),
> + patches.end(), std::back_inserter(tmp), mergeCmp);
> + isd.sections = std::move(tmp);
> }
>
> // Given an erratum sequence that starts at address AdrpAddr, with an
> // instruction that we need to patch at PatcheeOffset from the start
> of
> // InputSection IS, create a Patch843419 Section and add it to the
> // Patches that we need to insert.
> -static void implementPatch(uint64_t AdrpAddr, uint64_t PatcheeOffset,
> - InputSection *IS,
> - std::vector<Patch843419Section *>
> &Patches) {
> +static void implementPatch(uint64_t adrpAddr, uint64_t patcheeOffset,
> + InputSection *isec,
> + std::vector<Patch843419Section *>
> &patches) {
> // There may be a relocation at the same offset that we are
> patching. There
> // are four cases that we need to consider.
> // Case 1: R_AARCH64_JUMP26 branch relocation. We have already
> patched this
> @@ -551,29 +551,29 @@ static void implementPatch(uint64_t Adrp
> // and replace the relocation with a R_AARCH_JUMP26 branch
> relocation.
> // Case 4: No relocation. We must create a new R_AARCH64_JUMP26
> branch
> // relocation at the offset.
> - auto RelIt = llvm::find_if(IS->Relocations, [=](const Relocation
> &R) {
> - return R.Offset == PatcheeOffset;
> + auto relIt = llvm::find_if(isec->relocations, [=](const Relocation
> &r) {
> + return r.offset == patcheeOffset;
> });
> - if (RelIt != IS->Relocations.end() &&
> - (RelIt->Type == R_AARCH64_JUMP26 || RelIt->Expr ==
> R_RELAX_TLS_IE_TO_LE))
> + if (relIt != isec->relocations.end() &&
> + (relIt->type == R_AARCH64_JUMP26 || relIt->expr ==
> R_RELAX_TLS_IE_TO_LE))
> return;
>
> log("detected cortex-a53-843419 erratum sequence starting at " +
> - utohexstr(AdrpAddr) + " in unpatched output.");
> + utohexstr(adrpAddr) + " in unpatched output.");
>
> - auto *PS = make<Patch843419Section>(IS, PatcheeOffset);
> - Patches.push_back(PS);
> + auto *ps = make<Patch843419Section>(isec, patcheeOffset);
> + patches.push_back(ps);
>
> - auto MakeRelToPatch = [](uint64_t Offset, Symbol *PatchSym) {
> - return Relocation{R_PC, R_AARCH64_JUMP26, Offset, 0, PatchSym};
> + auto makeRelToPatch = [](uint64_t offset, Symbol *patchSym) {
> + return Relocation{R_PC, R_AARCH64_JUMP26, offset, 0, patchSym};
> };
>
> - if (RelIt != IS->Relocations.end()) {
> - PS->Relocations.push_back(
> - {RelIt->Expr, RelIt->Type, 0, RelIt->Addend, RelIt->Sym});
> - *RelIt = MakeRelToPatch(PatcheeOffset, PS->PatchSym);
> + if (relIt != isec->relocations.end()) {
> + ps->relocations.push_back(
> + {relIt->expr, relIt->type, 0, relIt->addend, relIt->sym});
> + *relIt = makeRelToPatch(patcheeOffset, ps->patchSym);
> } else
> - IS->Relocations.push_back(MakeRelToPatch(PatcheeOffset,
> PS->PatchSym));
> + isec->relocations.push_back(makeRelToPatch(patcheeOffset,
> ps->patchSym));
> }
>
> // Scan all the instructions in InputSectionDescription, for each
> instance of
> @@ -581,40 +581,40 @@ static void implementPatch(uint64_t Adrp
> // Patch843419Sections that need to be applied to ISD.
> std::vector<Patch843419Section *>
> AArch64Err843419Patcher::patchInputSectionDescription(
> - InputSectionDescription &ISD) {
> - std::vector<Patch843419Section *> Patches;
> - for (InputSection *IS : ISD.Sections) {
> + InputSectionDescription &isd) {
> + std::vector<Patch843419Section *> patches;
> + for (InputSection *isec : isd.sections) {
> // LLD doesn't use the erratum sequence in SyntheticSections.
> - if (isa<SyntheticSection>(IS))
> + if (isa<SyntheticSection>(isec))
> continue;
> // Use SectionMap to make sure we only scan code and not inline
> data.
> // We have already sorted MapSyms in ascending order and removed
> consecutive
> // mapping symbols of the same type. Our range of executable
> instructions to
> // scan is therefore [CodeSym->Value, DataSym->Value) or
> [CodeSym->Value,
> // section size).
> - std::vector<const Defined *> &MapSyms = SectionMap[IS];
> + std::vector<const Defined *> &mapSyms = sectionMap[isec];
>
> - auto CodeSym = llvm::find_if(MapSyms, [&](const Defined *MS) {
> - return MS->getName().startswith("$x");
> + auto codeSym = llvm::find_if(mapSyms, [&](const Defined *ms) {
> + return ms->getName().startswith("$x");
> });
>
> - while (CodeSym != MapSyms.end()) {
> - auto DataSym = std::next(CodeSym);
> - uint64_t Off = (*CodeSym)->Value;
> - uint64_t Limit =
> - (DataSym == MapSyms.end()) ? IS->data().size() :
> (*DataSym)->Value;
> -
> - while (Off < Limit) {
> - uint64_t StartAddr = IS->getVA(Off);
> - if (uint64_t PatcheeOffset = scanCortexA53Errata843419(IS,
> Off, Limit))
> - implementPatch(StartAddr, PatcheeOffset, IS, Patches);
> + while (codeSym != mapSyms.end()) {
> + auto dataSym = std::next(codeSym);
> + uint64_t off = (*codeSym)->value;
> + uint64_t limit =
> + (dataSym == mapSyms.end()) ? isec->data().size() :
> (*dataSym)->value;
> +
> + while (off < limit) {
> + uint64_t startAddr = isec->getVA(off);
> + if (uint64_t patcheeOffset = scanCortexA53Errata843419(isec,
> off, limit))
> + implementPatch(startAddr, patcheeOffset, isec, patches);
> }
> - if (DataSym == MapSyms.end())
> + if (dataSym == mapSyms.end())
> break;
> - CodeSym = std::next(DataSym);
> + codeSym = std::next(dataSym);
> }
> }
> - return Patches;
> + return patches;
> }
>
> // For each InputSectionDescription make one pass over the executable
> sections
> @@ -630,22 +630,22 @@ AArch64Err843419Patcher::patchInputSecti
> // Ouptut and Input Sections may have been changed.
> // Returns false if no patches were required and no changes were made.
> bool AArch64Err843419Patcher::createFixes() {
> - if (Initialized == false)
> + if (initialized == false)
> init();
>
> - bool AddressesChanged = false;
> - for (OutputSection *OS : OutputSections) {
> - if (!(OS->Flags & SHF_ALLOC) || !(OS->Flags & SHF_EXECINSTR))
> + bool addressesChanged = false;
> + for (OutputSection *os : outputSections) {
> + if (!(os->flags & SHF_ALLOC) || !(os->flags & SHF_EXECINSTR))
> continue;
> - for (BaseCommand *BC : OS->SectionCommands)
> - if (auto *ISD = dyn_cast<InputSectionDescription>(BC)) {
> - std::vector<Patch843419Section *> Patches =
> - patchInputSectionDescription(*ISD);
> - if (!Patches.empty()) {
> - insertPatches(*ISD, Patches);
> - AddressesChanged = true;
> + for (BaseCommand *bc : os->sectionCommands)
> + if (auto *isd = dyn_cast<InputSectionDescription>(bc)) {
> + std::vector<Patch843419Section *> patches =
> + patchInputSectionDescription(*isd);
> + if (!patches.empty()) {
> + insertPatches(*isd, patches);
> + addressesChanged = true;
> }
> }
> }
> - return AddressesChanged;
> + return addressesChanged;
> }
>
> Modified: lld/trunk/ELF/AArch64ErrataFix.h
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_AArch64ErrataFix.h-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=DunXNA51Ka7T3QRwJHC5nHWMUhAzYpv9XZhFxml81_U&e=
>
> ==============================================================================
> --- lld/trunk/ELF/AArch64ErrataFix.h (original)
> +++ lld/trunk/ELF/AArch64ErrataFix.h Tue Jul 9 22:00:37 2019
> @@ -29,19 +29,19 @@ public:
>
> private:
> std::vector<Patch843419Section *>
> - patchInputSectionDescription(InputSectionDescription &ISD);
> + patchInputSectionDescription(InputSectionDescription &isd);
>
> - void insertPatches(InputSectionDescription &ISD,
> - std::vector<Patch843419Section *> &Patches);
> + void insertPatches(InputSectionDescription &isd,
> + std::vector<Patch843419Section *> &patches);
>
> void init();
>
> // A cache of the mapping symbols defined by the InputSecion sorted
> in order
> // of ascending value with redundant symbols removed. These describe
> // the ranges of code and data in an executable InputSection.
> - std::map<InputSection *, std::vector<const Defined *>> SectionMap;
> + std::map<InputSection *, std::vector<const Defined *>> sectionMap;
>
> - bool Initialized = false;
> + bool initialized = false;
> };
>
> } // namespace elf
>
> Modified: lld/trunk/ELF/Arch/AArch64.cpp
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_Arch_AArch64.cpp-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=cRSmhekDLtI0tq-Xmu7wXoCPXBOsNVYV8Bp5bxj9iQg&e=
>
> ==============================================================================
> --- lld/trunk/ELF/Arch/AArch64.cpp (original)
> +++ lld/trunk/ELF/Arch/AArch64.cpp Tue Jul 9 22:00:37 2019
> @@ -23,59 +23,59 @@ using namespace lld::elf;
> // Page(Expr) is the page address of the expression Expr, defined
> // as (Expr & ~0xFFF). (This applies even if the machine page size
> // supported by the platform has a different value.)
> -uint64_t elf::getAArch64Page(uint64_t Expr) {
> - return Expr & ~static_cast<uint64_t>(0xFFF);
> +uint64_t elf::getAArch64Page(uint64_t expr) {
> + return expr & ~static_cast<uint64_t>(0xFFF);
> }
>
> namespace {
> class AArch64 : public TargetInfo {
> public:
> AArch64();
> - RelExpr getRelExpr(RelType Type, const Symbol &S,
> - const uint8_t *Loc) const override;
> - RelType getDynRel(RelType Type) const override;
> - void writeGotPlt(uint8_t *Buf, const Symbol &S) const override;
> - void writePltHeader(uint8_t *Buf) const override;
> - void writePlt(uint8_t *Buf, uint64_t GotPltEntryAddr, uint64_t
> PltEntryAddr,
> - int32_t Index, unsigned RelOff) const override;
> - bool needsThunk(RelExpr Expr, RelType Type, const InputFile *File,
> - uint64_t BranchAddr, const Symbol &S) const
> override;
> + RelExpr getRelExpr(RelType type, const Symbol &s,
> + const uint8_t *loc) const override;
> + RelType getDynRel(RelType type) const override;
> + void writeGotPlt(uint8_t *buf, const Symbol &s) const override;
> + void writePltHeader(uint8_t *buf) const override;
> + void writePlt(uint8_t *buf, uint64_t gotPltEntryAddr, uint64_t
> pltEntryAddr,
> + int32_t index, unsigned relOff) const override;
> + bool needsThunk(RelExpr expr, RelType type, const InputFile *file,
> + uint64_t branchAddr, const Symbol &s) const
> override;
> uint32_t getThunkSectionSpacing() const override;
> - bool inBranchRange(RelType Type, uint64_t Src, uint64_t Dst) const
> override;
> - bool usesOnlyLowPageBits(RelType Type) const override;
> - void relocateOne(uint8_t *Loc, RelType Type, uint64_t Val) const
> override;
> - RelExpr adjustRelaxExpr(RelType Type, const uint8_t *Data,
> - RelExpr Expr) const override;
> - void relaxTlsGdToLe(uint8_t *Loc, RelType Type, uint64_t Val) const
> override;
> - void relaxTlsGdToIe(uint8_t *Loc, RelType Type, uint64_t Val) const
> override;
> - void relaxTlsIeToLe(uint8_t *Loc, RelType Type, uint64_t Val) const
> override;
> + bool inBranchRange(RelType type, uint64_t src, uint64_t dst) const
> override;
> + bool usesOnlyLowPageBits(RelType type) const override;
> + void relocateOne(uint8_t *loc, RelType type, uint64_t val) const
> override;
> + RelExpr adjustRelaxExpr(RelType type, const uint8_t *data,
> + RelExpr expr) const override;
> + void relaxTlsGdToLe(uint8_t *loc, RelType type, uint64_t val) const
> override;
> + void relaxTlsGdToIe(uint8_t *loc, RelType type, uint64_t val) const
> override;
> + void relaxTlsIeToLe(uint8_t *loc, RelType type, uint64_t val) const
> override;
> };
> } // namespace
>
> AArch64::AArch64() {
> - CopyRel = R_AARCH64_COPY;
> - RelativeRel = R_AARCH64_RELATIVE;
> - IRelativeRel = R_AARCH64_IRELATIVE;
> - GotRel = R_AARCH64_GLOB_DAT;
> - NoneRel = R_AARCH64_NONE;
> - PltRel = R_AARCH64_JUMP_SLOT;
> - SymbolicRel = R_AARCH64_ABS64;
> - TlsDescRel = R_AARCH64_TLSDESC;
> - TlsGotRel = R_AARCH64_TLS_TPREL64;
> - PltEntrySize = 16;
> - PltHeaderSize = 32;
> - DefaultMaxPageSize = 65536;
> + copyRel = R_AARCH64_COPY;
> + relativeRel = R_AARCH64_RELATIVE;
> + iRelativeRel = R_AARCH64_IRELATIVE;
> + gotRel = R_AARCH64_GLOB_DAT;
> + noneRel = R_AARCH64_NONE;
> + pltRel = R_AARCH64_JUMP_SLOT;
> + symbolicRel = R_AARCH64_ABS64;
> + tlsDescRel = R_AARCH64_TLSDESC;
> + tlsGotRel = R_AARCH64_TLS_TPREL64;
> + pltEntrySize = 16;
> + pltHeaderSize = 32;
> + defaultMaxPageSize = 65536;
>
> // Align to the 2 MiB page size (known as a superpage or huge page).
> // FreeBSD automatically promotes 2 MiB-aligned allocations.
> - DefaultImageBase = 0x200000;
> + defaultImageBase = 0x200000;
>
> - NeedsThunks = true;
> + needsThunks = true;
> }
>
> -RelExpr AArch64::getRelExpr(RelType Type, const Symbol &S,
> - const uint8_t *Loc) const {
> - switch (Type) {
> +RelExpr AArch64::getRelExpr(RelType type, const Symbol &s,
> + const uint8_t *loc) const {
> + switch (type) {
> case R_AARCH64_TLSDESC_ADR_PAGE21:
> return R_AARCH64_TLSDESC_PAGE;
> case R_AARCH64_TLSDESC_LD64_LO12:
> @@ -117,18 +117,18 @@ RelExpr AArch64::getRelExpr(RelType Type
> }
> }
>
> -RelExpr AArch64::adjustRelaxExpr(RelType Type, const uint8_t *Data,
> - RelExpr Expr) const {
> - if (Expr == R_RELAX_TLS_GD_TO_IE) {
> - if (Type == R_AARCH64_TLSDESC_ADR_PAGE21)
> +RelExpr AArch64::adjustRelaxExpr(RelType type, const uint8_t *data,
> + RelExpr expr) const {
> + if (expr == R_RELAX_TLS_GD_TO_IE) {
> + if (type == R_AARCH64_TLSDESC_ADR_PAGE21)
> return R_AARCH64_RELAX_TLS_GD_TO_IE_PAGE_PC;
> return R_RELAX_TLS_GD_TO_IE_ABS;
> }
> - return Expr;
> + return expr;
> }
>
> -bool AArch64::usesOnlyLowPageBits(RelType Type) const {
> - switch (Type) {
> +bool AArch64::usesOnlyLowPageBits(RelType type) const {
> + switch (type) {
> default:
> return false;
> case R_AARCH64_ADD_ABS_LO12_NC:
> @@ -145,18 +145,18 @@ bool AArch64::usesOnlyLowPageBits(RelTyp
> }
> }
>
> -RelType AArch64::getDynRel(RelType Type) const {
> - if (Type == R_AARCH64_ABS64)
> - return Type;
> +RelType AArch64::getDynRel(RelType type) const {
> + if (type == R_AARCH64_ABS64)
> + return type;
> return R_AARCH64_NONE;
> }
>
> -void AArch64::writeGotPlt(uint8_t *Buf, const Symbol &) const {
> - write64le(Buf, In.Plt->getVA());
> +void AArch64::writeGotPlt(uint8_t *buf, const Symbol &) const {
> + write64le(buf, in.plt->getVA());
> }
>
> -void AArch64::writePltHeader(uint8_t *Buf) const {
> - const uint8_t PltData[] = {
> +void AArch64::writePltHeader(uint8_t *buf) const {
> + const uint8_t pltData[] = {
> 0xf0, 0x7b, 0xbf, 0xa9, // stp x16, x30, [sp,#-16]!
> 0x10, 0x00, 0x00, 0x90, // adrp x16, Page(&(.plt.got[2]))
> 0x11, 0x02, 0x40, 0xf9, // ldr x17, [x16,
> Offset(&(.plt.got[2]))]
> @@ -166,42 +166,42 @@ void AArch64::writePltHeader(uint8_t *Bu
> 0x1f, 0x20, 0x03, 0xd5, // nop
> 0x1f, 0x20, 0x03, 0xd5 // nop
> };
> - memcpy(Buf, PltData, sizeof(PltData));
> + memcpy(buf, pltData, sizeof(pltData));
>
> - uint64_t Got = In.GotPlt->getVA();
> - uint64_t Plt = In.Plt->getVA();
> - relocateOne(Buf + 4, R_AARCH64_ADR_PREL_PG_HI21,
> - getAArch64Page(Got + 16) - getAArch64Page(Plt + 4));
> - relocateOne(Buf + 8, R_AARCH64_LDST64_ABS_LO12_NC, Got + 16);
> - relocateOne(Buf + 12, R_AARCH64_ADD_ABS_LO12_NC, Got + 16);
> + uint64_t got = in.gotPlt->getVA();
> + uint64_t plt = in.plt->getVA();
> + relocateOne(buf + 4, R_AARCH64_ADR_PREL_PG_HI21,
> + getAArch64Page(got + 16) - getAArch64Page(plt + 4));
> + relocateOne(buf + 8, R_AARCH64_LDST64_ABS_LO12_NC, got + 16);
> + relocateOne(buf + 12, R_AARCH64_ADD_ABS_LO12_NC, got + 16);
> }
>
> -void AArch64::writePlt(uint8_t *Buf, uint64_t GotPltEntryAddr,
> - uint64_t PltEntryAddr, int32_t Index,
> - unsigned RelOff) const {
> - const uint8_t Inst[] = {
> +void AArch64::writePlt(uint8_t *buf, uint64_t gotPltEntryAddr,
> + uint64_t pltEntryAddr, int32_t index,
> + unsigned relOff) const {
> + const uint8_t inst[] = {
> 0x10, 0x00, 0x00, 0x90, // adrp x16, Page(&(.plt.got[n]))
> 0x11, 0x02, 0x40, 0xf9, // ldr x17, [x16,
> Offset(&(.plt.got[n]))]
> 0x10, 0x02, 0x00, 0x91, // add x16, x16, Offset(&(.plt.got[n]))
> 0x20, 0x02, 0x1f, 0xd6 // br x17
> };
> - memcpy(Buf, Inst, sizeof(Inst));
> + memcpy(buf, inst, sizeof(inst));
>
> - relocateOne(Buf, R_AARCH64_ADR_PREL_PG_HI21,
> - getAArch64Page(GotPltEntryAddr) -
> getAArch64Page(PltEntryAddr));
> - relocateOne(Buf + 4, R_AARCH64_LDST64_ABS_LO12_NC, GotPltEntryAddr);
> - relocateOne(Buf + 8, R_AARCH64_ADD_ABS_LO12_NC, GotPltEntryAddr);
> + relocateOne(buf, R_AARCH64_ADR_PREL_PG_HI21,
> + getAArch64Page(gotPltEntryAddr) -
> getAArch64Page(pltEntryAddr));
> + relocateOne(buf + 4, R_AARCH64_LDST64_ABS_LO12_NC, gotPltEntryAddr);
> + relocateOne(buf + 8, R_AARCH64_ADD_ABS_LO12_NC, gotPltEntryAddr);
> }
>
> -bool AArch64::needsThunk(RelExpr Expr, RelType Type, const InputFile
> *File,
> - uint64_t BranchAddr, const Symbol &S) const {
> +bool AArch64::needsThunk(RelExpr expr, RelType type, const InputFile
> *file,
> + uint64_t branchAddr, const Symbol &s) const {
> // ELF for the ARM 64-bit architecture, section Call and Jump
> relocations
> // only permits range extension thunks for R_AARCH64_CALL26 and
> // R_AARCH64_JUMP26 relocation types.
> - if (Type != R_AARCH64_CALL26 && Type != R_AARCH64_JUMP26)
> + if (type != R_AARCH64_CALL26 && type != R_AARCH64_JUMP26)
> return false;
> - uint64_t Dst = (Expr == R_PLT_PC) ? S.getPltVA() : S.getVA();
> - return !inBranchRange(Type, BranchAddr, Dst);
> + uint64_t dst = (expr == R_PLT_PC) ? s.getPltVA() : s.getVA();
> + return !inBranchRange(type, branchAddr, dst);
> }
>
> uint32_t AArch64::getThunkSectionSpacing() const {
> @@ -211,70 +211,70 @@ uint32_t AArch64::getThunkSectionSpacing
> return (128 * 1024 * 1024) - 0x30000;
> }
>
> -bool AArch64::inBranchRange(RelType Type, uint64_t Src, uint64_t Dst)
> const {
> - if (Type != R_AARCH64_CALL26 && Type != R_AARCH64_JUMP26)
> +bool AArch64::inBranchRange(RelType type, uint64_t src, uint64_t dst)
> const {
> + if (type != R_AARCH64_CALL26 && type != R_AARCH64_JUMP26)
> return true;
> // The AArch64 call and unconditional branch instructions have a
> range of
> // +/- 128 MiB.
> - uint64_t Range = 128 * 1024 * 1024;
> - if (Dst > Src) {
> + uint64_t range = 128 * 1024 * 1024;
> + if (dst > src) {
> // Immediate of branch is signed.
> - Range -= 4;
> - return Dst - Src <= Range;
> + range -= 4;
> + return dst - src <= range;
> }
> - return Src - Dst <= Range;
> + return src - dst <= range;
> }
>
> -static void write32AArch64Addr(uint8_t *L, uint64_t Imm) {
> - uint32_t ImmLo = (Imm & 0x3) << 29;
> - uint32_t ImmHi = (Imm & 0x1FFFFC) << 3;
> - uint64_t Mask = (0x3 << 29) | (0x1FFFFC << 3);
> - write32le(L, (read32le(L) & ~Mask) | ImmLo | ImmHi);
> +static void write32AArch64Addr(uint8_t *l, uint64_t imm) {
> + uint32_t immLo = (imm & 0x3) << 29;
> + uint32_t immHi = (imm & 0x1FFFFC) << 3;
> + uint64_t mask = (0x3 << 29) | (0x1FFFFC << 3);
> + write32le(l, (read32le(l) & ~mask) | immLo | immHi);
> }
>
> // Return the bits [Start, End] from Val shifted Start bits.
> // For instance, getBits(0xF0, 4, 8) returns 0xF.
> -static uint64_t getBits(uint64_t Val, int Start, int End) {
> - uint64_t Mask = ((uint64_t)1 << (End + 1 - Start)) - 1;
> - return (Val >> Start) & Mask;
> +static uint64_t getBits(uint64_t val, int start, int end) {
> + uint64_t mask = ((uint64_t)1 << (end + 1 - start)) - 1;
> + return (val >> start) & mask;
> }
>
> -static void or32le(uint8_t *P, int32_t V) { write32le(P, read32le(P)
> | V); }
> +static void or32le(uint8_t *p, int32_t v) { write32le(p, read32le(p)
> | v); }
>
> // Update the immediate field in a AARCH64 ldr, str, and add
> instruction.
> -static void or32AArch64Imm(uint8_t *L, uint64_t Imm) {
> - or32le(L, (Imm & 0xFFF) << 10);
> +static void or32AArch64Imm(uint8_t *l, uint64_t imm) {
> + or32le(l, (imm & 0xFFF) << 10);
> }
>
> -void AArch64::relocateOne(uint8_t *Loc, RelType Type, uint64_t Val)
> const {
> - switch (Type) {
> +void AArch64::relocateOne(uint8_t *loc, RelType type, uint64_t val)
> const {
> + switch (type) {
> case R_AARCH64_ABS16:
> case R_AARCH64_PREL16:
> - checkIntUInt(Loc, Val, 16, Type);
> - write16le(Loc, Val);
> + checkIntUInt(loc, val, 16, type);
> + write16le(loc, val);
> break;
> case R_AARCH64_ABS32:
> case R_AARCH64_PREL32:
> - checkIntUInt(Loc, Val, 32, Type);
> - write32le(Loc, Val);
> + checkIntUInt(loc, val, 32, type);
> + write32le(loc, val);
> break;
> case R_AARCH64_ABS64:
> case R_AARCH64_PREL64:
> - write64le(Loc, Val);
> + write64le(loc, val);
> break;
> case R_AARCH64_ADD_ABS_LO12_NC:
> - or32AArch64Imm(Loc, Val);
> + or32AArch64Imm(loc, val);
> break;
> case R_AARCH64_ADR_GOT_PAGE:
> case R_AARCH64_ADR_PREL_PG_HI21:
> case R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
> case R_AARCH64_TLSDESC_ADR_PAGE21:
> - checkInt(Loc, Val, 33, Type);
> - write32AArch64Addr(Loc, Val >> 12);
> + checkInt(loc, val, 33, type);
> + write32AArch64Addr(loc, val >> 12);
> break;
> case R_AARCH64_ADR_PREL_LO21:
> - checkInt(Loc, Val, 21, Type);
> - write32AArch64Addr(Loc, Val);
> + checkInt(loc, val, 21, type);
> + write32AArch64Addr(loc, val);
> break;
> case R_AARCH64_JUMP26:
> // Normally we would just write the bits of the immediate field,
> however
> @@ -284,75 +284,75 @@ void AArch64::relocateOne(uint8_t *Loc,
> // opcode and the immediate (0 001 | 01 imm26) we can do this
> // transformation by placing a R_AARCH64_JUMP26 relocation at the
> offset of
> // the instruction we want to patch.
> - write32le(Loc, 0x14000000);
> + write32le(loc, 0x14000000);
> LLVM_FALLTHROUGH;
> case R_AARCH64_CALL26:
> - checkInt(Loc, Val, 28, Type);
> - or32le(Loc, (Val & 0x0FFFFFFC) >> 2);
> + checkInt(loc, val, 28, type);
> + or32le(loc, (val & 0x0FFFFFFC) >> 2);
> break;
> case R_AARCH64_CONDBR19:
> case R_AARCH64_LD_PREL_LO19:
> - checkAlignment(Loc, Val, 4, Type);
> - checkInt(Loc, Val, 21, Type);
> - or32le(Loc, (Val & 0x1FFFFC) << 3);
> + checkAlignment(loc, val, 4, type);
> + checkInt(loc, val, 21, type);
> + or32le(loc, (val & 0x1FFFFC) << 3);
> break;
> case R_AARCH64_LDST8_ABS_LO12_NC:
> case R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC:
> - or32AArch64Imm(Loc, getBits(Val, 0, 11));
> + or32AArch64Imm(loc, getBits(val, 0, 11));
> break;
> case R_AARCH64_LDST16_ABS_LO12_NC:
> case R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC:
> - checkAlignment(Loc, Val, 2, Type);
> - or32AArch64Imm(Loc, getBits(Val, 1, 11));
> + checkAlignment(loc, val, 2, type);
> + or32AArch64Imm(loc, getBits(val, 1, 11));
> break;
> case R_AARCH64_LDST32_ABS_LO12_NC:
> case R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC:
> - checkAlignment(Loc, Val, 4, Type);
> - or32AArch64Imm(Loc, getBits(Val, 2, 11));
> + checkAlignment(loc, val, 4, type);
> + or32AArch64Imm(loc, getBits(val, 2, 11));
> break;
> case R_AARCH64_LDST64_ABS_LO12_NC:
> case R_AARCH64_LD64_GOT_LO12_NC:
> case R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
> case R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC:
> case R_AARCH64_TLSDESC_LD64_LO12:
> - checkAlignment(Loc, Val, 8, Type);
> - or32AArch64Imm(Loc, getBits(Val, 3, 11));
> + checkAlignment(loc, val, 8, type);
> + or32AArch64Imm(loc, getBits(val, 3, 11));
> break;
> case R_AARCH64_LDST128_ABS_LO12_NC:
> case R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC:
> - checkAlignment(Loc, Val, 16, Type);
> - or32AArch64Imm(Loc, getBits(Val, 4, 11));
> + checkAlignment(loc, val, 16, type);
> + or32AArch64Imm(loc, getBits(val, 4, 11));
> break;
> case R_AARCH64_MOVW_UABS_G0_NC:
> - or32le(Loc, (Val & 0xFFFF) << 5);
> + or32le(loc, (val & 0xFFFF) << 5);
> break;
> case R_AARCH64_MOVW_UABS_G1_NC:
> - or32le(Loc, (Val & 0xFFFF0000) >> 11);
> + or32le(loc, (val & 0xFFFF0000) >> 11);
> break;
> case R_AARCH64_MOVW_UABS_G2_NC:
> - or32le(Loc, (Val & 0xFFFF00000000) >> 27);
> + or32le(loc, (val & 0xFFFF00000000) >> 27);
> break;
> case R_AARCH64_MOVW_UABS_G3:
> - or32le(Loc, (Val & 0xFFFF000000000000) >> 43);
> + or32le(loc, (val & 0xFFFF000000000000) >> 43);
> break;
> case R_AARCH64_TSTBR14:
> - checkInt(Loc, Val, 16, Type);
> - or32le(Loc, (Val & 0xFFFC) << 3);
> + checkInt(loc, val, 16, type);
> + or32le(loc, (val & 0xFFFC) << 3);
> break;
> case R_AARCH64_TLSLE_ADD_TPREL_HI12:
> - checkUInt(Loc, Val, 24, Type);
> - or32AArch64Imm(Loc, Val >> 12);
> + checkUInt(loc, val, 24, type);
> + or32AArch64Imm(loc, val >> 12);
> break;
> case R_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
> case R_AARCH64_TLSDESC_ADD_LO12:
> - or32AArch64Imm(Loc, Val);
> + or32AArch64Imm(loc, val);
> break;
> default:
> - error(getErrorLocation(Loc) + "unrecognized relocation " +
> toString(Type));
> + error(getErrorLocation(loc) + "unrecognized relocation " +
> toString(type));
> }
> }
>
> -void AArch64::relaxTlsGdToLe(uint8_t *Loc, RelType Type, uint64_t
> Val) const {
> +void AArch64::relaxTlsGdToLe(uint8_t *loc, RelType type, uint64_t
> val) const {
> // TLSDESC Global-Dynamic relocation are in the form:
> // adrp x0, :tlsdesc:v
> [R_AARCH64_TLSDESC_ADR_PAGE21]
> // ldr x1, [x0, #:tlsdesc_lo12:v
> [R_AARCH64_TLSDESC_LD64_LO12]
> @@ -364,25 +364,25 @@ void AArch64::relaxTlsGdToLe(uint8_t *Lo
> // movk x0, #0x10
> // nop
> // nop
> - checkUInt(Loc, Val, 32, Type);
> + checkUInt(loc, val, 32, type);
>
> - switch (Type) {
> + switch (type) {
> case R_AARCH64_TLSDESC_ADD_LO12:
> case R_AARCH64_TLSDESC_CALL:
> - write32le(Loc, 0xd503201f); // nop
> + write32le(loc, 0xd503201f); // nop
> return;
> case R_AARCH64_TLSDESC_ADR_PAGE21:
> - write32le(Loc, 0xd2a00000 | (((Val >> 16) & 0xffff) << 5)); //
> movz
> + write32le(loc, 0xd2a00000 | (((val >> 16) & 0xffff) << 5)); //
> movz
> return;
> case R_AARCH64_TLSDESC_LD64_LO12:
> - write32le(Loc, 0xf2800000 | ((Val & 0xffff) << 5)); // movk
> + write32le(loc, 0xf2800000 | ((val & 0xffff) << 5)); // movk
> return;
> default:
> llvm_unreachable("unsupported relocation for TLS GD to LE
> relaxation");
> }
> }
>
> -void AArch64::relaxTlsGdToIe(uint8_t *Loc, RelType Type, uint64_t
> Val) const {
> +void AArch64::relaxTlsGdToIe(uint8_t *loc, RelType type, uint64_t
> val) const {
> // TLSDESC Global-Dynamic relocation are in the form:
> // adrp x0, :tlsdesc:v
> [R_AARCH64_TLSDESC_ADR_PAGE21]
> // ldr x1, [x0, #:tlsdesc_lo12:v
> [R_AARCH64_TLSDESC_LD64_LO12]
> @@ -395,37 +395,37 @@ void AArch64::relaxTlsGdToIe(uint8_t *Lo
> // nop
> // nop
>
> - switch (Type) {
> + switch (type) {
> case R_AARCH64_TLSDESC_ADD_LO12:
> case R_AARCH64_TLSDESC_CALL:
> - write32le(Loc, 0xd503201f); // nop
> + write32le(loc, 0xd503201f); // nop
> break;
> case R_AARCH64_TLSDESC_ADR_PAGE21:
> - write32le(Loc, 0x90000000); // adrp
> - relocateOne(Loc, R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21, Val);
> + write32le(loc, 0x90000000); // adrp
> + relocateOne(loc, R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21, val);
> break;
> case R_AARCH64_TLSDESC_LD64_LO12:
> - write32le(Loc, 0xf9400000); // ldr
> - relocateOne(Loc, R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC, Val);
> + write32le(loc, 0xf9400000); // ldr
> + relocateOne(loc, R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC, val);
> break;
> default:
> llvm_unreachable("unsupported relocation for TLS GD to LE
> relaxation");
> }
> }
>
> -void AArch64::relaxTlsIeToLe(uint8_t *Loc, RelType Type, uint64_t
> Val) const {
> - checkUInt(Loc, Val, 32, Type);
> +void AArch64::relaxTlsIeToLe(uint8_t *loc, RelType type, uint64_t
> val) const {
> + checkUInt(loc, val, 32, type);
>
> - if (Type == R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21) {
> + if (type == R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21) {
> // Generate MOVZ.
> - uint32_t RegNo = read32le(Loc) & 0x1f;
> - write32le(Loc, (0xd2a00000 | RegNo) | (((Val >> 16) & 0xffff) <<
> 5));
> + uint32_t regNo = read32le(loc) & 0x1f;
> + write32le(loc, (0xd2a00000 | regNo) | (((val >> 16) & 0xffff) <<
> 5));
> return;
> }
> - if (Type == R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC) {
> + if (type == R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC) {
> // Generate MOVK.
> - uint32_t RegNo = read32le(Loc) & 0x1f;
> - write32le(Loc, (0xf2800000 | RegNo) | ((Val & 0xffff) << 5));
> + uint32_t regNo = read32le(loc) & 0x1f;
> + write32le(loc, (0xf2800000 | regNo) | ((val & 0xffff) << 5));
> return;
> }
> llvm_unreachable("invalid relocation for TLS IE to LE relaxation");
> @@ -470,19 +470,19 @@ namespace {
> class AArch64BtiPac final : public AArch64 {
> public:
> AArch64BtiPac();
> - void writePltHeader(uint8_t *Buf) const override;
> - void writePlt(uint8_t *Buf, uint64_t GotPltEntryAddr, uint64_t
> PltEntryAddr,
> - int32_t Index, unsigned RelOff) const override;
> + void writePltHeader(uint8_t *buf) const override;
> + void writePlt(uint8_t *buf, uint64_t gotPltEntryAddr, uint64_t
> pltEntryAddr,
> + int32_t index, unsigned relOff) const override;
>
> private:
> - bool BtiHeader; // bti instruction needed in PLT Header
> - bool BtiEntry; // bti instruction needed in PLT Entry
> - bool PacEntry; // autia1716 instruction needed in PLT Entry
> + bool btiHeader; // bti instruction needed in PLT Header
> + bool btiEntry; // bti instruction needed in PLT Entry
> + bool pacEntry; // autia1716 instruction needed in PLT Entry
> };
> } // namespace
>
> AArch64BtiPac::AArch64BtiPac() {
> - BtiHeader = (Config->AndFeatures &
> GNU_PROPERTY_AARCH64_FEATURE_1_BTI);
> + btiHeader = (config->andFeatures &
> GNU_PROPERTY_AARCH64_FEATURE_1_BTI);
> // A BTI (Branch Target Indicator) Plt Entry is only required if the
> // address of the PLT entry can be taken by the program, which
> permits an
> // indirect jump to the PLT entry. This can happen when the address
> @@ -490,16 +490,16 @@ AArch64BtiPac::AArch64BtiPac() {
> // the function in an executable being taken by a shared library.
> // FIXME: There is a potential optimization to omit the BTI if we
> detect
> // that the address of the PLT entry isn't taken.
> - BtiEntry = BtiHeader && !Config->Shared;
> - PacEntry = (Config->AndFeatures &
> GNU_PROPERTY_AARCH64_FEATURE_1_PAC);
> + btiEntry = btiHeader && !config->shared;
> + pacEntry = (config->andFeatures &
> GNU_PROPERTY_AARCH64_FEATURE_1_PAC);
>
> - if (BtiEntry || PacEntry)
> - PltEntrySize = 24;
> + if (btiEntry || pacEntry)
> + pltEntrySize = 24;
> }
>
> -void AArch64BtiPac::writePltHeader(uint8_t *Buf) const {
> - const uint8_t BtiData[] = { 0x5f, 0x24, 0x03, 0xd5 }; // bti c
> - const uint8_t PltData[] = {
> +void AArch64BtiPac::writePltHeader(uint8_t *buf) const {
> + const uint8_t btiData[] = { 0x5f, 0x24, 0x03, 0xd5 }; // bti c
> + const uint8_t pltData[] = {
> 0xf0, 0x7b, 0xbf, 0xa9, // stp x16, x30, [sp,#-16]!
> 0x10, 0x00, 0x00, 0x90, // adrp x16, Page(&(.plt.got[2]))
> 0x11, 0x02, 0x40, 0xf9, // ldr x17, [x16,
> Offset(&(.plt.got[2]))]
> @@ -508,80 +508,80 @@ void AArch64BtiPac::writePltHeader(uint8
> 0x1f, 0x20, 0x03, 0xd5, // nop
> 0x1f, 0x20, 0x03, 0xd5 // nop
> };
> - const uint8_t NopData[] = { 0x1f, 0x20, 0x03, 0xd5 }; // nop
> + const uint8_t nopData[] = { 0x1f, 0x20, 0x03, 0xd5 }; // nop
>
> - uint64_t Got = In.GotPlt->getVA();
> - uint64_t Plt = In.Plt->getVA();
> + uint64_t got = in.gotPlt->getVA();
> + uint64_t plt = in.plt->getVA();
>
> - if (BtiHeader) {
> + if (btiHeader) {
> // PltHeader is called indirectly by Plt[N]. Prefix PltData with
> a BTI C
> // instruction.
> - memcpy(Buf, BtiData, sizeof(BtiData));
> - Buf += sizeof(BtiData);
> - Plt += sizeof(BtiData);
> - }
> - memcpy(Buf, PltData, sizeof(PltData));
> -
> - relocateOne(Buf + 4, R_AARCH64_ADR_PREL_PG_HI21,
> - getAArch64Page(Got + 16) - getAArch64Page(Plt + 8));
> - relocateOne(Buf + 8, R_AARCH64_LDST64_ABS_LO12_NC, Got + 16);
> - relocateOne(Buf + 12, R_AARCH64_ADD_ABS_LO12_NC, Got + 16);
> - if (!BtiHeader)
> + memcpy(buf, btiData, sizeof(btiData));
> + buf += sizeof(btiData);
> + plt += sizeof(btiData);
> + }
> + memcpy(buf, pltData, sizeof(pltData));
> +
> + relocateOne(buf + 4, R_AARCH64_ADR_PREL_PG_HI21,
> + getAArch64Page(got + 16) - getAArch64Page(plt + 8));
> + relocateOne(buf + 8, R_AARCH64_LDST64_ABS_LO12_NC, got + 16);
> + relocateOne(buf + 12, R_AARCH64_ADD_ABS_LO12_NC, got + 16);
> + if (!btiHeader)
> // We didn't add the BTI c instruction so round out size with NOP.
> - memcpy(Buf + sizeof(PltData), NopData, sizeof(NopData));
> + memcpy(buf + sizeof(pltData), nopData, sizeof(nopData));
> }
>
> -void AArch64BtiPac::writePlt(uint8_t *Buf, uint64_t GotPltEntryAddr,
> - uint64_t PltEntryAddr, int32_t Index,
> - unsigned RelOff) const {
> +void AArch64BtiPac::writePlt(uint8_t *buf, uint64_t gotPltEntryAddr,
> + uint64_t pltEntryAddr, int32_t index,
> + unsigned relOff) const {
> // The PLT entry is of the form:
> // [BtiData] AddrInst (PacBr | StdBr) [NopData]
> - const uint8_t BtiData[] = { 0x5f, 0x24, 0x03, 0xd5 }; // bti c
> - const uint8_t AddrInst[] = {
> + const uint8_t btiData[] = { 0x5f, 0x24, 0x03, 0xd5 }; // bti c
> + const uint8_t addrInst[] = {
> 0x10, 0x00, 0x00, 0x90, // adrp x16, Page(&(.plt.got[n]))
> 0x11, 0x02, 0x40, 0xf9, // ldr x17, [x16,
> Offset(&(.plt.got[n]))]
> 0x10, 0x02, 0x00, 0x91 // add x16, x16,
> Offset(&(.plt.got[n]))
> };
> - const uint8_t PacBr[] = {
> + const uint8_t pacBr[] = {
> 0x9f, 0x21, 0x03, 0xd5, // autia1716
> 0x20, 0x02, 0x1f, 0xd6 // br x17
> };
> - const uint8_t StdBr[] = {
> + const uint8_t stdBr[] = {
> 0x20, 0x02, 0x1f, 0xd6, // br x17
> 0x1f, 0x20, 0x03, 0xd5 // nop
> };
> - const uint8_t NopData[] = { 0x1f, 0x20, 0x03, 0xd5 }; // nop
> + const uint8_t nopData[] = { 0x1f, 0x20, 0x03, 0xd5 }; // nop
>
> - if (BtiEntry) {
> - memcpy(Buf, BtiData, sizeof(BtiData));
> - Buf += sizeof(BtiData);
> - PltEntryAddr += sizeof(BtiData);
> - }
> -
> - memcpy(Buf, AddrInst, sizeof(AddrInst));
> - relocateOne(Buf, R_AARCH64_ADR_PREL_PG_HI21,
> - getAArch64Page(GotPltEntryAddr) -
> - getAArch64Page(PltEntryAddr));
> - relocateOne(Buf + 4, R_AARCH64_LDST64_ABS_LO12_NC, GotPltEntryAddr);
> - relocateOne(Buf + 8, R_AARCH64_ADD_ABS_LO12_NC, GotPltEntryAddr);
> + if (btiEntry) {
> + memcpy(buf, btiData, sizeof(btiData));
> + buf += sizeof(btiData);
> + pltEntryAddr += sizeof(btiData);
> + }
> +
> + memcpy(buf, addrInst, sizeof(addrInst));
> + relocateOne(buf, R_AARCH64_ADR_PREL_PG_HI21,
> + getAArch64Page(gotPltEntryAddr) -
> + getAArch64Page(pltEntryAddr));
> + relocateOne(buf + 4, R_AARCH64_LDST64_ABS_LO12_NC, gotPltEntryAddr);
> + relocateOne(buf + 8, R_AARCH64_ADD_ABS_LO12_NC, gotPltEntryAddr);
>
> - if (PacEntry)
> - memcpy(Buf + sizeof(AddrInst), PacBr, sizeof(PacBr));
> + if (pacEntry)
> + memcpy(buf + sizeof(addrInst), pacBr, sizeof(pacBr));
> else
> - memcpy(Buf + sizeof(AddrInst), StdBr, sizeof(StdBr));
> - if (!BtiEntry)
> + memcpy(buf + sizeof(addrInst), stdBr, sizeof(stdBr));
> + if (!btiEntry)
> // We didn't add the BTI c instruction so round out size with NOP.
> - memcpy(Buf + sizeof(AddrInst) + sizeof(StdBr), NopData,
> sizeof(NopData));
> + memcpy(buf + sizeof(addrInst) + sizeof(stdBr), nopData,
> sizeof(nopData));
> }
>
> static TargetInfo *getTargetInfo() {
> - if (Config->AndFeatures & (GNU_PROPERTY_AARCH64_FEATURE_1_BTI |
> + if (config->andFeatures & (GNU_PROPERTY_AARCH64_FEATURE_1_BTI |
> GNU_PROPERTY_AARCH64_FEATURE_1_PAC)) {
> - static AArch64BtiPac T;
> - return &T;
> + static AArch64BtiPac t;
> + return &t;
> }
> - static AArch64 T;
> - return &T;
> + static AArch64 t;
> + return &t;
> }
>
> TargetInfo *elf::getAArch64TargetInfo() { return getTargetInfo(); }
>
> Modified: lld/trunk/ELF/Arch/AMDGPU.cpp
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_Arch_AMDGPU.cpp-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=0nrilnDnpb2HXTdixGYLQj29EnxWHn_gTUUPPNyjXjI&e=
>
> ==============================================================================
> --- lld/trunk/ELF/Arch/AMDGPU.cpp (original)
> +++ lld/trunk/ELF/Arch/AMDGPU.cpp Tue Jul 9 22:00:37 2019
> @@ -25,63 +25,63 @@ class AMDGPU final : public TargetInfo {
> public:
> AMDGPU();
> uint32_t calcEFlags() const override;
> - void relocateOne(uint8_t *Loc, RelType Type, uint64_t Val) const
> override;
> - RelExpr getRelExpr(RelType Type, const Symbol &S,
> - const uint8_t *Loc) const override;
> - RelType getDynRel(RelType Type) const override;
> + void relocateOne(uint8_t *loc, RelType type, uint64_t val) const
> override;
> + RelExpr getRelExpr(RelType type, const Symbol &s,
> + const uint8_t *loc) const override;
> + RelType getDynRel(RelType type) const override;
> };
> } // namespace
>
> AMDGPU::AMDGPU() {
> - RelativeRel = R_AMDGPU_RELATIVE64;
> - GotRel = R_AMDGPU_ABS64;
> - NoneRel = R_AMDGPU_NONE;
> - SymbolicRel = R_AMDGPU_ABS64;
> + relativeRel = R_AMDGPU_RELATIVE64;
> + gotRel = R_AMDGPU_ABS64;
> + noneRel = R_AMDGPU_NONE;
> + symbolicRel = R_AMDGPU_ABS64;
> }
>
> -static uint32_t getEFlags(InputFile *File) {
> - return cast<ObjFile<ELF64LE>>(File)->getObj().getHeader()->e_flags;
> +static uint32_t getEFlags(InputFile *file) {
> + return cast<ObjFile<ELF64LE>>(file)->getObj().getHeader()->e_flags;
> }
>
> uint32_t AMDGPU::calcEFlags() const {
> - assert(!ObjectFiles.empty());
> - uint32_t Ret = getEFlags(ObjectFiles[0]);
> + assert(!objectFiles.empty());
> + uint32_t ret = getEFlags(objectFiles[0]);
>
> // Verify that all input files have the same e_flags.
> - for (InputFile *F : makeArrayRef(ObjectFiles).slice(1)) {
> - if (Ret == getEFlags(F))
> + for (InputFile *f : makeArrayRef(objectFiles).slice(1)) {
> + if (ret == getEFlags(f))
> continue;
> - error("incompatible e_flags: " + toString(F));
> + error("incompatible e_flags: " + toString(f));
> return 0;
> }
> - return Ret;
> + return ret;
> }
>
> -void AMDGPU::relocateOne(uint8_t *Loc, RelType Type, uint64_t Val)
> const {
> - switch (Type) {
> +void AMDGPU::relocateOne(uint8_t *loc, RelType type, uint64_t val)
> const {
> + switch (type) {
> case R_AMDGPU_ABS32:
> case R_AMDGPU_GOTPCREL:
> case R_AMDGPU_GOTPCREL32_LO:
> case R_AMDGPU_REL32:
> case R_AMDGPU_REL32_LO:
> - write32le(Loc, Val);
> + write32le(loc, val);
> break;
> case R_AMDGPU_ABS64:
> case R_AMDGPU_REL64:
> - write64le(Loc, Val);
> + write64le(loc, val);
> break;
> case R_AMDGPU_GOTPCREL32_HI:
> case R_AMDGPU_REL32_HI:
> - write32le(Loc, Val >> 32);
> + write32le(loc, val >> 32);
> break;
> default:
> llvm_unreachable("unknown relocation");
> }
> }
>
> -RelExpr AMDGPU::getRelExpr(RelType Type, const Symbol &S,
> - const uint8_t *Loc) const {
> - switch (Type) {
> +RelExpr AMDGPU::getRelExpr(RelType type, const Symbol &s,
> + const uint8_t *loc) const {
> + switch (type) {
> case R_AMDGPU_ABS32:
> case R_AMDGPU_ABS64:
> return R_ABS;
> @@ -95,19 +95,19 @@ RelExpr AMDGPU::getRelExpr(RelType Type,
> case R_AMDGPU_GOTPCREL32_HI:
> return R_GOT_PC;
> default:
> - error(getErrorLocation(Loc) + "unknown relocation (" +
> Twine(Type) +
> - ") against symbol " + toString(S));
> + error(getErrorLocation(loc) + "unknown relocation (" +
> Twine(type) +
> + ") against symbol " + toString(s));
> return R_NONE;
> }
> }
>
> -RelType AMDGPU::getDynRel(RelType Type) const {
> - if (Type == R_AMDGPU_ABS64)
> - return Type;
> +RelType AMDGPU::getDynRel(RelType type) const {
> + if (type == R_AMDGPU_ABS64)
> + return type;
> return R_AMDGPU_NONE;
> }
>
> TargetInfo *elf::getAMDGPUTargetInfo() {
> - static AMDGPU Target;
> - return &Target;
> + static AMDGPU target;
> + return ⌖
> }
>
> Modified: lld/trunk/ELF/Arch/ARM.cpp
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_Arch_ARM.cpp-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=VBgAqeWff7sj2Gj00xkK5xSR24SKyuMR-sSBMHT7TiE&e=
>
> ==============================================================================
> --- lld/trunk/ELF/Arch/ARM.cpp (original)
> +++ lld/trunk/ELF/Arch/ARM.cpp Tue Jul 9 22:00:37 2019
> @@ -26,62 +26,62 @@ class ARM final : public TargetInfo {
> public:
> ARM();
> uint32_t calcEFlags() const override;
> - RelExpr getRelExpr(RelType Type, const Symbol &S,
> - const uint8_t *Loc) const override;
> - RelType getDynRel(RelType Type) const override;
> - int64_t getImplicitAddend(const uint8_t *Buf, RelType Type) const
> override;
> - void writeGotPlt(uint8_t *Buf, const Symbol &S) const override;
> - void writeIgotPlt(uint8_t *Buf, const Symbol &S) const override;
> - void writePltHeader(uint8_t *Buf) const override;
> - void writePlt(uint8_t *Buf, uint64_t GotPltEntryAddr, uint64_t
> PltEntryAddr,
> - int32_t Index, unsigned RelOff) const override;
> - void addPltSymbols(InputSection &IS, uint64_t Off) const override;
> - void addPltHeaderSymbols(InputSection &ISD) const override;
> - bool needsThunk(RelExpr Expr, RelType Type, const InputFile *File,
> - uint64_t BranchAddr, const Symbol &S) const
> override;
> + RelExpr getRelExpr(RelType type, const Symbol &s,
> + const uint8_t *loc) const override;
> + RelType getDynRel(RelType type) const override;
> + int64_t getImplicitAddend(const uint8_t *buf, RelType type) const
> override;
> + void writeGotPlt(uint8_t *buf, const Symbol &s) const override;
> + void writeIgotPlt(uint8_t *buf, const Symbol &s) const override;
> + void writePltHeader(uint8_t *buf) const override;
> + void writePlt(uint8_t *buf, uint64_t gotPltEntryAddr, uint64_t
> pltEntryAddr,
> + int32_t index, unsigned relOff) const override;
> + void addPltSymbols(InputSection &isec, uint64_t off) const override;
> + void addPltHeaderSymbols(InputSection &isd) const override;
> + bool needsThunk(RelExpr expr, RelType type, const InputFile *file,
> + uint64_t branchAddr, const Symbol &s) const
> override;
> uint32_t getThunkSectionSpacing() const override;
> - bool inBranchRange(RelType Type, uint64_t Src, uint64_t Dst) const
> override;
> - void relocateOne(uint8_t *Loc, RelType Type, uint64_t Val) const
> override;
> + bool inBranchRange(RelType type, uint64_t src, uint64_t dst) const
> override;
> + void relocateOne(uint8_t *loc, RelType type, uint64_t val) const
> override;
> };
> } // namespace
>
> ARM::ARM() {
> - CopyRel = R_ARM_COPY;
> - RelativeRel = R_ARM_RELATIVE;
> - IRelativeRel = R_ARM_IRELATIVE;
> - GotRel = R_ARM_GLOB_DAT;
> - NoneRel = R_ARM_NONE;
> - PltRel = R_ARM_JUMP_SLOT;
> - SymbolicRel = R_ARM_ABS32;
> - TlsGotRel = R_ARM_TLS_TPOFF32;
> - TlsModuleIndexRel = R_ARM_TLS_DTPMOD32;
> - TlsOffsetRel = R_ARM_TLS_DTPOFF32;
> - GotBaseSymInGotPlt = false;
> - PltEntrySize = 16;
> - PltHeaderSize = 32;
> - TrapInstr = {0xd4, 0xd4, 0xd4, 0xd4};
> - NeedsThunks = true;
> + copyRel = R_ARM_COPY;
> + relativeRel = R_ARM_RELATIVE;
> + iRelativeRel = R_ARM_IRELATIVE;
> + gotRel = R_ARM_GLOB_DAT;
> + noneRel = R_ARM_NONE;
> + pltRel = R_ARM_JUMP_SLOT;
> + symbolicRel = R_ARM_ABS32;
> + tlsGotRel = R_ARM_TLS_TPOFF32;
> + tlsModuleIndexRel = R_ARM_TLS_DTPMOD32;
> + tlsOffsetRel = R_ARM_TLS_DTPOFF32;
> + gotBaseSymInGotPlt = false;
> + pltEntrySize = 16;
> + pltHeaderSize = 32;
> + trapInstr = {0xd4, 0xd4, 0xd4, 0xd4};
> + needsThunks = true;
> }
>
> uint32_t ARM::calcEFlags() const {
> // The ABIFloatType is used by loaders to detect the floating point
> calling
> // convention.
> - uint32_t ABIFloatType = 0;
> - if (Config->ARMVFPArgs == ARMVFPArgKind::Base ||
> - Config->ARMVFPArgs == ARMVFPArgKind::Default)
> - ABIFloatType = EF_ARM_ABI_FLOAT_SOFT;
> - else if (Config->ARMVFPArgs == ARMVFPArgKind::VFP)
> - ABIFloatType = EF_ARM_ABI_FLOAT_HARD;
> + uint32_t abiFloatType = 0;
> + if (config->armVFPArgs == ARMVFPArgKind::Base ||
> + config->armVFPArgs == ARMVFPArgKind::Default)
> + abiFloatType = EF_ARM_ABI_FLOAT_SOFT;
> + else if (config->armVFPArgs == ARMVFPArgKind::VFP)
> + abiFloatType = EF_ARM_ABI_FLOAT_HARD;
>
> // We don't currently use any features incompatible with
> EF_ARM_EABI_VER5,
> // but we don't have any firm guarantees of conformance. Linux
> AArch64
> // kernels (as of 2016) require an EABI version to be set.
> - return EF_ARM_EABI_VER5 | ABIFloatType;
> + return EF_ARM_EABI_VER5 | abiFloatType;
> }
>
> -RelExpr ARM::getRelExpr(RelType Type, const Symbol &S,
> - const uint8_t *Loc) const {
> - switch (Type) {
> +RelExpr ARM::getRelExpr(RelType type, const Symbol &s,
> + const uint8_t *loc) const {
> + switch (type) {
> case R_ARM_THM_JUMP11:
> return R_PC;
> case R_ARM_CALL:
> @@ -106,11 +106,11 @@ RelExpr ARM::getRelExpr(RelType Type, co
> case R_ARM_SBREL32:
> return R_ARM_SBREL;
> case R_ARM_TARGET1:
> - return Config->Target1Rel ? R_PC : R_ABS;
> + return config->target1Rel ? R_PC : R_ABS;
> case R_ARM_TARGET2:
> - if (Config->Target2 == Target2Policy::Rel)
> + if (config->target2 == Target2Policy::Rel)
> return R_PC;
> - if (Config->Target2 == Target2Policy::Abs)
> + if (config->target2 == Target2Policy::Abs)
> return R_ABS;
> return R_GOT_PC;
> case R_ARM_TLS_GD32:
> @@ -143,25 +143,25 @@ RelExpr ARM::getRelExpr(RelType Type, co
> }
> }
>
> -RelType ARM::getDynRel(RelType Type) const {
> - if ((Type == R_ARM_ABS32) || (Type == R_ARM_TARGET1 &&
> !Config->Target1Rel))
> +RelType ARM::getDynRel(RelType type) const {
> + if ((type == R_ARM_ABS32) || (type == R_ARM_TARGET1 &&
> !config->target1Rel))
> return R_ARM_ABS32;
> return R_ARM_NONE;
> }
>
> -void ARM::writeGotPlt(uint8_t *Buf, const Symbol &) const {
> - write32le(Buf, In.Plt->getVA());
> +void ARM::writeGotPlt(uint8_t *buf, const Symbol &) const {
> + write32le(buf, in.plt->getVA());
> }
>
> -void ARM::writeIgotPlt(uint8_t *Buf, const Symbol &S) const {
> +void ARM::writeIgotPlt(uint8_t *buf, const Symbol &s) const {
> // An ARM entry is the address of the ifunc resolver function.
> - write32le(Buf, S.getVA());
> + write32le(buf, s.getVA());
> }
>
> // Long form PLT Header that does not have any restrictions on the
> displacement
> // of the .plt from the .plt.got.
> -static void writePltHeaderLong(uint8_t *Buf) {
> - const uint8_t PltData[] = {
> +static void writePltHeaderLong(uint8_t *buf) {
> + const uint8_t pltData[] = {
> 0x04, 0xe0, 0x2d, 0xe5, // str lr, [sp,#-4]!
> 0x04, 0xe0, 0x9f, 0xe5, // ldr lr, L2
> 0x0e, 0xe0, 0x8f, 0xe0, // L1: add lr, pc, lr
> @@ -170,128 +170,128 @@ static void writePltHeaderLong(uint8_t *
> 0xd4, 0xd4, 0xd4, 0xd4, // Pad to 32-byte boundary
> 0xd4, 0xd4, 0xd4, 0xd4, // Pad to 32-byte boundary
> 0xd4, 0xd4, 0xd4, 0xd4};
> - memcpy(Buf, PltData, sizeof(PltData));
> - uint64_t GotPlt = In.GotPlt->getVA();
> - uint64_t L1 = In.Plt->getVA() + 8;
> - write32le(Buf + 16, GotPlt - L1 - 8);
> + memcpy(buf, pltData, sizeof(pltData));
> + uint64_t gotPlt = in.gotPlt->getVA();
> + uint64_t l1 = in.plt->getVA() + 8;
> + write32le(buf + 16, gotPlt - l1 - 8);
> }
>
> // The default PLT header requires the .plt.got to be within 128 Mb
> of the
> // .plt in the positive direction.
> -void ARM::writePltHeader(uint8_t *Buf) const {
> +void ARM::writePltHeader(uint8_t *buf) const {
> // Use a similar sequence to that in writePlt(), the difference is
> the calling
> // conventions mean we use lr instead of ip. The PLT entry is
> responsible for
> // saving lr on the stack, the dynamic loader is responsible for
> reloading
> // it.
> - const uint32_t PltData[] = {
> + const uint32_t pltData[] = {
> 0xe52de004, // L1: str lr, [sp,#-4]!
> 0xe28fe600, // add lr, pc, #0x0NN00000 &(.got.plt - L1 - 4)
> 0xe28eea00, // add lr, lr, #0x000NN000 &(.got.plt - L1 - 4)
> 0xe5bef000, // ldr pc, [lr, #0x00000NNN] &(.got.plt -L1 - 4)
> };
>
> - uint64_t Offset = In.GotPlt->getVA() - In.Plt->getVA() - 4;
> - if (!llvm::isUInt<27>(Offset)) {
> + uint64_t offset = in.gotPlt->getVA() - in.plt->getVA() - 4;
> + if (!llvm::isUInt<27>(offset)) {
> // We cannot encode the Offset, use the long form.
> - writePltHeaderLong(Buf);
> + writePltHeaderLong(buf);
> return;
> }
> - write32le(Buf + 0, PltData[0]);
> - write32le(Buf + 4, PltData[1] | ((Offset >> 20) & 0xff));
> - write32le(Buf + 8, PltData[2] | ((Offset >> 12) & 0xff));
> - write32le(Buf + 12, PltData[3] | (Offset & 0xfff));
> - memcpy(Buf + 16, TrapInstr.data(), 4); // Pad to 32-byte boundary
> - memcpy(Buf + 20, TrapInstr.data(), 4);
> - memcpy(Buf + 24, TrapInstr.data(), 4);
> - memcpy(Buf + 28, TrapInstr.data(), 4);
> + write32le(buf + 0, pltData[0]);
> + write32le(buf + 4, pltData[1] | ((offset >> 20) & 0xff));
> + write32le(buf + 8, pltData[2] | ((offset >> 12) & 0xff));
> + write32le(buf + 12, pltData[3] | (offset & 0xfff));
> + memcpy(buf + 16, trapInstr.data(), 4); // Pad to 32-byte boundary
> + memcpy(buf + 20, trapInstr.data(), 4);
> + memcpy(buf + 24, trapInstr.data(), 4);
> + memcpy(buf + 28, trapInstr.data(), 4);
> }
>
> -void ARM::addPltHeaderSymbols(InputSection &IS) const {
> - addSyntheticLocal("$a", STT_NOTYPE, 0, 0, IS);
> - addSyntheticLocal("$d", STT_NOTYPE, 16, 0, IS);
> +void ARM::addPltHeaderSymbols(InputSection &isec) const {
> + addSyntheticLocal("$a", STT_NOTYPE, 0, 0, isec);
> + addSyntheticLocal("$d", STT_NOTYPE, 16, 0, isec);
> }
>
> // Long form PLT entries that do not have any restrictions on the
> displacement
> // of the .plt from the .plt.got.
> -static void writePltLong(uint8_t *Buf, uint64_t GotPltEntryAddr,
> - uint64_t PltEntryAddr, int32_t Index,
> - unsigned RelOff) {
> - const uint8_t PltData[] = {
> +static void writePltLong(uint8_t *buf, uint64_t gotPltEntryAddr,
> + uint64_t pltEntryAddr, int32_t index,
> + unsigned relOff) {
> + const uint8_t pltData[] = {
> 0x04, 0xc0, 0x9f, 0xe5, // ldr ip, L2
> 0x0f, 0xc0, 0x8c, 0xe0, // L1: add ip, ip, pc
> 0x00, 0xf0, 0x9c, 0xe5, // ldr pc, [ip]
> 0x00, 0x00, 0x00, 0x00, // L2: .word Offset(&(.plt.got) - L1
> - 8
> };
> - memcpy(Buf, PltData, sizeof(PltData));
> - uint64_t L1 = PltEntryAddr + 4;
> - write32le(Buf + 12, GotPltEntryAddr - L1 - 8);
> + memcpy(buf, pltData, sizeof(pltData));
> + uint64_t l1 = pltEntryAddr + 4;
> + write32le(buf + 12, gotPltEntryAddr - l1 - 8);
> }
>
> // The default PLT entries require the .plt.got to be within 128 Mb
> of the
> // .plt in the positive direction.
> -void ARM::writePlt(uint8_t *Buf, uint64_t GotPltEntryAddr,
> - uint64_t PltEntryAddr, int32_t Index,
> - unsigned RelOff) const {
> +void ARM::writePlt(uint8_t *buf, uint64_t gotPltEntryAddr,
> + uint64_t pltEntryAddr, int32_t index,
> + unsigned relOff) const {
> // The PLT entry is similar to the example given in Appendix A of
> ELF for
> // the Arm Architecture. Instead of using the Group Relocations to
> find the
> // optimal rotation for the 8-bit immediate used in the add
> instructions we
> // hard code the most compact rotations for simplicity. This saves
> a load
> // instruction over the long plt sequences.
> - const uint32_t PltData[] = {
> + const uint32_t pltData[] = {
> 0xe28fc600, // L1: add ip, pc, #0x0NN00000 Offset(&(.plt.got)
> - L1 - 8
> 0xe28cca00, // add ip, ip, #0x000NN000 Offset(&(.plt.got)
> - L1 - 8
> 0xe5bcf000, // ldr pc, [ip, #0x00000NNN] Offset(&(.plt.got)
> - L1 - 8
> };
>
> - uint64_t Offset = GotPltEntryAddr - PltEntryAddr - 8;
> - if (!llvm::isUInt<27>(Offset)) {
> + uint64_t offset = gotPltEntryAddr - pltEntryAddr - 8;
> + if (!llvm::isUInt<27>(offset)) {
> // We cannot encode the Offset, use the long form.
> - writePltLong(Buf, GotPltEntryAddr, PltEntryAddr, Index, RelOff);
> + writePltLong(buf, gotPltEntryAddr, pltEntryAddr, index, relOff);
> return;
> }
> - write32le(Buf + 0, PltData[0] | ((Offset >> 20) & 0xff));
> - write32le(Buf + 4, PltData[1] | ((Offset >> 12) & 0xff));
> - write32le(Buf + 8, PltData[2] | (Offset & 0xfff));
> - memcpy(Buf + 12, TrapInstr.data(), 4); // Pad to 16-byte boundary
> + write32le(buf + 0, pltData[0] | ((offset >> 20) & 0xff));
> + write32le(buf + 4, pltData[1] | ((offset >> 12) & 0xff));
> + write32le(buf + 8, pltData[2] | (offset & 0xfff));
> + memcpy(buf + 12, trapInstr.data(), 4); // Pad to 16-byte boundary
> }
>
> -void ARM::addPltSymbols(InputSection &IS, uint64_t Off) const {
> - addSyntheticLocal("$a", STT_NOTYPE, Off, 0, IS);
> - addSyntheticLocal("$d", STT_NOTYPE, Off + 12, 0, IS);
> +void ARM::addPltSymbols(InputSection &isec, uint64_t off) const {
> + addSyntheticLocal("$a", STT_NOTYPE, off, 0, isec);
> + addSyntheticLocal("$d", STT_NOTYPE, off + 12, 0, isec);
> }
>
> -bool ARM::needsThunk(RelExpr Expr, RelType Type, const InputFile
> *File,
> - uint64_t BranchAddr, const Symbol &S) const {
> +bool ARM::needsThunk(RelExpr expr, RelType type, const InputFile
> *file,
> + uint64_t branchAddr, const Symbol &s) const {
> // If S is an undefined weak symbol and does not have a PLT entry
> then it
> // will be resolved as a branch to the next instruction.
> - if (S.isUndefWeak() && !S.isInPlt())
> + if (s.isUndefWeak() && !s.isInPlt())
> return false;
> // A state change from ARM to Thumb and vice versa must go through
> an
> // interworking thunk if the relocation type is not R_ARM_CALL or
> // R_ARM_THM_CALL.
> - switch (Type) {
> + switch (type) {
> case R_ARM_PC24:
> case R_ARM_PLT32:
> case R_ARM_JUMP24:
> // Source is ARM, all PLT entries are ARM so no interworking
> required.
> // Otherwise we need to interwork if Symbol has bit 0 set (Thumb).
> - if (Expr == R_PC && ((S.getVA() & 1) == 1))
> + if (expr == R_PC && ((s.getVA() & 1) == 1))
> return true;
> LLVM_FALLTHROUGH;
> case R_ARM_CALL: {
> - uint64_t Dst = (Expr == R_PLT_PC) ? S.getPltVA() : S.getVA();
> - return !inBranchRange(Type, BranchAddr, Dst);
> + uint64_t dst = (expr == R_PLT_PC) ? s.getPltVA() : s.getVA();
> + return !inBranchRange(type, branchAddr, dst);
> }
> case R_ARM_THM_JUMP19:
> case R_ARM_THM_JUMP24:
> // Source is Thumb, all PLT entries are ARM so interworking is
> required.
> // Otherwise we need to interwork if Symbol has bit 0 clear (ARM).
> - if (Expr == R_PLT_PC || ((S.getVA() & 1) == 0))
> + if (expr == R_PLT_PC || ((s.getVA() & 1) == 0))
> return true;
> LLVM_FALLTHROUGH;
> case R_ARM_THM_CALL: {
> - uint64_t Dst = (Expr == R_PLT_PC) ? S.getPltVA() : S.getVA();
> - return !inBranchRange(Type, BranchAddr, Dst);
> + uint64_t dst = (expr == R_PLT_PC) ? s.getPltVA() : s.getVA();
> + return !inBranchRange(type, branchAddr, dst);
> }
> }
> return false;
> @@ -327,55 +327,55 @@ uint32_t ARM::getThunkSectionSpacing() c
> // range. On earlier Architectures such as ARMv4, ARMv5 and ARMv6
> (except
> // ARMv6T2) the range is +/- 4MiB.
>
> - return (Config->ARMJ1J2BranchEncoding) ? 0x1000000 - 0x30000
> + return (config->armJ1J2BranchEncoding) ? 0x1000000 - 0x30000
> : 0x400000 - 0x7500;
> }
>
> -bool ARM::inBranchRange(RelType Type, uint64_t Src, uint64_t Dst)
> const {
> - uint64_t Range;
> - uint64_t InstrSize;
> +bool ARM::inBranchRange(RelType type, uint64_t src, uint64_t dst)
> const {
> + uint64_t range;
> + uint64_t instrSize;
>
> - switch (Type) {
> + switch (type) {
> case R_ARM_PC24:
> case R_ARM_PLT32:
> case R_ARM_JUMP24:
> case R_ARM_CALL:
> - Range = 0x2000000;
> - InstrSize = 4;
> + range = 0x2000000;
> + instrSize = 4;
> break;
> case R_ARM_THM_JUMP19:
> - Range = 0x100000;
> - InstrSize = 2;
> + range = 0x100000;
> + instrSize = 2;
> break;
> case R_ARM_THM_JUMP24:
> case R_ARM_THM_CALL:
> - Range = Config->ARMJ1J2BranchEncoding ? 0x1000000 : 0x400000;
> - InstrSize = 2;
> + range = config->armJ1J2BranchEncoding ? 0x1000000 : 0x400000;
> + instrSize = 2;
> break;
> default:
> return true;
> }
> // PC at Src is 2 instructions ahead, immediate of branch is signed
> - if (Src > Dst)
> - Range -= 2 * InstrSize;
> + if (src > dst)
> + range -= 2 * instrSize;
> else
> - Range += InstrSize;
> + range += instrSize;
>
> - if ((Dst & 0x1) == 0)
> + if ((dst & 0x1) == 0)
> // Destination is ARM, if ARM caller then Src is already 4-byte
> aligned.
> // If Thumb Caller (BLX) the Src address has bottom 2 bits
> cleared to ensure
> // destination will be 4 byte aligned.
> - Src &= ~0x3;
> + src &= ~0x3;
> else
> // Bit 0 == 1 denotes Thumb state, it is not part of the range
> - Dst &= ~0x1;
> + dst &= ~0x1;
>
> - uint64_t Distance = (Src > Dst) ? Src - Dst : Dst - Src;
> - return Distance <= Range;
> + uint64_t distance = (src > dst) ? src - dst : dst - src;
> + return distance <= range;
> }
>
> -void ARM::relocateOne(uint8_t *Loc, RelType Type, uint64_t Val) const
> {
> - switch (Type) {
> +void ARM::relocateOne(uint8_t *loc, RelType type, uint64_t val) const
> {
> + switch (type) {
> case R_ARM_ABS32:
> case R_ARM_BASE_PREL:
> case R_ARM_GOTOFF32:
> @@ -393,132 +393,132 @@ void ARM::relocateOne(uint8_t *Loc, RelT
> case R_ARM_TLS_LE32:
> case R_ARM_TLS_TPOFF32:
> case R_ARM_TLS_DTPOFF32:
> - write32le(Loc, Val);
> + write32le(loc, val);
> break;
> case R_ARM_PREL31:
> - checkInt(Loc, Val, 31, Type);
> - write32le(Loc, (read32le(Loc) & 0x80000000) | (Val &
> ~0x80000000));
> + checkInt(loc, val, 31, type);
> + write32le(loc, (read32le(loc) & 0x80000000) | (val &
> ~0x80000000));
> break;
> case R_ARM_CALL:
> // R_ARM_CALL is used for BL and BLX instructions, depending on
> the
> // value of bit 0 of Val, we must select a BL or BLX instruction
> - if (Val & 1) {
> + if (val & 1) {
> // If bit 0 of Val is 1 the target is Thumb, we must select a
> BLX.
> // The BLX encoding is 0xfa:H:imm24 where Val = imm24:H:'1'
> - checkInt(Loc, Val, 26, Type);
> - write32le(Loc, 0xfa000000 | // opcode
> - ((Val & 2) << 23) | // H
> - ((Val >> 2) & 0x00ffffff)); // imm24
> + checkInt(loc, val, 26, type);
> + write32le(loc, 0xfa000000 | // opcode
> + ((val & 2) << 23) | // H
> + ((val >> 2) & 0x00ffffff)); // imm24
> break;
> }
> - if ((read32le(Loc) & 0xfe000000) == 0xfa000000)
> + if ((read32le(loc) & 0xfe000000) == 0xfa000000)
> // BLX (always unconditional) instruction to an ARM Target,
> select an
> // unconditional BL.
> - write32le(Loc, 0xeb000000 | (read32le(Loc) & 0x00ffffff));
> + write32le(loc, 0xeb000000 | (read32le(loc) & 0x00ffffff));
> // fall through as BL encoding is shared with B
> LLVM_FALLTHROUGH;
> case R_ARM_JUMP24:
> case R_ARM_PC24:
> case R_ARM_PLT32:
> - checkInt(Loc, Val, 26, Type);
> - write32le(Loc, (read32le(Loc) & ~0x00ffffff) | ((Val >> 2) &
> 0x00ffffff));
> + checkInt(loc, val, 26, type);
> + write32le(loc, (read32le(loc) & ~0x00ffffff) | ((val >> 2) &
> 0x00ffffff));
> break;
> case R_ARM_THM_JUMP11:
> - checkInt(Loc, Val, 12, Type);
> - write16le(Loc, (read32le(Loc) & 0xf800) | ((Val >> 1) & 0x07ff));
> + checkInt(loc, val, 12, type);
> + write16le(loc, (read32le(loc) & 0xf800) | ((val >> 1) & 0x07ff));
> break;
> case R_ARM_THM_JUMP19:
> // Encoding T3: Val = S:J2:J1:imm6:imm11:0
> - checkInt(Loc, Val, 21, Type);
> - write16le(Loc,
> - (read16le(Loc) & 0xfbc0) | // opcode cond
> - ((Val >> 10) & 0x0400) | // S
> - ((Val >> 12) & 0x003f)); // imm6
> - write16le(Loc + 2,
> + checkInt(loc, val, 21, type);
> + write16le(loc,
> + (read16le(loc) & 0xfbc0) | // opcode cond
> + ((val >> 10) & 0x0400) | // S
> + ((val >> 12) & 0x003f)); // imm6
> + write16le(loc + 2,
> 0x8000 | // opcode
> - ((Val >> 8) & 0x0800) | // J2
> - ((Val >> 5) & 0x2000) | // J1
> - ((Val >> 1) & 0x07ff)); // imm11
> + ((val >> 8) & 0x0800) | // J2
> + ((val >> 5) & 0x2000) | // J1
> + ((val >> 1) & 0x07ff)); // imm11
> break;
> case R_ARM_THM_CALL:
> // R_ARM_THM_CALL is used for BL and BLX instructions, depending
> on the
> // value of bit 0 of Val, we must select a BL or BLX instruction
> - if ((Val & 1) == 0) {
> + if ((val & 1) == 0) {
> // Ensure BLX destination is 4-byte aligned. As BLX instruction
> may
> // only be two byte aligned. This must be done before overflow
> check
> - Val = alignTo(Val, 4);
> + val = alignTo(val, 4);
> }
> // Bit 12 is 0 for BLX, 1 for BL
> - write16le(Loc + 2, (read16le(Loc + 2) & ~0x1000) | (Val & 1) <<
> 12);
> - if (!Config->ARMJ1J2BranchEncoding) {
> + write16le(loc + 2, (read16le(loc + 2) & ~0x1000) | (val & 1) <<
> 12);
> + if (!config->armJ1J2BranchEncoding) {
> // Older Arm architectures do not support R_ARM_THM_JUMP24 and
> have
> // different encoding rules and range due to J1 and J2 always
> being 1.
> - checkInt(Loc, Val, 23, Type);
> - write16le(Loc,
> + checkInt(loc, val, 23, type);
> + write16le(loc,
> 0xf000 | // opcode
> - ((Val >> 12) & 0x07ff)); // imm11
> - write16le(Loc + 2,
> - (read16le(Loc + 2) & 0xd000) | // opcode
> + ((val >> 12) & 0x07ff)); // imm11
> + write16le(loc + 2,
> + (read16le(loc + 2) & 0xd000) | // opcode
> 0x2800 | // J1 == J2 == 1
> - ((Val >> 1) & 0x07ff)); // imm11
> + ((val >> 1) & 0x07ff)); // imm11
> break;
> }
> // Fall through as rest of encoding is the same as B.W
> LLVM_FALLTHROUGH;
> case R_ARM_THM_JUMP24:
> // Encoding B T4, BL T1, BLX T2: Val = S:I1:I2:imm10:imm11:0
> - checkInt(Loc, Val, 25, Type);
> - write16le(Loc,
> + checkInt(loc, val, 25, type);
> + write16le(loc,
> 0xf000 | // opcode
> - ((Val >> 14) & 0x0400) | // S
> - ((Val >> 12) & 0x03ff)); // imm10
> - write16le(Loc + 2,
> - (read16le(Loc + 2) & 0xd000) | //
> opcode
> - (((~(Val >> 10)) ^ (Val >> 11)) & 0x2000) | // J1
> - (((~(Val >> 11)) ^ (Val >> 13)) & 0x0800) | // J2
> - ((Val >> 1) & 0x07ff)); // imm11
> + ((val >> 14) & 0x0400) | // S
> + ((val >> 12) & 0x03ff)); // imm10
> + write16le(loc + 2,
> + (read16le(loc + 2) & 0xd000) | //
> opcode
> + (((~(val >> 10)) ^ (val >> 11)) & 0x2000) | // J1
> + (((~(val >> 11)) ^ (val >> 13)) & 0x0800) | // J2
> + ((val >> 1) & 0x07ff)); // imm11
> break;
> case R_ARM_MOVW_ABS_NC:
> case R_ARM_MOVW_PREL_NC:
> - write32le(Loc, (read32le(Loc) & ~0x000f0fff) | ((Val & 0xf000) <<
> 4) |
> - (Val & 0x0fff));
> + write32le(loc, (read32le(loc) & ~0x000f0fff) | ((val & 0xf000) <<
> 4) |
> + (val & 0x0fff));
> break;
> case R_ARM_MOVT_ABS:
> case R_ARM_MOVT_PREL:
> - write32le(Loc, (read32le(Loc) & ~0x000f0fff) |
> - (((Val >> 16) & 0xf000) << 4) | ((Val >> 16) &
> 0xfff));
> + write32le(loc, (read32le(loc) & ~0x000f0fff) |
> + (((val >> 16) & 0xf000) << 4) | ((val >> 16) &
> 0xfff));
> break;
> case R_ARM_THM_MOVT_ABS:
> case R_ARM_THM_MOVT_PREL:
> // Encoding T1: A = imm4:i:imm3:imm8
> - write16le(Loc,
> + write16le(loc,
> 0xf2c0 | // opcode
> - ((Val >> 17) & 0x0400) | // i
> - ((Val >> 28) & 0x000f)); // imm4
> - write16le(Loc + 2,
> - (read16le(Loc + 2) & 0x8f00) | // opcode
> - ((Val >> 12) & 0x7000) | // imm3
> - ((Val >> 16) & 0x00ff)); // imm8
> + ((val >> 17) & 0x0400) | // i
> + ((val >> 28) & 0x000f)); // imm4
> + write16le(loc + 2,
> + (read16le(loc + 2) & 0x8f00) | // opcode
> + ((val >> 12) & 0x7000) | // imm3
> + ((val >> 16) & 0x00ff)); // imm8
> break;
> case R_ARM_THM_MOVW_ABS_NC:
> case R_ARM_THM_MOVW_PREL_NC:
> // Encoding T3: A = imm4:i:imm3:imm8
> - write16le(Loc,
> + write16le(loc,
> 0xf240 | // opcode
> - ((Val >> 1) & 0x0400) | // i
> - ((Val >> 12) & 0x000f)); // imm4
> - write16le(Loc + 2,
> - (read16le(Loc + 2) & 0x8f00) | // opcode
> - ((Val << 4) & 0x7000) | // imm3
> - (Val & 0x00ff)); // imm8
> + ((val >> 1) & 0x0400) | // i
> + ((val >> 12) & 0x000f)); // imm4
> + write16le(loc + 2,
> + (read16le(loc + 2) & 0x8f00) | // opcode
> + ((val << 4) & 0x7000) | // imm3
> + (val & 0x00ff)); // imm8
> break;
> default:
> - error(getErrorLocation(Loc) + "unrecognized relocation " +
> toString(Type));
> + error(getErrorLocation(loc) + "unrecognized relocation " +
> toString(type));
> }
> }
>
> -int64_t ARM::getImplicitAddend(const uint8_t *Buf, RelType Type)
> const {
> - switch (Type) {
> +int64_t ARM::getImplicitAddend(const uint8_t *buf, RelType type)
> const {
> + switch (type) {
> default:
> return 0;
> case R_ARM_ABS32:
> @@ -534,47 +534,47 @@ int64_t ARM::getImplicitAddend(const uin
> case R_ARM_TLS_LDO32:
> case R_ARM_TLS_IE32:
> case R_ARM_TLS_LE32:
> - return SignExtend64<32>(read32le(Buf));
> + return SignExtend64<32>(read32le(buf));
> case R_ARM_PREL31:
> - return SignExtend64<31>(read32le(Buf));
> + return SignExtend64<31>(read32le(buf));
> case R_ARM_CALL:
> case R_ARM_JUMP24:
> case R_ARM_PC24:
> case R_ARM_PLT32:
> - return SignExtend64<26>(read32le(Buf) << 2);
> + return SignExtend64<26>(read32le(buf) << 2);
> case R_ARM_THM_JUMP11:
> - return SignExtend64<12>(read16le(Buf) << 1);
> + return SignExtend64<12>(read16le(buf) << 1);
> case R_ARM_THM_JUMP19: {
> // Encoding T3: A = S:J2:J1:imm10:imm6:0
> - uint16_t Hi = read16le(Buf);
> - uint16_t Lo = read16le(Buf + 2);
> - return SignExtend64<20>(((Hi & 0x0400) << 10) | // S
> - ((Lo & 0x0800) << 8) | // J2
> - ((Lo & 0x2000) << 5) | // J1
> - ((Hi & 0x003f) << 12) | // imm6
> - ((Lo & 0x07ff) << 1)); // imm11:0
> + uint16_t hi = read16le(buf);
> + uint16_t lo = read16le(buf + 2);
> + return SignExtend64<20>(((hi & 0x0400) << 10) | // S
> + ((lo & 0x0800) << 8) | // J2
> + ((lo & 0x2000) << 5) | // J1
> + ((hi & 0x003f) << 12) | // imm6
> + ((lo & 0x07ff) << 1)); // imm11:0
> }
> case R_ARM_THM_CALL:
> - if (!Config->ARMJ1J2BranchEncoding) {
> + if (!config->armJ1J2BranchEncoding) {
> // Older Arm architectures do not support R_ARM_THM_JUMP24 and
> have
> // different encoding rules and range due to J1 and J2 always
> being 1.
> - uint16_t Hi = read16le(Buf);
> - uint16_t Lo = read16le(Buf + 2);
> - return SignExtend64<22>(((Hi & 0x7ff) << 12) | // imm11
> - ((Lo & 0x7ff) << 1)); // imm11:0
> + uint16_t hi = read16le(buf);
> + uint16_t lo = read16le(buf + 2);
> + return SignExtend64<22>(((hi & 0x7ff) << 12) | // imm11
> + ((lo & 0x7ff) << 1)); // imm11:0
> break;
> }
> LLVM_FALLTHROUGH;
> case R_ARM_THM_JUMP24: {
> // Encoding B T4, BL T1, BLX T2: A = S:I1:I2:imm10:imm11:0
> // I1 = NOT(J1 EOR S), I2 = NOT(J2 EOR S)
> - uint16_t Hi = read16le(Buf);
> - uint16_t Lo = read16le(Buf + 2);
> - return SignExtend64<24>(((Hi & 0x0400) << 14) |
> // S
> - (~((Lo ^ (Hi << 3)) << 10) & 0x00800000)
> | // I1
> - (~((Lo ^ (Hi << 1)) << 11) & 0x00400000)
> | // I2
> - ((Hi & 0x003ff) << 12) |
> // imm0
> - ((Lo & 0x007ff) << 1)); // imm11:0
> + uint16_t hi = read16le(buf);
> + uint16_t lo = read16le(buf + 2);
> + return SignExtend64<24>(((hi & 0x0400) << 14) |
> // S
> + (~((lo ^ (hi << 3)) << 10) & 0x00800000)
> | // I1
> + (~((lo ^ (hi << 1)) << 11) & 0x00400000)
> | // I2
> + ((hi & 0x003ff) << 12) |
> // imm0
> + ((lo & 0x007ff) << 1)); // imm11:0
> }
> // ELF for the ARM Architecture 4.6.1.1 the implicit addend for
> MOVW and
> // MOVT is in the range -32768 <= A < 32768
> @@ -582,25 +582,25 @@ int64_t ARM::getImplicitAddend(const uin
> case R_ARM_MOVT_ABS:
> case R_ARM_MOVW_PREL_NC:
> case R_ARM_MOVT_PREL: {
> - uint64_t Val = read32le(Buf) & 0x000f0fff;
> - return SignExtend64<16>(((Val & 0x000f0000) >> 4) | (Val &
> 0x00fff));
> + uint64_t val = read32le(buf) & 0x000f0fff;
> + return SignExtend64<16>(((val & 0x000f0000) >> 4) | (val &
> 0x00fff));
> }
> case R_ARM_THM_MOVW_ABS_NC:
> case R_ARM_THM_MOVT_ABS:
> case R_ARM_THM_MOVW_PREL_NC:
> case R_ARM_THM_MOVT_PREL: {
> // Encoding T3: A = imm4:i:imm3:imm8
> - uint16_t Hi = read16le(Buf);
> - uint16_t Lo = read16le(Buf + 2);
> - return SignExtend64<16>(((Hi & 0x000f) << 12) | // imm4
> - ((Hi & 0x0400) << 1) | // i
> - ((Lo & 0x7000) >> 4) | // imm3
> - (Lo & 0x00ff)); // imm8
> + uint16_t hi = read16le(buf);
> + uint16_t lo = read16le(buf + 2);
> + return SignExtend64<16>(((hi & 0x000f) << 12) | // imm4
> + ((hi & 0x0400) << 1) | // i
> + ((lo & 0x7000) >> 4) | // imm3
> + (lo & 0x00ff)); // imm8
> }
> }
> }
>
> TargetInfo *elf::getARMTargetInfo() {
> - static ARM Target;
> - return &Target;
> + static ARM target;
> + return ⌖
> }
>
> Modified: lld/trunk/ELF/Arch/AVR.cpp
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_Arch_AVR.cpp-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=ou7_BuDBHsM0Ylesun0AV0Qw0AeVW_QxwKwA8758guc&e=
>
> ==============================================================================
> --- lld/trunk/ELF/Arch/AVR.cpp (original)
> +++ lld/trunk/ELF/Arch/AVR.cpp Tue Jul 9 22:00:37 2019
> @@ -43,34 +43,34 @@ namespace {
> class AVR final : public TargetInfo {
> public:
> AVR();
> - RelExpr getRelExpr(RelType Type, const Symbol &S,
> - const uint8_t *Loc) const override;
> - void relocateOne(uint8_t *Loc, RelType Type, uint64_t Val) const
> override;
> + RelExpr getRelExpr(RelType type, const Symbol &s,
> + const uint8_t *loc) const override;
> + void relocateOne(uint8_t *loc, RelType type, uint64_t val) const
> override;
> };
> } // namespace
>
> -AVR::AVR() { NoneRel = R_AVR_NONE; }
> +AVR::AVR() { noneRel = R_AVR_NONE; }
>
> -RelExpr AVR::getRelExpr(RelType Type, const Symbol &S,
> - const uint8_t *Loc) const {
> +RelExpr AVR::getRelExpr(RelType type, const Symbol &s,
> + const uint8_t *loc) const {
> return R_ABS;
> }
>
> -void AVR::relocateOne(uint8_t *Loc, RelType Type, uint64_t Val) const
> {
> - switch (Type) {
> +void AVR::relocateOne(uint8_t *loc, RelType type, uint64_t val) const
> {
> + switch (type) {
> case R_AVR_CALL: {
> - uint16_t Hi = Val >> 17;
> - uint16_t Lo = Val >> 1;
> - write16le(Loc, read16le(Loc) | ((Hi >> 1) << 4) | (Hi & 1));
> - write16le(Loc + 2, Lo);
> + uint16_t hi = val >> 17;
> + uint16_t lo = val >> 1;
> + write16le(loc, read16le(loc) | ((hi >> 1) << 4) | (hi & 1));
> + write16le(loc + 2, lo);
> break;
> }
> default:
> - error(getErrorLocation(Loc) + "unrecognized relocation " +
> toString(Type));
> + error(getErrorLocation(loc) + "unrecognized relocation " +
> toString(type));
> }
> }
>
> TargetInfo *elf::getAVRTargetInfo() {
> - static AVR Target;
> - return &Target;
> + static AVR target;
> + return ⌖
> }
>
> Modified: lld/trunk/ELF/Arch/Hexagon.cpp
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_Arch_Hexagon.cpp-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=8TI1OYMfEvb6Qt0wbtn3TN0wxSlLGjsTaHFtGmh-3bE&e=
>
> ==============================================================================
> --- lld/trunk/ELF/Arch/Hexagon.cpp (original)
> +++ lld/trunk/ELF/Arch/Hexagon.cpp Tue Jul 9 22:00:37 2019
> @@ -27,65 +27,65 @@ class Hexagon final : public TargetInfo
> public:
> Hexagon();
> uint32_t calcEFlags() const override;
> - RelExpr getRelExpr(RelType Type, const Symbol &S,
> - const uint8_t *Loc) const override;
> - void relocateOne(uint8_t *Loc, RelType Type, uint64_t Val) const
> override;
> - void writePltHeader(uint8_t *Buf) const override;
> - void writePlt(uint8_t *Buf, uint64_t GotPltEntryAddr, uint64_t
> PltEntryAddr,
> - int32_t Index, unsigned RelOff) const override;
> + RelExpr getRelExpr(RelType type, const Symbol &s,
> + const uint8_t *loc) const override;
> + void relocateOne(uint8_t *loc, RelType type, uint64_t val) const
> override;
> + void writePltHeader(uint8_t *buf) const override;
> + void writePlt(uint8_t *buf, uint64_t gotPltEntryAddr, uint64_t
> pltEntryAddr,
> + int32_t index, unsigned relOff) const override;
> };
> } // namespace
>
> Hexagon::Hexagon() {
> - PltRel = R_HEX_JMP_SLOT;
> - RelativeRel = R_HEX_RELATIVE;
> - GotRel = R_HEX_GLOB_DAT;
> - SymbolicRel = R_HEX_32;
> + pltRel = R_HEX_JMP_SLOT;
> + relativeRel = R_HEX_RELATIVE;
> + gotRel = R_HEX_GLOB_DAT;
> + symbolicRel = R_HEX_32;
>
> // The zero'th GOT entry is reserved for the address of _DYNAMIC.
> The
> // next 3 are reserved for the dynamic loader.
> - GotPltHeaderEntriesNum = 4;
> + gotPltHeaderEntriesNum = 4;
>
> - PltEntrySize = 16;
> - PltHeaderSize = 32;
> + pltEntrySize = 16;
> + pltHeaderSize = 32;
>
> // Hexagon Linux uses 64K pages by default.
> - DefaultMaxPageSize = 0x10000;
> - NoneRel = R_HEX_NONE;
> + defaultMaxPageSize = 0x10000;
> + noneRel = R_HEX_NONE;
> }
>
> uint32_t Hexagon::calcEFlags() const {
> - assert(!ObjectFiles.empty());
> + assert(!objectFiles.empty());
>
> // The architecture revision must always be equal to or greater than
> // greatest revision in the list of inputs.
> - uint32_t Ret = 0;
> - for (InputFile *F : ObjectFiles) {
> - uint32_t EFlags =
> cast<ObjFile<ELF32LE>>(F)->getObj().getHeader()->e_flags;
> - if (EFlags > Ret)
> - Ret = EFlags;
> + uint32_t ret = 0;
> + for (InputFile *f : objectFiles) {
> + uint32_t eflags =
> cast<ObjFile<ELF32LE>>(f)->getObj().getHeader()->e_flags;
> + if (eflags > ret)
> + ret = eflags;
> }
> - return Ret;
> + return ret;
> }
>
> -static uint32_t applyMask(uint32_t Mask, uint32_t Data) {
> - uint32_t Result = 0;
> - size_t Off = 0;
> -
> - for (size_t Bit = 0; Bit != 32; ++Bit) {
> - uint32_t ValBit = (Data >> Off) & 1;
> - uint32_t MaskBit = (Mask >> Bit) & 1;
> - if (MaskBit) {
> - Result |= (ValBit << Bit);
> - ++Off;
> +static uint32_t applyMask(uint32_t mask, uint32_t data) {
> + uint32_t result = 0;
> + size_t off = 0;
> +
> + for (size_t bit = 0; bit != 32; ++bit) {
> + uint32_t valBit = (data >> off) & 1;
> + uint32_t maskBit = (mask >> bit) & 1;
> + if (maskBit) {
> + result |= (valBit << bit);
> + ++off;
> }
> }
> - return Result;
> + return result;
> }
>
> -RelExpr Hexagon::getRelExpr(RelType Type, const Symbol &S,
> - const uint8_t *Loc) const {
> - switch (Type) {
> +RelExpr Hexagon::getRelExpr(RelType type, const Symbol &s,
> + const uint8_t *loc) const {
> + switch (type) {
> case R_HEX_B9_PCREL:
> case R_HEX_B9_PCREL_X:
> case R_HEX_B13_PCREL:
> @@ -108,16 +108,16 @@ RelExpr Hexagon::getRelExpr(RelType Type
> }
> }
>
> -static uint32_t findMaskR6(uint32_t Insn) {
> +static uint32_t findMaskR6(uint32_t insn) {
> // There are (arguably too) many relocation masks for the DSP's
> // R_HEX_6_X type. The table below is used to select the correct
> mask
> // for the given instruction.
> struct InstructionMask {
> - uint32_t CmpMask;
> - uint32_t RelocMask;
> + uint32_t cmpMask;
> + uint32_t relocMask;
> };
>
> - static const InstructionMask R6[] = {
> + static const InstructionMask r6[] = {
> {0x38000000, 0x0000201f}, {0x39000000, 0x0000201f},
> {0x3e000000, 0x00001f80}, {0x3f000000, 0x00001f80},
> {0x40000000, 0x000020f8}, {0x41000000, 0x000007e0},
> @@ -135,124 +135,124 @@ static uint32_t findMaskR6(uint32_t Insn
> // Duplex forms have a fixed mask and parse bits 15:14 are always
> // zero. Non-duplex insns will always have at least one bit set in
> the
> // parse field.
> - if ((0xC000 & Insn) == 0x0)
> + if ((0xC000 & insn) == 0x0)
> return 0x03f00000;
>
> - for (InstructionMask I : R6)
> - if ((0xff000000 & Insn) == I.CmpMask)
> - return I.RelocMask;
> + for (InstructionMask i : r6)
> + if ((0xff000000 & insn) == i.cmpMask)
> + return i.relocMask;
>
> error("unrecognized instruction for R_HEX_6 relocation: 0x" +
> - utohexstr(Insn));
> + utohexstr(insn));
> return 0;
> }
>
> -static uint32_t findMaskR8(uint32_t Insn) {
> - if ((0xff000000 & Insn) == 0xde000000)
> +static uint32_t findMaskR8(uint32_t insn) {
> + if ((0xff000000 & insn) == 0xde000000)
> return 0x00e020e8;
> - if ((0xff000000 & Insn) == 0x3c000000)
> + if ((0xff000000 & insn) == 0x3c000000)
> return 0x0000207f;
> return 0x00001fe0;
> }
>
> -static uint32_t findMaskR11(uint32_t Insn) {
> - if ((0xff000000 & Insn) == 0xa1000000)
> +static uint32_t findMaskR11(uint32_t insn) {
> + if ((0xff000000 & insn) == 0xa1000000)
> return 0x060020ff;
> return 0x06003fe0;
> }
>
> -static uint32_t findMaskR16(uint32_t Insn) {
> - if ((0xff000000 & Insn) == 0x48000000)
> +static uint32_t findMaskR16(uint32_t insn) {
> + if ((0xff000000 & insn) == 0x48000000)
> return 0x061f20ff;
> - if ((0xff000000 & Insn) == 0x49000000)
> + if ((0xff000000 & insn) == 0x49000000)
> return 0x061f3fe0;
> - if ((0xff000000 & Insn) == 0x78000000)
> + if ((0xff000000 & insn) == 0x78000000)
> return 0x00df3fe0;
> - if ((0xff000000 & Insn) == 0xb0000000)
> + if ((0xff000000 & insn) == 0xb0000000)
> return 0x0fe03fe0;
>
> error("unrecognized instruction for R_HEX_16_X relocation: 0x" +
> - utohexstr(Insn));
> + utohexstr(insn));
> return 0;
> }
>
> -static void or32le(uint8_t *P, int32_t V) { write32le(P, read32le(P)
> | V); }
> +static void or32le(uint8_t *p, int32_t v) { write32le(p, read32le(p)
> | v); }
>
> -void Hexagon::relocateOne(uint8_t *Loc, RelType Type, uint64_t Val)
> const {
> - switch (Type) {
> +void Hexagon::relocateOne(uint8_t *loc, RelType type, uint64_t val)
> const {
> + switch (type) {
> case R_HEX_NONE:
> break;
> case R_HEX_6_PCREL_X:
> case R_HEX_6_X:
> - or32le(Loc, applyMask(findMaskR6(read32le(Loc)), Val));
> + or32le(loc, applyMask(findMaskR6(read32le(loc)), val));
> break;
> case R_HEX_8_X:
> - or32le(Loc, applyMask(findMaskR8(read32le(Loc)), Val));
> + or32le(loc, applyMask(findMaskR8(read32le(loc)), val));
> break;
> case R_HEX_9_X:
> - or32le(Loc, applyMask(0x00003fe0, Val & 0x3f));
> + or32le(loc, applyMask(0x00003fe0, val & 0x3f));
> break;
> case R_HEX_10_X:
> - or32le(Loc, applyMask(0x00203fe0, Val & 0x3f));
> + or32le(loc, applyMask(0x00203fe0, val & 0x3f));
> break;
> case R_HEX_11_X:
> case R_HEX_GOT_11_X:
> - or32le(Loc, applyMask(findMaskR11(read32le(Loc)), Val & 0x3f));
> + or32le(loc, applyMask(findMaskR11(read32le(loc)), val & 0x3f));
> break;
> case R_HEX_12_X:
> - or32le(Loc, applyMask(0x000007e0, Val));
> + or32le(loc, applyMask(0x000007e0, val));
> break;
> case R_HEX_16_X: // These relocs only have 6 effective bits.
> case R_HEX_GOT_16_X:
> - or32le(Loc, applyMask(findMaskR16(read32le(Loc)), Val & 0x3f));
> + or32le(loc, applyMask(findMaskR16(read32le(loc)), val & 0x3f));
> break;
> case R_HEX_32:
> case R_HEX_32_PCREL:
> - or32le(Loc, Val);
> + or32le(loc, val);
> break;
> case R_HEX_32_6_X:
> case R_HEX_GOT_32_6_X:
> - or32le(Loc, applyMask(0x0fff3fff, Val >> 6));
> + or32le(loc, applyMask(0x0fff3fff, val >> 6));
> break;
> case R_HEX_B9_PCREL:
> - or32le(Loc, applyMask(0x003000fe, Val >> 2));
> + or32le(loc, applyMask(0x003000fe, val >> 2));
> break;
> case R_HEX_B9_PCREL_X:
> - or32le(Loc, applyMask(0x003000fe, Val & 0x3f));
> + or32le(loc, applyMask(0x003000fe, val & 0x3f));
> break;
> case R_HEX_B13_PCREL:
> - or32le(Loc, applyMask(0x00202ffe, Val >> 2));
> + or32le(loc, applyMask(0x00202ffe, val >> 2));
> break;
> case R_HEX_B15_PCREL:
> - or32le(Loc, applyMask(0x00df20fe, Val >> 2));
> + or32le(loc, applyMask(0x00df20fe, val >> 2));
> break;
> case R_HEX_B15_PCREL_X:
> - or32le(Loc, applyMask(0x00df20fe, Val & 0x3f));
> + or32le(loc, applyMask(0x00df20fe, val & 0x3f));
> break;
> case R_HEX_B22_PCREL:
> case R_HEX_PLT_B22_PCREL:
> - or32le(Loc, applyMask(0x1ff3ffe, Val >> 2));
> + or32le(loc, applyMask(0x1ff3ffe, val >> 2));
> break;
> case R_HEX_B22_PCREL_X:
> - or32le(Loc, applyMask(0x1ff3ffe, Val & 0x3f));
> + or32le(loc, applyMask(0x1ff3ffe, val & 0x3f));
> break;
> case R_HEX_B32_PCREL_X:
> - or32le(Loc, applyMask(0x0fff3fff, Val >> 6));
> + or32le(loc, applyMask(0x0fff3fff, val >> 6));
> break;
> case R_HEX_HI16:
> - or32le(Loc, applyMask(0x00c03fff, Val >> 16));
> + or32le(loc, applyMask(0x00c03fff, val >> 16));
> break;
> case R_HEX_LO16:
> - or32le(Loc, applyMask(0x00c03fff, Val));
> + or32le(loc, applyMask(0x00c03fff, val));
> break;
> default:
> - error(getErrorLocation(Loc) + "unrecognized relocation " +
> toString(Type));
> + error(getErrorLocation(loc) + "unrecognized relocation " +
> toString(type));
> break;
> }
> }
>
> -void Hexagon::writePltHeader(uint8_t *Buf) const {
> - const uint8_t PltData[] = {
> +void Hexagon::writePltHeader(uint8_t *buf) const {
> + const uint8_t pltData[] = {
> 0x00, 0x40, 0x00, 0x00, // { immext (#0)
> 0x1c, 0xc0, 0x49, 0x6a, // r28 = add (pc, ##GOT0 at PCREL) } #
> @GOT0
> 0x0e, 0x42, 0x9c, 0xe2, // { r14 -= add (r28, #16) # offset of
> GOTn
> @@ -262,30 +262,30 @@ void Hexagon::writePltHeader(uint8_t *Bu
> 0x00, 0xc0, 0x9c, 0x52, // jumpr r28 } # call
> dynamic linker
> 0x0c, 0xdb, 0x00, 0x54, // trap0(#0xdb) # bring plt0 into
> 16byte alignment
> };
> - memcpy(Buf, PltData, sizeof(PltData));
> + memcpy(buf, pltData, sizeof(pltData));
>
> // Offset from PLT0 to the GOT.
> - uint64_t Off = In.GotPlt->getVA() - In.Plt->getVA();
> - relocateOne(Buf, R_HEX_B32_PCREL_X, Off);
> - relocateOne(Buf + 4, R_HEX_6_PCREL_X, Off);
> + uint64_t off = in.gotPlt->getVA() - in.plt->getVA();
> + relocateOne(buf, R_HEX_B32_PCREL_X, off);
> + relocateOne(buf + 4, R_HEX_6_PCREL_X, off);
> }
>
> -void Hexagon::writePlt(uint8_t *Buf, uint64_t GotPltEntryAddr,
> - uint64_t PltEntryAddr, int32_t Index,
> - unsigned RelOff) const {
> - const uint8_t Inst[] = {
> +void Hexagon::writePlt(uint8_t *buf, uint64_t gotPltEntryAddr,
> + uint64_t pltEntryAddr, int32_t index,
> + unsigned relOff) const {
> + const uint8_t inst[] = {
> 0x00, 0x40, 0x00, 0x00, // { immext (#0)
> 0x0e, 0xc0, 0x49, 0x6a, // r14 = add (pc, ##GOTn at PCREL) }
> 0x1c, 0xc0, 0x8e, 0x91, // r28 = memw (r14)
> 0x00, 0xc0, 0x9c, 0x52, // jumpr r28
> };
> - memcpy(Buf, Inst, sizeof(Inst));
> + memcpy(buf, inst, sizeof(inst));
>
> - relocateOne(Buf, R_HEX_B32_PCREL_X, GotPltEntryAddr - PltEntryAddr);
> - relocateOne(Buf + 4, R_HEX_6_PCREL_X, GotPltEntryAddr -
> PltEntryAddr);
> + relocateOne(buf, R_HEX_B32_PCREL_X, gotPltEntryAddr - pltEntryAddr);
> + relocateOne(buf + 4, R_HEX_6_PCREL_X, gotPltEntryAddr -
> pltEntryAddr);
> }
>
> TargetInfo *elf::getHexagonTargetInfo() {
> - static Hexagon Target;
> - return &Target;
> + static Hexagon target;
> + return ⌖
> }
>
> Modified: lld/trunk/ELF/Arch/MSP430.cpp
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_Arch_MSP430.cpp-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=gO20EqD2GAZ9hLj_k1r3fHjyHbKLKKznX9VIeyi8wPI&e=
>
> ==============================================================================
> --- lld/trunk/ELF/Arch/MSP430.cpp (original)
> +++ lld/trunk/ELF/Arch/MSP430.cpp Tue Jul 9 22:00:37 2019
> @@ -33,20 +33,20 @@ namespace {
> class MSP430 final : public TargetInfo {
> public:
> MSP430();
> - RelExpr getRelExpr(RelType Type, const Symbol &S,
> - const uint8_t *Loc) const override;
> - void relocateOne(uint8_t *Loc, RelType Type, uint64_t Val) const
> override;
> + RelExpr getRelExpr(RelType type, const Symbol &s,
> + const uint8_t *loc) const override;
> + void relocateOne(uint8_t *loc, RelType type, uint64_t val) const
> override;
> };
> } // namespace
>
> MSP430::MSP430() {
> // mov.b #0, r3
> - TrapInstr = {0x43, 0x43, 0x43, 0x43};
> + trapInstr = {0x43, 0x43, 0x43, 0x43};
> }
>
> -RelExpr MSP430::getRelExpr(RelType Type, const Symbol &S,
> - const uint8_t *Loc) const {
> - switch (Type) {
> +RelExpr MSP430::getRelExpr(RelType type, const Symbol &s,
> + const uint8_t *loc) const {
> + switch (type) {
> case R_MSP430_10_PCREL:
> case R_MSP430_16_PCREL:
> case R_MSP430_16_PCREL_BYTE:
> @@ -59,35 +59,35 @@ RelExpr MSP430::getRelExpr(RelType Type,
> }
> }
>
> -void MSP430::relocateOne(uint8_t *Loc, RelType Type, uint64_t Val)
> const {
> - switch (Type) {
> +void MSP430::relocateOne(uint8_t *loc, RelType type, uint64_t val)
> const {
> + switch (type) {
> case R_MSP430_8:
> - checkIntUInt(Loc, Val, 8, Type);
> - *Loc = Val;
> + checkIntUInt(loc, val, 8, type);
> + *loc = val;
> break;
> case R_MSP430_16:
> case R_MSP430_16_PCREL:
> case R_MSP430_16_BYTE:
> case R_MSP430_16_PCREL_BYTE:
> - checkIntUInt(Loc, Val, 16, Type);
> - write16le(Loc, Val);
> + checkIntUInt(loc, val, 16, type);
> + write16le(loc, val);
> break;
> case R_MSP430_32:
> - checkIntUInt(Loc, Val, 32, Type);
> - write32le(Loc, Val);
> + checkIntUInt(loc, val, 32, type);
> + write32le(loc, val);
> break;
> case R_MSP430_10_PCREL: {
> - int16_t Offset = ((int16_t)Val >> 1) - 1;
> - checkInt(Loc, Offset, 10, Type);
> - write16le(Loc, (read16le(Loc) & 0xFC00) | (Offset & 0x3FF));
> + int16_t offset = ((int16_t)val >> 1) - 1;
> + checkInt(loc, offset, 10, type);
> + write16le(loc, (read16le(loc) & 0xFC00) | (offset & 0x3FF));
> break;
> }
> default:
> - error(getErrorLocation(Loc) + "unrecognized relocation " +
> toString(Type));
> + error(getErrorLocation(loc) + "unrecognized relocation " +
> toString(type));
> }
> }
>
> TargetInfo *elf::getMSP430TargetInfo() {
> - static MSP430 Target;
> - return &Target;
> + static MSP430 target;
> + return ⌖
> }
>
> Modified: lld/trunk/ELF/Arch/Mips.cpp
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_Arch_Mips.cpp-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=5twCzKi6O5GBmjBudR6q-tKAK0KcPichjaHnZQKiK1g&e=
>
> ==============================================================================
> --- lld/trunk/ELF/Arch/Mips.cpp (original)
> +++ lld/trunk/ELF/Arch/Mips.cpp Tue Jul 9 22:00:37 2019
> @@ -28,47 +28,47 @@ template <class ELFT> class MIPS final :
> public:
> MIPS();
> uint32_t calcEFlags() const override;
> - RelExpr getRelExpr(RelType Type, const Symbol &S,
> - const uint8_t *Loc) const override;
> - int64_t getImplicitAddend(const uint8_t *Buf, RelType Type) const
> override;
> - RelType getDynRel(RelType Type) const override;
> - void writeGotPlt(uint8_t *Buf, const Symbol &S) const override;
> - void writePltHeader(uint8_t *Buf) const override;
> - void writePlt(uint8_t *Buf, uint64_t GotPltEntryAddr, uint64_t
> PltEntryAddr,
> - int32_t Index, unsigned RelOff) const override;
> - bool needsThunk(RelExpr Expr, RelType Type, const InputFile *File,
> - uint64_t BranchAddr, const Symbol &S) const
> override;
> - void relocateOne(uint8_t *Loc, RelType Type, uint64_t Val) const
> override;
> - bool usesOnlyLowPageBits(RelType Type) const override;
> + RelExpr getRelExpr(RelType type, const Symbol &s,
> + const uint8_t *loc) const override;
> + int64_t getImplicitAddend(const uint8_t *buf, RelType type) const
> override;
> + RelType getDynRel(RelType type) const override;
> + void writeGotPlt(uint8_t *buf, const Symbol &s) const override;
> + void writePltHeader(uint8_t *buf) const override;
> + void writePlt(uint8_t *buf, uint64_t gotPltEntryAddr, uint64_t
> pltEntryAddr,
> + int32_t index, unsigned relOff) const override;
> + bool needsThunk(RelExpr expr, RelType type, const InputFile *file,
> + uint64_t branchAddr, const Symbol &s) const
> override;
> + void relocateOne(uint8_t *loc, RelType type, uint64_t val) const
> override;
> + bool usesOnlyLowPageBits(RelType type) const override;
> };
> } // namespace
>
> template <class ELFT> MIPS<ELFT>::MIPS() {
> - GotPltHeaderEntriesNum = 2;
> - DefaultMaxPageSize = 65536;
> - GotBaseSymInGotPlt = false;
> - PltEntrySize = 16;
> - PltHeaderSize = 32;
> - CopyRel = R_MIPS_COPY;
> - NoneRel = R_MIPS_NONE;
> - PltRel = R_MIPS_JUMP_SLOT;
> - NeedsThunks = true;
> + gotPltHeaderEntriesNum = 2;
> + defaultMaxPageSize = 65536;
> + gotBaseSymInGotPlt = false;
> + pltEntrySize = 16;
> + pltHeaderSize = 32;
> + copyRel = R_MIPS_COPY;
> + noneRel = R_MIPS_NONE;
> + pltRel = R_MIPS_JUMP_SLOT;
> + needsThunks = true;
>
> // Set `sigrie 1` as a trap instruction.
> - write32(TrapInstr.data(), 0x04170001);
> + write32(trapInstr.data(), 0x04170001);
>
> if (ELFT::Is64Bits) {
> - RelativeRel = (R_MIPS_64 << 8) | R_MIPS_REL32;
> - SymbolicRel = R_MIPS_64;
> - TlsGotRel = R_MIPS_TLS_TPREL64;
> - TlsModuleIndexRel = R_MIPS_TLS_DTPMOD64;
> - TlsOffsetRel = R_MIPS_TLS_DTPREL64;
> + relativeRel = (R_MIPS_64 << 8) | R_MIPS_REL32;
> + symbolicRel = R_MIPS_64;
> + tlsGotRel = R_MIPS_TLS_TPREL64;
> + tlsModuleIndexRel = R_MIPS_TLS_DTPMOD64;
> + tlsOffsetRel = R_MIPS_TLS_DTPREL64;
> } else {
> - RelativeRel = R_MIPS_REL32;
> - SymbolicRel = R_MIPS_32;
> - TlsGotRel = R_MIPS_TLS_TPREL32;
> - TlsModuleIndexRel = R_MIPS_TLS_DTPMOD32;
> - TlsOffsetRel = R_MIPS_TLS_DTPREL32;
> + relativeRel = R_MIPS_REL32;
> + symbolicRel = R_MIPS_32;
> + tlsGotRel = R_MIPS_TLS_TPREL32;
> + tlsModuleIndexRel = R_MIPS_TLS_DTPMOD32;
> + tlsOffsetRel = R_MIPS_TLS_DTPREL32;
> }
> }
>
> @@ -77,13 +77,13 @@ template <class ELFT> uint32_t MIPS<ELFT
> }
>
> template <class ELFT>
> -RelExpr MIPS<ELFT>::getRelExpr(RelType Type, const Symbol &S,
> - const uint8_t *Loc) const {
> +RelExpr MIPS<ELFT>::getRelExpr(RelType type, const Symbol &s,
> + const uint8_t *loc) const {
> // See comment in the calculateMipsRelChain.
> - if (ELFT::Is64Bits || Config->MipsN32Abi)
> - Type &= 0xff;
> + if (ELFT::Is64Bits || config->mipsN32Abi)
> + type &= 0xff;
>
> - switch (Type) {
> + switch (type) {
> case R_MIPS_JALR:
> case R_MICROMIPS_JALR:
> return R_HINT;
> @@ -107,9 +107,9 @@ RelExpr MIPS<ELFT>::getRelExpr(RelType T
> // offset between start of function and 'gp' value which by
> default
> // equal to the start of .got section. In that case we consider
> these
> // relocations as relative.
> - if (&S == ElfSym::MipsGpDisp)
> + if (&s == ElfSym::mipsGpDisp)
> return R_MIPS_GOT_GP_PC;
> - if (&S == ElfSym::MipsLocalGp)
> + if (&s == ElfSym::mipsLocalGp)
> return R_MIPS_GOT_GP;
> LLVM_FALLTHROUGH;
> case R_MIPS_32:
> @@ -146,7 +146,7 @@ RelExpr MIPS<ELFT>::getRelExpr(RelType T
> return R_PC;
> case R_MIPS_GOT16:
> case R_MICROMIPS_GOT16:
> - if (S.isLocal())
> + if (s.isLocal())
> return R_MIPS_GOT_LOCAL_PAGE;
> LLVM_FALLTHROUGH;
> case R_MIPS_CALL16:
> @@ -175,213 +175,213 @@ RelExpr MIPS<ELFT>::getRelExpr(RelType T
> case R_MIPS_NONE:
> return R_NONE;
> default:
> - error(getErrorLocation(Loc) + "unknown relocation (" +
> Twine(Type) +
> - ") against symbol " + toString(S));
> + error(getErrorLocation(loc) + "unknown relocation (" +
> Twine(type) +
> + ") against symbol " + toString(s));
> return R_NONE;
> }
> }
>
> -template <class ELFT> RelType MIPS<ELFT>::getDynRel(RelType Type)
> const {
> - if (Type == SymbolicRel)
> - return Type;
> +template <class ELFT> RelType MIPS<ELFT>::getDynRel(RelType type)
> const {
> + if (type == symbolicRel)
> + return type;
> return R_MIPS_NONE;
> }
>
> template <class ELFT>
> -void MIPS<ELFT>::writeGotPlt(uint8_t *Buf, const Symbol &) const {
> - uint64_t VA = In.Plt->getVA();
> +void MIPS<ELFT>::writeGotPlt(uint8_t *buf, const Symbol &) const {
> + uint64_t va = in.plt->getVA();
> if (isMicroMips())
> - VA |= 1;
> - write32<ELFT::TargetEndianness>(Buf, VA);
> + va |= 1;
> + write32<ELFT::TargetEndianness>(buf, va);
> }
>
> -template <endianness E> static uint32_t readShuffle(const uint8_t
> *Loc) {
> +template <endianness E> static uint32_t readShuffle(const uint8_t
> *loc) {
> // The major opcode of a microMIPS instruction needs to appear
> // in the first 16-bit word (lowest address) for efficient hardware
> // decode so that it knows if the instruction is 16-bit or 32-bit
> // as early as possible. To do so, little-endian binaries keep
> 16-bit
> // words in a big-endian order. That is why we have to swap these
> // words to get a correct value.
> - uint32_t V = read32<E>(Loc);
> + uint32_t v = read32<E>(loc);
> if (E == support::little)
> - return (V << 16) | (V >> 16);
> - return V;
> + return (v << 16) | (v >> 16);
> + return v;
> }
>
> template <endianness E>
> -static void writeValue(uint8_t *Loc, uint64_t V, uint8_t BitsSize,
> - uint8_t Shift) {
> - uint32_t Instr = read32<E>(Loc);
> - uint32_t Mask = 0xffffffff >> (32 - BitsSize);
> - uint32_t Data = (Instr & ~Mask) | ((V >> Shift) & Mask);
> - write32<E>(Loc, Data);
> +static void writeValue(uint8_t *loc, uint64_t v, uint8_t bitsSize,
> + uint8_t shift) {
> + uint32_t instr = read32<E>(loc);
> + uint32_t mask = 0xffffffff >> (32 - bitsSize);
> + uint32_t data = (instr & ~mask) | ((v >> shift) & mask);
> + write32<E>(loc, data);
> }
>
> template <endianness E>
> -static void writeShuffleValue(uint8_t *Loc, uint64_t V, uint8_t
> BitsSize,
> - uint8_t Shift) {
> +static void writeShuffleValue(uint8_t *loc, uint64_t v, uint8_t
> bitsSize,
> + uint8_t shift) {
> // See comments in readShuffle for purpose of this code.
> - uint16_t *Words = (uint16_t *)Loc;
> + uint16_t *words = (uint16_t *)loc;
> if (E == support::little)
> - std::swap(Words[0], Words[1]);
> + std::swap(words[0], words[1]);
>
> - writeValue<E>(Loc, V, BitsSize, Shift);
> + writeValue<E>(loc, v, bitsSize, shift);
>
> if (E == support::little)
> - std::swap(Words[0], Words[1]);
> + std::swap(words[0], words[1]);
> }
>
> template <endianness E>
> -static void writeMicroRelocation16(uint8_t *Loc, uint64_t V, uint8_t
> BitsSize,
> - uint8_t Shift) {
> - uint16_t Instr = read16<E>(Loc);
> - uint16_t Mask = 0xffff >> (16 - BitsSize);
> - uint16_t Data = (Instr & ~Mask) | ((V >> Shift) & Mask);
> - write16<E>(Loc, Data);
> +static void writeMicroRelocation16(uint8_t *loc, uint64_t v, uint8_t
> bitsSize,
> + uint8_t shift) {
> + uint16_t instr = read16<E>(loc);
> + uint16_t mask = 0xffff >> (16 - bitsSize);
> + uint16_t data = (instr & ~mask) | ((v >> shift) & mask);
> + write16<E>(loc, data);
> }
>
> -template <class ELFT> void MIPS<ELFT>::writePltHeader(uint8_t *Buf)
> const {
> - const endianness E = ELFT::TargetEndianness;
> +template <class ELFT> void MIPS<ELFT>::writePltHeader(uint8_t *buf)
> const {
> + const endianness e = ELFT::TargetEndianness;
> if (isMicroMips()) {
> - uint64_t GotPlt = In.GotPlt->getVA();
> - uint64_t Plt = In.Plt->getVA();
> + uint64_t gotPlt = in.gotPlt->getVA();
> + uint64_t plt = in.plt->getVA();
> // Overwrite trap instructions written by Writer::writeTrapInstr.
> - memset(Buf, 0, PltHeaderSize);
> + memset(buf, 0, pltHeaderSize);
>
> - write16<E>(Buf, isMipsR6() ? 0x7860 : 0x7980); // addiupc v1,
> (GOTPLT) - .
> - write16<E>(Buf + 4, 0xff23); // lw $25, 0($3)
> - write16<E>(Buf + 8, 0x0535); // subu16 $2, $2, $3
> - write16<E>(Buf + 10, 0x2525); // srl16 $2, $2, 2
> - write16<E>(Buf + 12, 0x3302); // addiu $24, $2, -2
> - write16<E>(Buf + 14, 0xfffe);
> - write16<E>(Buf + 16, 0x0dff); // move $15, $31
> + write16<e>(buf, isMipsR6() ? 0x7860 : 0x7980); // addiupc v1,
> (GOTPLT) - .
> + write16<e>(buf + 4, 0xff23); // lw $25, 0($3)
> + write16<e>(buf + 8, 0x0535); // subu16 $2, $2, $3
> + write16<e>(buf + 10, 0x2525); // srl16 $2, $2, 2
> + write16<e>(buf + 12, 0x3302); // addiu $24, $2, -2
> + write16<e>(buf + 14, 0xfffe);
> + write16<e>(buf + 16, 0x0dff); // move $15, $31
> if (isMipsR6()) {
> - write16<E>(Buf + 18, 0x0f83); // move $28, $3
> - write16<E>(Buf + 20, 0x472b); // jalrc $25
> - write16<E>(Buf + 22, 0x0c00); // nop
> - relocateOne(Buf, R_MICROMIPS_PC19_S2, GotPlt - Plt);
> + write16<e>(buf + 18, 0x0f83); // move $28, $3
> + write16<e>(buf + 20, 0x472b); // jalrc $25
> + write16<e>(buf + 22, 0x0c00); // nop
> + relocateOne(buf, R_MICROMIPS_PC19_S2, gotPlt - plt);
> } else {
> - write16<E>(Buf + 18, 0x45f9); // jalrc $25
> - write16<E>(Buf + 20, 0x0f83); // move $28, $3
> - write16<E>(Buf + 22, 0x0c00); // nop
> - relocateOne(Buf, R_MICROMIPS_PC23_S2, GotPlt - Plt);
> + write16<e>(buf + 18, 0x45f9); // jalrc $25
> + write16<e>(buf + 20, 0x0f83); // move $28, $3
> + write16<e>(buf + 22, 0x0c00); // nop
> + relocateOne(buf, R_MICROMIPS_PC23_S2, gotPlt - plt);
> }
> return;
> }
>
> - if (Config->MipsN32Abi) {
> - write32<E>(Buf, 0x3c0e0000); // lui $14, %hi(&GOTPLT[0])
> - write32<E>(Buf + 4, 0x8dd90000); // lw $25,
> %lo(&GOTPLT[0])($14)
> - write32<E>(Buf + 8, 0x25ce0000); // addiu $14, $14,
> %lo(&GOTPLT[0])
> - write32<E>(Buf + 12, 0x030ec023); // subu $24, $24, $14
> - write32<E>(Buf + 16, 0x03e07825); // move $15, $31
> - write32<E>(Buf + 20, 0x0018c082); // srl $24, $24, 2
> + if (config->mipsN32Abi) {
> + write32<e>(buf, 0x3c0e0000); // lui $14, %hi(&GOTPLT[0])
> + write32<e>(buf + 4, 0x8dd90000); // lw $25,
> %lo(&GOTPLT[0])($14)
> + write32<e>(buf + 8, 0x25ce0000); // addiu $14, $14,
> %lo(&GOTPLT[0])
> + write32<e>(buf + 12, 0x030ec023); // subu $24, $24, $14
> + write32<e>(buf + 16, 0x03e07825); // move $15, $31
> + write32<e>(buf + 20, 0x0018c082); // srl $24, $24, 2
> } else if (ELFT::Is64Bits) {
> - write32<E>(Buf, 0x3c0e0000); // lui $14, %hi(&GOTPLT[0])
> - write32<E>(Buf + 4, 0xddd90000); // ld $25,
> %lo(&GOTPLT[0])($14)
> - write32<E>(Buf + 8, 0x25ce0000); // addiu $14, $14,
> %lo(&GOTPLT[0])
> - write32<E>(Buf + 12, 0x030ec023); // subu $24, $24, $14
> - write32<E>(Buf + 16, 0x03e07825); // move $15, $31
> - write32<E>(Buf + 20, 0x0018c0c2); // srl $24, $24, 3
> + write32<e>(buf, 0x3c0e0000); // lui $14, %hi(&GOTPLT[0])
> + write32<e>(buf + 4, 0xddd90000); // ld $25,
> %lo(&GOTPLT[0])($14)
> + write32<e>(buf + 8, 0x25ce0000); // addiu $14, $14,
> %lo(&GOTPLT[0])
> + write32<e>(buf + 12, 0x030ec023); // subu $24, $24, $14
> + write32<e>(buf + 16, 0x03e07825); // move $15, $31
> + write32<e>(buf + 20, 0x0018c0c2); // srl $24, $24, 3
> } else {
> - write32<E>(Buf, 0x3c1c0000); // lui $28, %hi(&GOTPLT[0])
> - write32<E>(Buf + 4, 0x8f990000); // lw $25,
> %lo(&GOTPLT[0])($28)
> - write32<E>(Buf + 8, 0x279c0000); // addiu $28, $28,
> %lo(&GOTPLT[0])
> - write32<E>(Buf + 12, 0x031cc023); // subu $24, $24, $28
> - write32<E>(Buf + 16, 0x03e07825); // move $15, $31
> - write32<E>(Buf + 20, 0x0018c082); // srl $24, $24, 2
> - }
> -
> - uint32_t JalrInst = Config->ZHazardplt ? 0x0320fc09 : 0x0320f809;
> - write32<E>(Buf + 24, JalrInst); // jalr.hb $25 or jalr $25
> - write32<E>(Buf + 28, 0x2718fffe); // subu $24, $24, 2
> -
> - uint64_t GotPlt = In.GotPlt->getVA();
> - writeValue<E>(Buf, GotPlt + 0x8000, 16, 16);
> - writeValue<E>(Buf + 4, GotPlt, 16, 0);
> - writeValue<E>(Buf + 8, GotPlt, 16, 0);
> + write32<e>(buf, 0x3c1c0000); // lui $28, %hi(&GOTPLT[0])
> + write32<e>(buf + 4, 0x8f990000); // lw $25,
> %lo(&GOTPLT[0])($28)
> + write32<e>(buf + 8, 0x279c0000); // addiu $28, $28,
> %lo(&GOTPLT[0])
> + write32<e>(buf + 12, 0x031cc023); // subu $24, $24, $28
> + write32<e>(buf + 16, 0x03e07825); // move $15, $31
> + write32<e>(buf + 20, 0x0018c082); // srl $24, $24, 2
> + }
> +
> + uint32_t jalrInst = config->zHazardplt ? 0x0320fc09 : 0x0320f809;
> + write32<e>(buf + 24, jalrInst); // jalr.hb $25 or jalr $25
> + write32<e>(buf + 28, 0x2718fffe); // subu $24, $24, 2
> +
> + uint64_t gotPlt = in.gotPlt->getVA();
> + writeValue<e>(buf, gotPlt + 0x8000, 16, 16);
> + writeValue<e>(buf + 4, gotPlt, 16, 0);
> + writeValue<e>(buf + 8, gotPlt, 16, 0);
> }
>
> template <class ELFT>
> -void MIPS<ELFT>::writePlt(uint8_t *Buf, uint64_t GotPltEntryAddr,
> - uint64_t PltEntryAddr, int32_t Index,
> - unsigned RelOff) const {
> - const endianness E = ELFT::TargetEndianness;
> +void MIPS<ELFT>::writePlt(uint8_t *buf, uint64_t gotPltEntryAddr,
> + uint64_t pltEntryAddr, int32_t index,
> + unsigned relOff) const {
> + const endianness e = ELFT::TargetEndianness;
> if (isMicroMips()) {
> // Overwrite trap instructions written by Writer::writeTrapInstr.
> - memset(Buf, 0, PltEntrySize);
> + memset(buf, 0, pltEntrySize);
>
> if (isMipsR6()) {
> - write16<E>(Buf, 0x7840); // addiupc $2, (GOTPLT) - .
> - write16<E>(Buf + 4, 0xff22); // lw $25, 0($2)
> - write16<E>(Buf + 8, 0x0f02); // move $24, $2
> - write16<E>(Buf + 10, 0x4723); // jrc $25 / jr16 $25
> - relocateOne(Buf, R_MICROMIPS_PC19_S2, GotPltEntryAddr -
> PltEntryAddr);
> + write16<e>(buf, 0x7840); // addiupc $2, (GOTPLT) - .
> + write16<e>(buf + 4, 0xff22); // lw $25, 0($2)
> + write16<e>(buf + 8, 0x0f02); // move $24, $2
> + write16<e>(buf + 10, 0x4723); // jrc $25 / jr16 $25
> + relocateOne(buf, R_MICROMIPS_PC19_S2, gotPltEntryAddr -
> pltEntryAddr);
> } else {
> - write16<E>(Buf, 0x7900); // addiupc $2, (GOTPLT) - .
> - write16<E>(Buf + 4, 0xff22); // lw $25, 0($2)
> - write16<E>(Buf + 8, 0x4599); // jrc $25 / jr16 $25
> - write16<E>(Buf + 10, 0x0f02); // move $24, $2
> - relocateOne(Buf, R_MICROMIPS_PC23_S2, GotPltEntryAddr -
> PltEntryAddr);
> + write16<e>(buf, 0x7900); // addiupc $2, (GOTPLT) - .
> + write16<e>(buf + 4, 0xff22); // lw $25, 0($2)
> + write16<e>(buf + 8, 0x4599); // jrc $25 / jr16 $25
> + write16<e>(buf + 10, 0x0f02); // move $24, $2
> + relocateOne(buf, R_MICROMIPS_PC23_S2, gotPltEntryAddr -
> pltEntryAddr);
> }
> return;
> }
>
> - uint32_t LoadInst = ELFT::Is64Bits ? 0xddf90000 : 0x8df90000;
> - uint32_t JrInst = isMipsR6() ? (Config->ZHazardplt ? 0x03200409 :
> 0x03200009)
> - : (Config->ZHazardplt ? 0x03200408 :
> 0x03200008);
> - uint32_t AddInst = ELFT::Is64Bits ? 0x65f80000 : 0x25f80000;
> -
> - write32<E>(Buf, 0x3c0f0000); // lui $15, %hi(.got.plt entry)
> - write32<E>(Buf + 4, LoadInst); // l[wd] $25, %lo(.got.plt
> entry)($15)
> - write32<E>(Buf + 8, JrInst); // jr $25 / jr.hb $25
> - write32<E>(Buf + 12, AddInst); // [d]addiu $24, $15, %lo(.got.plt
> entry)
> - writeValue<E>(Buf, GotPltEntryAddr + 0x8000, 16, 16);
> - writeValue<E>(Buf + 4, GotPltEntryAddr, 16, 0);
> - writeValue<E>(Buf + 12, GotPltEntryAddr, 16, 0);
> + uint32_t loadInst = ELFT::Is64Bits ? 0xddf90000 : 0x8df90000;
> + uint32_t jrInst = isMipsR6() ? (config->zHazardplt ? 0x03200409 :
> 0x03200009)
> + : (config->zHazardplt ? 0x03200408 :
> 0x03200008);
> + uint32_t addInst = ELFT::Is64Bits ? 0x65f80000 : 0x25f80000;
> +
> + write32<e>(buf, 0x3c0f0000); // lui $15, %hi(.got.plt entry)
> + write32<e>(buf + 4, loadInst); // l[wd] $25, %lo(.got.plt
> entry)($15)
> + write32<e>(buf + 8, jrInst); // jr $25 / jr.hb $25
> + write32<e>(buf + 12, addInst); // [d]addiu $24, $15, %lo(.got.plt
> entry)
> + writeValue<e>(buf, gotPltEntryAddr + 0x8000, 16, 16);
> + writeValue<e>(buf + 4, gotPltEntryAddr, 16, 0);
> + writeValue<e>(buf + 12, gotPltEntryAddr, 16, 0);
> }
>
> template <class ELFT>
> -bool MIPS<ELFT>::needsThunk(RelExpr Expr, RelType Type, const
> InputFile *File,
> - uint64_t BranchAddr, const Symbol &S)
> const {
> +bool MIPS<ELFT>::needsThunk(RelExpr expr, RelType type, const
> InputFile *file,
> + uint64_t branchAddr, const Symbol &s)
> const {
> // Any MIPS PIC code function is invoked with its address in
> register $t9.
> // So if we have a branch instruction from non-PIC code to the PIC
> one
> // we cannot make the jump directly and need to create a small stubs
> // to save the target function address.
> // See page 3-38
> https://urldefense.proofpoint.com/v2/url?u=ftp-3A__www.linux-2Dmips.org_pub_linux_mips_doc_ABI_mipsabi.pdf&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=RAkf3Vl5MWzirfmkwopuyQjQ-5uEE95ctSfXOidHyHs&e=
> - if (Type != R_MIPS_26 && Type != R_MIPS_PC26_S2 &&
> - Type != R_MICROMIPS_26_S1 && Type != R_MICROMIPS_PC26_S1)
> + if (type != R_MIPS_26 && type != R_MIPS_PC26_S2 &&
> + type != R_MICROMIPS_26_S1 && type != R_MICROMIPS_PC26_S1)
> return false;
> - auto *F = dyn_cast_or_null<ObjFile<ELFT>>(File);
> - if (!F)
> + auto *f = dyn_cast_or_null<ObjFile<ELFT>>(file);
> + if (!f)
> return false;
> // If current file has PIC code, LA25 stub is not required.
> - if (F->getObj().getHeader()->e_flags & EF_MIPS_PIC)
> + if (f->getObj().getHeader()->e_flags & EF_MIPS_PIC)
> return false;
> - auto *D = dyn_cast<Defined>(&S);
> + auto *d = dyn_cast<Defined>(&s);
> // LA25 is required if target file has PIC code
> // or target symbol is a PIC symbol.
> - return D && isMipsPIC<ELFT>(D);
> + return d && isMipsPIC<ELFT>(d);
> }
>
> template <class ELFT>
> -int64_t MIPS<ELFT>::getImplicitAddend(const uint8_t *Buf, RelType
> Type) const {
> - const endianness E = ELFT::TargetEndianness;
> - switch (Type) {
> +int64_t MIPS<ELFT>::getImplicitAddend(const uint8_t *buf, RelType
> type) const {
> + const endianness e = ELFT::TargetEndianness;
> + switch (type) {
> case R_MIPS_32:
> case R_MIPS_GPREL32:
> case R_MIPS_TLS_DTPREL32:
> case R_MIPS_TLS_TPREL32:
> - return SignExtend64<32>(read32<E>(Buf));
> + return SignExtend64<32>(read32<e>(buf));
> case R_MIPS_26:
> // FIXME (simon): If the relocation target symbol is not a PLT
> entry
> // we should use another expression for calculation:
> // ((A << 2) | (P & 0xf0000000)) >> 2
> - return SignExtend64<28>(read32<E>(Buf) << 2);
> + return SignExtend64<28>(read32<e>(buf) << 2);
> case R_MIPS_GOT16:
> case R_MIPS_HI16:
> case R_MIPS_PCHI16:
> - return SignExtend64<16>(read32<E>(Buf)) << 16;
> + return SignExtend64<16>(read32<e>(buf)) << 16;
> case R_MIPS_GPREL16:
> case R_MIPS_LO16:
> case R_MIPS_PCLO16:
> @@ -389,54 +389,54 @@ int64_t MIPS<ELFT>::getImplicitAddend(co
> case R_MIPS_TLS_DTPREL_LO16:
> case R_MIPS_TLS_TPREL_HI16:
> case R_MIPS_TLS_TPREL_LO16:
> - return SignExtend64<16>(read32<E>(Buf));
> + return SignExtend64<16>(read32<e>(buf));
> case R_MICROMIPS_GOT16:
> case R_MICROMIPS_HI16:
> - return SignExtend64<16>(readShuffle<E>(Buf)) << 16;
> + return SignExtend64<16>(readShuffle<e>(buf)) << 16;
> case R_MICROMIPS_GPREL16:
> case R_MICROMIPS_LO16:
> case R_MICROMIPS_TLS_DTPREL_HI16:
> case R_MICROMIPS_TLS_DTPREL_LO16:
> case R_MICROMIPS_TLS_TPREL_HI16:
> case R_MICROMIPS_TLS_TPREL_LO16:
> - return SignExtend64<16>(readShuffle<E>(Buf));
> + return SignExtend64<16>(readShuffle<e>(buf));
> case R_MICROMIPS_GPREL7_S2:
> - return SignExtend64<9>(readShuffle<E>(Buf) << 2);
> + return SignExtend64<9>(readShuffle<e>(buf) << 2);
> case R_MIPS_PC16:
> - return SignExtend64<18>(read32<E>(Buf) << 2);
> + return SignExtend64<18>(read32<e>(buf) << 2);
> case R_MIPS_PC19_S2:
> - return SignExtend64<21>(read32<E>(Buf) << 2);
> + return SignExtend64<21>(read32<e>(buf) << 2);
> case R_MIPS_PC21_S2:
> - return SignExtend64<23>(read32<E>(Buf) << 2);
> + return SignExtend64<23>(read32<e>(buf) << 2);
> case R_MIPS_PC26_S2:
> - return SignExtend64<28>(read32<E>(Buf) << 2);
> + return SignExtend64<28>(read32<e>(buf) << 2);
> case R_MIPS_PC32:
> - return SignExtend64<32>(read32<E>(Buf));
> + return SignExtend64<32>(read32<e>(buf));
> case R_MICROMIPS_26_S1:
> - return SignExtend64<27>(readShuffle<E>(Buf) << 1);
> + return SignExtend64<27>(readShuffle<e>(buf) << 1);
> case R_MICROMIPS_PC7_S1:
> - return SignExtend64<8>(read16<E>(Buf) << 1);
> + return SignExtend64<8>(read16<e>(buf) << 1);
> case R_MICROMIPS_PC10_S1:
> - return SignExtend64<11>(read16<E>(Buf) << 1);
> + return SignExtend64<11>(read16<e>(buf) << 1);
> case R_MICROMIPS_PC16_S1:
> - return SignExtend64<17>(readShuffle<E>(Buf) << 1);
> + return SignExtend64<17>(readShuffle<e>(buf) << 1);
> case R_MICROMIPS_PC18_S3:
> - return SignExtend64<21>(readShuffle<E>(Buf) << 3);
> + return SignExtend64<21>(readShuffle<e>(buf) << 3);
> case R_MICROMIPS_PC19_S2:
> - return SignExtend64<21>(readShuffle<E>(Buf) << 2);
> + return SignExtend64<21>(readShuffle<e>(buf) << 2);
> case R_MICROMIPS_PC21_S1:
> - return SignExtend64<22>(readShuffle<E>(Buf) << 1);
> + return SignExtend64<22>(readShuffle<e>(buf) << 1);
> case R_MICROMIPS_PC23_S2:
> - return SignExtend64<25>(readShuffle<E>(Buf) << 2);
> + return SignExtend64<25>(readShuffle<e>(buf) << 2);
> case R_MICROMIPS_PC26_S1:
> - return SignExtend64<27>(readShuffle<E>(Buf) << 1);
> + return SignExtend64<27>(readShuffle<e>(buf) << 1);
> default:
> return 0;
> }
> }
>
> static std::pair<uint32_t, uint64_t>
> -calculateMipsRelChain(uint8_t *Loc, RelType Type, uint64_t Val) {
> +calculateMipsRelChain(uint8_t *loc, RelType type, uint64_t val) {
> // MIPS N64 ABI packs multiple relocations into the single
> relocation
> // record. In general, all up to three relocations can have
> arbitrary
> // types. In fact, Clang and GCC uses only a few combinations. For
> now,
> @@ -449,57 +449,57 @@ calculateMipsRelChain(uint8_t *Loc, RelT
> // relocations used to modify result of the first one: extend it to
> // 64-bit, extract high or low part etc. For details, see part 2.9
> Relocation
> // at the
> https://urldefense.proofpoint.com/v2/url?u=https-3A__dmz-2Dportal.mips.com_mw_images_8_82_007-2D4658-2D001.pdf&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=KBo2M0csGBb5gCRdvtStD-6yYUQcOt93n0BDlwIXJVc&e=
> - RelType Type2 = (Type >> 8) & 0xff;
> - RelType Type3 = (Type >> 16) & 0xff;
> - if (Type2 == R_MIPS_NONE && Type3 == R_MIPS_NONE)
> - return std::make_pair(Type, Val);
> - if (Type2 == R_MIPS_64 && Type3 == R_MIPS_NONE)
> - return std::make_pair(Type2, Val);
> - if (Type2 == R_MIPS_SUB && (Type3 == R_MIPS_HI16 || Type3 ==
> R_MIPS_LO16))
> - return std::make_pair(Type3, -Val);
> - error(getErrorLocation(Loc) + "unsupported relocations combination
> " +
> - Twine(Type));
> - return std::make_pair(Type & 0xff, Val);
> -}
> -
> -static bool isBranchReloc(RelType Type) {
> - return Type == R_MIPS_26 || Type == R_MIPS_PC26_S2 ||
> - Type == R_MIPS_PC21_S2 || Type == R_MIPS_PC16;
> -}
> -
> -static bool isMicroBranchReloc(RelType Type) {
> - return Type == R_MICROMIPS_26_S1 || Type == R_MICROMIPS_PC16_S1 ||
> - Type == R_MICROMIPS_PC10_S1 || Type == R_MICROMIPS_PC7_S1;
> + RelType type2 = (type >> 8) & 0xff;
> + RelType type3 = (type >> 16) & 0xff;
> + if (type2 == R_MIPS_NONE && type3 == R_MIPS_NONE)
> + return std::make_pair(type, val);
> + if (type2 == R_MIPS_64 && type3 == R_MIPS_NONE)
> + return std::make_pair(type2, val);
> + if (type2 == R_MIPS_SUB && (type3 == R_MIPS_HI16 || type3 ==
> R_MIPS_LO16))
> + return std::make_pair(type3, -val);
> + error(getErrorLocation(loc) + "unsupported relocations combination
> " +
> + Twine(type));
> + return std::make_pair(type & 0xff, val);
> +}
> +
> +static bool isBranchReloc(RelType type) {
> + return type == R_MIPS_26 || type == R_MIPS_PC26_S2 ||
> + type == R_MIPS_PC21_S2 || type == R_MIPS_PC16;
> +}
> +
> +static bool isMicroBranchReloc(RelType type) {
> + return type == R_MICROMIPS_26_S1 || type == R_MICROMIPS_PC16_S1 ||
> + type == R_MICROMIPS_PC10_S1 || type == R_MICROMIPS_PC7_S1;
> }
>
> template <class ELFT>
> -static uint64_t fixupCrossModeJump(uint8_t *Loc, RelType Type,
> uint64_t Val) {
> +static uint64_t fixupCrossModeJump(uint8_t *loc, RelType type,
> uint64_t val) {
> // Here we need to detect jump/branch from regular MIPS code
> // to a microMIPS target and vice versa. In that cases jump
> // instructions need to be replaced by their "cross-mode"
> // equivalents.
> - const endianness E = ELFT::TargetEndianness;
> - bool IsMicroTgt = Val & 0x1;
> - bool IsCrossJump = (IsMicroTgt && isBranchReloc(Type)) ||
> - (!IsMicroTgt && isMicroBranchReloc(Type));
> - if (!IsCrossJump)
> - return Val;
> + const endianness e = ELFT::TargetEndianness;
> + bool isMicroTgt = val & 0x1;
> + bool isCrossJump = (isMicroTgt && isBranchReloc(type)) ||
> + (!isMicroTgt && isMicroBranchReloc(type));
> + if (!isCrossJump)
> + return val;
>
> - switch (Type) {
> + switch (type) {
> case R_MIPS_26: {
> - uint32_t Inst = read32<E>(Loc) >> 26;
> - if (Inst == 0x3 || Inst == 0x1d) { // JAL or JALX
> - writeValue<E>(Loc, 0x1d << 26, 32, 0);
> - return Val;
> + uint32_t inst = read32<e>(loc) >> 26;
> + if (inst == 0x3 || inst == 0x1d) { // JAL or JALX
> + writeValue<e>(loc, 0x1d << 26, 32, 0);
> + return val;
> }
> break;
> }
> case R_MICROMIPS_26_S1: {
> - uint32_t Inst = readShuffle<E>(Loc) >> 26;
> - if (Inst == 0x3d || Inst == 0x3c) { // JAL32 or JALX32
> - Val >>= 1;
> - writeShuffleValue<E>(Loc, 0x3c << 26, 32, 0);
> - return Val;
> + uint32_t inst = readShuffle<e>(loc) >> 26;
> + if (inst == 0x3d || inst == 0x3c) { // JAL32 or JALX32
> + val >>= 1;
> + writeShuffleValue<e>(loc, 0x3c << 26, 32, 0);
> + return val;
> }
> break;
> }
> @@ -515,68 +515,68 @@ static uint64_t fixupCrossModeJump(uint8
> llvm_unreachable("unexpected jump/branch relocation");
> }
>
> - error(getErrorLocation(Loc) +
> + error(getErrorLocation(loc) +
> "unsupported jump/branch instruction between ISA modes
> referenced by " +
> - toString(Type) + " relocation");
> - return Val;
> + toString(type) + " relocation");
> + return val;
> }
>
> template <class ELFT>
> -void MIPS<ELFT>::relocateOne(uint8_t *Loc, RelType Type, uint64_t
> Val) const {
> - const endianness E = ELFT::TargetEndianness;
> +void MIPS<ELFT>::relocateOne(uint8_t *loc, RelType type, uint64_t
> val) const {
> + const endianness e = ELFT::TargetEndianness;
>
> - if (ELFT::Is64Bits || Config->MipsN32Abi)
> - std::tie(Type, Val) = calculateMipsRelChain(Loc, Type, Val);
> + if (ELFT::Is64Bits || config->mipsN32Abi)
> + std::tie(type, val) = calculateMipsRelChain(loc, type, val);
>
> // Detect cross-mode jump/branch and fix instruction.
> - Val = fixupCrossModeJump<ELFT>(Loc, Type, Val);
> + val = fixupCrossModeJump<ELFT>(loc, type, val);
>
> // Thread pointer and DRP offsets from the start of TLS data area.
> //
> https://urldefense.proofpoint.com/v2/url?u=https-3A__www.linux-2Dmips.org_wiki_NPTL&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=RakKH8VixPi8JXre-dl0635Qb4o3oNmeHdGuOUvYAvQ&e=
> - if (Type == R_MIPS_TLS_DTPREL_HI16 || Type ==
> R_MIPS_TLS_DTPREL_LO16 ||
> - Type == R_MIPS_TLS_DTPREL32 || Type == R_MIPS_TLS_DTPREL64 ||
> - Type == R_MICROMIPS_TLS_DTPREL_HI16 ||
> - Type == R_MICROMIPS_TLS_DTPREL_LO16) {
> - Val -= 0x8000;
> - } else if (Type == R_MIPS_TLS_TPREL_HI16 || Type ==
> R_MIPS_TLS_TPREL_LO16 ||
> - Type == R_MIPS_TLS_TPREL32 || Type == R_MIPS_TLS_TPREL64
> ||
> - Type == R_MICROMIPS_TLS_TPREL_HI16 ||
> - Type == R_MICROMIPS_TLS_TPREL_LO16) {
> - Val -= 0x7000;
> + if (type == R_MIPS_TLS_DTPREL_HI16 || type ==
> R_MIPS_TLS_DTPREL_LO16 ||
> + type == R_MIPS_TLS_DTPREL32 || type == R_MIPS_TLS_DTPREL64 ||
> + type == R_MICROMIPS_TLS_DTPREL_HI16 ||
> + type == R_MICROMIPS_TLS_DTPREL_LO16) {
> + val -= 0x8000;
> + } else if (type == R_MIPS_TLS_TPREL_HI16 || type ==
> R_MIPS_TLS_TPREL_LO16 ||
> + type == R_MIPS_TLS_TPREL32 || type == R_MIPS_TLS_TPREL64
> ||
> + type == R_MICROMIPS_TLS_TPREL_HI16 ||
> + type == R_MICROMIPS_TLS_TPREL_LO16) {
> + val -= 0x7000;
> }
>
> - switch (Type) {
> + switch (type) {
> case R_MIPS_32:
> case R_MIPS_GPREL32:
> case R_MIPS_TLS_DTPREL32:
> case R_MIPS_TLS_TPREL32:
> - write32<E>(Loc, Val);
> + write32<e>(loc, val);
> break;
> case R_MIPS_64:
> case R_MIPS_TLS_DTPREL64:
> case R_MIPS_TLS_TPREL64:
> - write64<E>(Loc, Val);
> + write64<e>(loc, val);
> break;
> case R_MIPS_26:
> - writeValue<E>(Loc, Val, 26, 2);
> + writeValue<e>(loc, val, 26, 2);
> break;
> case R_MIPS_GOT16:
> // The R_MIPS_GOT16 relocation's value in "relocatable" linking
> mode
> // is updated addend (not a GOT index). In that case write high
> 16 bits
> // to store a correct addend value.
> - if (Config->Relocatable) {
> - writeValue<E>(Loc, Val + 0x8000, 16, 16);
> + if (config->relocatable) {
> + writeValue<e>(loc, val + 0x8000, 16, 16);
> } else {
> - checkInt(Loc, Val, 16, Type);
> - writeValue<E>(Loc, Val, 16, 0);
> + checkInt(loc, val, 16, type);
> + writeValue<e>(loc, val, 16, 0);
> }
> break;
> case R_MICROMIPS_GOT16:
> - if (Config->Relocatable) {
> - writeShuffleValue<E>(Loc, Val + 0x8000, 16, 16);
> + if (config->relocatable) {
> + writeShuffleValue<e>(loc, val + 0x8000, 16, 16);
> } else {
> - checkInt(Loc, Val, 16, Type);
> - writeShuffleValue<E>(Loc, Val, 16, 0);
> + checkInt(loc, val, 16, type);
> + writeShuffleValue<e>(loc, val, 16, 0);
> }
> break;
> case R_MIPS_CALL16:
> @@ -586,7 +586,7 @@ void MIPS<ELFT>::relocateOne(uint8_t *Lo
> case R_MIPS_TLS_GD:
> case R_MIPS_TLS_GOTTPREL:
> case R_MIPS_TLS_LDM:
> - checkInt(Loc, Val, 16, Type);
> + checkInt(loc, val, 16, type);
> LLVM_FALLTHROUGH;
> case R_MIPS_CALL_LO16:
> case R_MIPS_GOT_LO16:
> @@ -595,13 +595,13 @@ void MIPS<ELFT>::relocateOne(uint8_t *Lo
> case R_MIPS_PCLO16:
> case R_MIPS_TLS_DTPREL_LO16:
> case R_MIPS_TLS_TPREL_LO16:
> - writeValue<E>(Loc, Val, 16, 0);
> + writeValue<e>(loc, val, 16, 0);
> break;
> case R_MICROMIPS_GPREL16:
> case R_MICROMIPS_TLS_GD:
> case R_MICROMIPS_TLS_LDM:
> - checkInt(Loc, Val, 16, Type);
> - writeShuffleValue<E>(Loc, Val, 16, 0);
> + checkInt(loc, val, 16, type);
> + writeShuffleValue<e>(loc, val, 16, 0);
> break;
> case R_MICROMIPS_CALL16:
> case R_MICROMIPS_CALL_LO16:
> @@ -609,11 +609,11 @@ void MIPS<ELFT>::relocateOne(uint8_t *Lo
> case R_MICROMIPS_TLS_DTPREL_LO16:
> case R_MICROMIPS_TLS_GOTTPREL:
> case R_MICROMIPS_TLS_TPREL_LO16:
> - writeShuffleValue<E>(Loc, Val, 16, 0);
> + writeShuffleValue<e>(loc, val, 16, 0);
> break;
> case R_MICROMIPS_GPREL7_S2:
> - checkInt(Loc, Val, 7, Type);
> - writeShuffleValue<E>(Loc, Val, 7, 2);
> + checkInt(loc, val, 7, type);
> + writeShuffleValue<e>(loc, val, 7, 2);
> break;
> case R_MIPS_CALL_HI16:
> case R_MIPS_GOT_HI16:
> @@ -621,113 +621,113 @@ void MIPS<ELFT>::relocateOne(uint8_t *Lo
> case R_MIPS_PCHI16:
> case R_MIPS_TLS_DTPREL_HI16:
> case R_MIPS_TLS_TPREL_HI16:
> - writeValue<E>(Loc, Val + 0x8000, 16, 16);
> + writeValue<e>(loc, val + 0x8000, 16, 16);
> break;
> case R_MICROMIPS_CALL_HI16:
> case R_MICROMIPS_GOT_HI16:
> case R_MICROMIPS_HI16:
> case R_MICROMIPS_TLS_DTPREL_HI16:
> case R_MICROMIPS_TLS_TPREL_HI16:
> - writeShuffleValue<E>(Loc, Val + 0x8000, 16, 16);
> + writeShuffleValue<e>(loc, val + 0x8000, 16, 16);
> break;
> case R_MIPS_HIGHER:
> - writeValue<E>(Loc, Val + 0x80008000, 16, 32);
> + writeValue<e>(loc, val + 0x80008000, 16, 32);
> break;
> case R_MIPS_HIGHEST:
> - writeValue<E>(Loc, Val + 0x800080008000, 16, 48);
> + writeValue<e>(loc, val + 0x800080008000, 16, 48);
> break;
> case R_MIPS_JALR:
> case R_MICROMIPS_JALR:
> // Ignore this optimization relocation for now
> break;
> case R_MIPS_PC16:
> - checkAlignment(Loc, Val, 4, Type);
> - checkInt(Loc, Val, 18, Type);
> - writeValue<E>(Loc, Val, 16, 2);
> + checkAlignment(loc, val, 4, type);
> + checkInt(loc, val, 18, type);
> + writeValue<e>(loc, val, 16, 2);
> break;
> case R_MIPS_PC19_S2:
> - checkAlignment(Loc, Val, 4, Type);
> - checkInt(Loc, Val, 21, Type);
> - writeValue<E>(Loc, Val, 19, 2);
> + checkAlignment(loc, val, 4, type);
> + checkInt(loc, val, 21, type);
> + writeValue<e>(loc, val, 19, 2);
> break;
> case R_MIPS_PC21_S2:
> - checkAlignment(Loc, Val, 4, Type);
> - checkInt(Loc, Val, 23, Type);
> - writeValue<E>(Loc, Val, 21, 2);
> + checkAlignment(loc, val, 4, type);
> + checkInt(loc, val, 23, type);
> + writeValue<e>(loc, val, 21, 2);
> break;
> case R_MIPS_PC26_S2:
> - checkAlignment(Loc, Val, 4, Type);
> - checkInt(Loc, Val, 28, Type);
> - writeValue<E>(Loc, Val, 26, 2);
> + checkAlignment(loc, val, 4, type);
> + checkInt(loc, val, 28, type);
> + writeValue<e>(loc, val, 26, 2);
> break;
> case R_MIPS_PC32:
> - writeValue<E>(Loc, Val, 32, 0);
> + writeValue<e>(loc, val, 32, 0);
> break;
> case R_MICROMIPS_26_S1:
> case R_MICROMIPS_PC26_S1:
> - checkInt(Loc, Val, 27, Type);
> - writeShuffleValue<E>(Loc, Val, 26, 1);
> + checkInt(loc, val, 27, type);
> + writeShuffleValue<e>(loc, val, 26, 1);
> break;
> case R_MICROMIPS_PC7_S1:
> - checkInt(Loc, Val, 8, Type);
> - writeMicroRelocation16<E>(Loc, Val, 7, 1);
> + checkInt(loc, val, 8, type);
> + writeMicroRelocation16<e>(loc, val, 7, 1);
> break;
> case R_MICROMIPS_PC10_S1:
> - checkInt(Loc, Val, 11, Type);
> - writeMicroRelocation16<E>(Loc, Val, 10, 1);
> + checkInt(loc, val, 11, type);
> + writeMicroRelocation16<e>(loc, val, 10, 1);
> break;
> case R_MICROMIPS_PC16_S1:
> - checkInt(Loc, Val, 17, Type);
> - writeShuffleValue<E>(Loc, Val, 16, 1);
> + checkInt(loc, val, 17, type);
> + writeShuffleValue<e>(loc, val, 16, 1);
> break;
> case R_MICROMIPS_PC18_S3:
> - checkInt(Loc, Val, 21, Type);
> - writeShuffleValue<E>(Loc, Val, 18, 3);
> + checkInt(loc, val, 21, type);
> + writeShuffleValue<e>(loc, val, 18, 3);
> break;
> case R_MICROMIPS_PC19_S2:
> - checkInt(Loc, Val, 21, Type);
> - writeShuffleValue<E>(Loc, Val, 19, 2);
> + checkInt(loc, val, 21, type);
> + writeShuffleValue<e>(loc, val, 19, 2);
> break;
> case R_MICROMIPS_PC21_S1:
> - checkInt(Loc, Val, 22, Type);
> - writeShuffleValue<E>(Loc, Val, 21, 1);
> + checkInt(loc, val, 22, type);
> + writeShuffleValue<e>(loc, val, 21, 1);
> break;
> case R_MICROMIPS_PC23_S2:
> - checkInt(Loc, Val, 25, Type);
> - writeShuffleValue<E>(Loc, Val, 23, 2);
> + checkInt(loc, val, 25, type);
> + writeShuffleValue<e>(loc, val, 23, 2);
> break;
> default:
> llvm_unreachable("unknown relocation");
> }
> }
>
> -template <class ELFT> bool MIPS<ELFT>::usesOnlyLowPageBits(RelType
> Type) const {
> - return Type == R_MIPS_LO16 || Type == R_MIPS_GOT_OFST ||
> - Type == R_MICROMIPS_LO16;
> +template <class ELFT> bool MIPS<ELFT>::usesOnlyLowPageBits(RelType
> type) const {
> + return type == R_MIPS_LO16 || type == R_MIPS_GOT_OFST ||
> + type == R_MICROMIPS_LO16;
> }
>
> // Return true if the symbol is a PIC function.
> -template <class ELFT> bool elf::isMipsPIC(const Defined *Sym) {
> - if (!Sym->isFunc())
> +template <class ELFT> bool elf::isMipsPIC(const Defined *sym) {
> + if (!sym->isFunc())
> return false;
>
> - if (Sym->StOther & STO_MIPS_PIC)
> + if (sym->stOther & STO_MIPS_PIC)
> return true;
>
> - if (!Sym->Section)
> + if (!sym->section)
> return false;
>
> - ObjFile<ELFT> *File =
> - cast<InputSectionBase>(Sym->Section)->template getFile<ELFT>();
> - if (!File)
> + ObjFile<ELFT> *file =
> + cast<InputSectionBase>(sym->section)->template getFile<ELFT>();
> + if (!file)
> return false;
>
> - return File->getObj().getHeader()->e_flags & EF_MIPS_PIC;
> + return file->getObj().getHeader()->e_flags & EF_MIPS_PIC;
> }
>
> template <class ELFT> TargetInfo *elf::getMipsTargetInfo() {
> - static MIPS<ELFT> Target;
> - return &Target;
> + static MIPS<ELFT> target;
> + return ⌖
> }
>
> template TargetInfo *elf::getMipsTargetInfo<ELF32LE>();
>
> Modified: lld/trunk/ELF/Arch/MipsArchTree.cpp
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_Arch_MipsArchTree.cpp-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=Tl66Mtod-vaCxh1JMVaVHA93eIAgiquVNODVRRzeyzY&e=
>
> ==============================================================================
> --- lld/trunk/ELF/Arch/MipsArchTree.cpp (original)
> +++ lld/trunk/ELF/Arch/MipsArchTree.cpp Tue Jul 9 22:00:37 2019
> @@ -28,18 +28,18 @@ using namespace lld::elf;
>
> namespace {
> struct ArchTreeEdge {
> - uint32_t Child;
> - uint32_t Parent;
> + uint32_t child;
> + uint32_t parent;
> };
>
> struct FileFlags {
> - InputFile *File;
> - uint32_t Flags;
> + InputFile *file;
> + uint32_t flags;
> };
> } // namespace
>
> -static StringRef getAbiName(uint32_t Flags) {
> - switch (Flags) {
> +static StringRef getAbiName(uint32_t flags) {
> + switch (flags) {
> case 0:
> return "n64";
> case EF_MIPS_ABI2:
> @@ -57,76 +57,76 @@ static StringRef getAbiName(uint32_t Fla
> }
> }
>
> -static StringRef getNanName(bool IsNan2008) {
> - return IsNan2008 ? "2008" : "legacy";
> +static StringRef getNanName(bool isNan2008) {
> + return isNan2008 ? "2008" : "legacy";
> }
>
> -static StringRef getFpName(bool IsFp64) { return IsFp64 ? "64" :
> "32"; }
> +static StringRef getFpName(bool isFp64) { return isFp64 ? "64" :
> "32"; }
>
> -static void checkFlags(ArrayRef<FileFlags> Files) {
> - assert(!Files.empty() && "expected non-empty file list");
> +static void checkFlags(ArrayRef<FileFlags> files) {
> + assert(!files.empty() && "expected non-empty file list");
>
> - uint32_t ABI = Files[0].Flags & (EF_MIPS_ABI | EF_MIPS_ABI2);
> - bool Nan = Files[0].Flags & EF_MIPS_NAN2008;
> - bool Fp = Files[0].Flags & EF_MIPS_FP64;
> + uint32_t abi = files[0].flags & (EF_MIPS_ABI | EF_MIPS_ABI2);
> + bool nan = files[0].flags & EF_MIPS_NAN2008;
> + bool fp = files[0].flags & EF_MIPS_FP64;
>
> - for (const FileFlags &F : Files) {
> - if (Config->Is64 && F.Flags & EF_MIPS_MICROMIPS)
> - error(toString(F.File) + ": microMIPS 64-bit is not supported");
> + for (const FileFlags &f : files) {
> + if (config->is64 && f.flags & EF_MIPS_MICROMIPS)
> + error(toString(f.file) + ": microMIPS 64-bit is not supported");
>
> - uint32_t ABI2 = F.Flags & (EF_MIPS_ABI | EF_MIPS_ABI2);
> - if (ABI != ABI2)
> - error(toString(F.File) + ": ABI '" + getAbiName(ABI2) +
> - "' is incompatible with target ABI '" + getAbiName(ABI) +
> "'");
> + uint32_t abi2 = f.flags & (EF_MIPS_ABI | EF_MIPS_ABI2);
> + if (abi != abi2)
> + error(toString(f.file) + ": ABI '" + getAbiName(abi2) +
> + "' is incompatible with target ABI '" + getAbiName(abi) +
> "'");
>
> - bool Nan2 = F.Flags & EF_MIPS_NAN2008;
> - if (Nan != Nan2)
> - error(toString(F.File) + ": -mnan=" + getNanName(Nan2) +
> - " is incompatible with target -mnan=" + getNanName(Nan));
> + bool nan2 = f.flags & EF_MIPS_NAN2008;
> + if (nan != nan2)
> + error(toString(f.file) + ": -mnan=" + getNanName(nan2) +
> + " is incompatible with target -mnan=" + getNanName(nan));
>
> - bool Fp2 = F.Flags & EF_MIPS_FP64;
> - if (Fp != Fp2)
> - error(toString(F.File) + ": -mfp" + getFpName(Fp2) +
> - " is incompatible with target -mfp" + getFpName(Fp));
> + bool fp2 = f.flags & EF_MIPS_FP64;
> + if (fp != fp2)
> + error(toString(f.file) + ": -mfp" + getFpName(fp2) +
> + " is incompatible with target -mfp" + getFpName(fp));
> }
> }
>
> -static uint32_t getMiscFlags(ArrayRef<FileFlags> Files) {
> - uint32_t Ret = 0;
> - for (const FileFlags &F : Files)
> - Ret |= F.Flags &
> +static uint32_t getMiscFlags(ArrayRef<FileFlags> files) {
> + uint32_t ret = 0;
> + for (const FileFlags &f : files)
> + ret |= f.flags &
> (EF_MIPS_ABI | EF_MIPS_ABI2 | EF_MIPS_ARCH_ASE |
> EF_MIPS_NOREORDER |
> EF_MIPS_MICROMIPS | EF_MIPS_NAN2008 | EF_MIPS_32BITMODE);
> - return Ret;
> + return ret;
> }
>
> -static uint32_t getPicFlags(ArrayRef<FileFlags> Files) {
> +static uint32_t getPicFlags(ArrayRef<FileFlags> files) {
> // Check PIC/non-PIC compatibility.
> - bool IsPic = Files[0].Flags & (EF_MIPS_PIC | EF_MIPS_CPIC);
> - for (const FileFlags &F : Files.slice(1)) {
> - bool IsPic2 = F.Flags & (EF_MIPS_PIC | EF_MIPS_CPIC);
> - if (IsPic && !IsPic2)
> - warn(toString(F.File) +
> + bool isPic = files[0].flags & (EF_MIPS_PIC | EF_MIPS_CPIC);
> + for (const FileFlags &f : files.slice(1)) {
> + bool isPic2 = f.flags & (EF_MIPS_PIC | EF_MIPS_CPIC);
> + if (isPic && !isPic2)
> + warn(toString(f.file) +
> ": linking non-abicalls code with abicalls code " +
> - toString(Files[0].File));
> - if (!IsPic && IsPic2)
> - warn(toString(F.File) +
> + toString(files[0].file));
> + if (!isPic && isPic2)
> + warn(toString(f.file) +
> ": linking abicalls code with non-abicalls code " +
> - toString(Files[0].File));
> + toString(files[0].file));
> }
>
> // Compute the result PIC/non-PIC flag.
> - uint32_t Ret = Files[0].Flags & (EF_MIPS_PIC | EF_MIPS_CPIC);
> - for (const FileFlags &F : Files.slice(1))
> - Ret &= F.Flags & (EF_MIPS_PIC | EF_MIPS_CPIC);
> + uint32_t ret = files[0].flags & (EF_MIPS_PIC | EF_MIPS_CPIC);
> + for (const FileFlags &f : files.slice(1))
> + ret &= f.flags & (EF_MIPS_PIC | EF_MIPS_CPIC);
>
> // PIC code is inherently CPIC and may not set CPIC flag explicitly.
> - if (Ret & EF_MIPS_PIC)
> - Ret |= EF_MIPS_CPIC;
> - return Ret;
> + if (ret & EF_MIPS_PIC)
> + ret |= EF_MIPS_CPIC;
> + return ret;
> }
>
> -static ArchTreeEdge ArchTree[] = {
> +static ArchTreeEdge archTree[] = {
> // MIPS32R6 and MIPS64R6 are not compatible with other extensions
> // MIPS64R2 extensions.
> {EF_MIPS_ARCH_64R2 | EF_MIPS_MACH_OCTEON3, EF_MIPS_ARCH_64R2},
> @@ -166,25 +166,25 @@ static ArchTreeEdge ArchTree[] = {
> {EF_MIPS_ARCH_2, EF_MIPS_ARCH_1},
> };
>
> -static bool isArchMatched(uint32_t New, uint32_t Res) {
> - if (New == Res)
> +static bool isArchMatched(uint32_t New, uint32_t res) {
> + if (New == res)
> return true;
> - if (New == EF_MIPS_ARCH_32 && isArchMatched(EF_MIPS_ARCH_64, Res))
> + if (New == EF_MIPS_ARCH_32 && isArchMatched(EF_MIPS_ARCH_64, res))
> return true;
> - if (New == EF_MIPS_ARCH_32R2 && isArchMatched(EF_MIPS_ARCH_64R2,
> Res))
> + if (New == EF_MIPS_ARCH_32R2 && isArchMatched(EF_MIPS_ARCH_64R2,
> res))
> return true;
> - for (const auto &Edge : ArchTree) {
> - if (Res == Edge.Child) {
> - Res = Edge.Parent;
> - if (Res == New)
> + for (const auto &edge : archTree) {
> + if (res == edge.child) {
> + res = edge.parent;
> + if (res == New)
> return true;
> }
> }
> return false;
> }
>
> -static StringRef getMachName(uint32_t Flags) {
> - switch (Flags & EF_MIPS_MACH) {
> +static StringRef getMachName(uint32_t flags) {
> + switch (flags & EF_MIPS_MACH) {
> case EF_MIPS_MACH_NONE:
> return "";
> case EF_MIPS_MACH_3900:
> @@ -228,8 +228,8 @@ static StringRef getMachName(uint32_t Fl
> }
> }
>
> -static StringRef getArchName(uint32_t Flags) {
> - switch (Flags & EF_MIPS_ARCH) {
> +static StringRef getArchName(uint32_t flags) {
> + switch (flags & EF_MIPS_ARCH) {
> case EF_MIPS_ARCH_1:
> return "mips1";
> case EF_MIPS_ARCH_2:
> @@ -257,12 +257,12 @@ static StringRef getArchName(uint32_t Fl
> }
> }
>
> -static std::string getFullArchName(uint32_t Flags) {
> - StringRef Arch = getArchName(Flags);
> - StringRef Mach = getMachName(Flags);
> - if (Mach.empty())
> - return Arch.str();
> - return (Arch + " (" + Mach + ")").str();
> +static std::string getFullArchName(uint32_t flags) {
> + StringRef arch = getArchName(flags);
> + StringRef mach = getMachName(flags);
> + if (mach.empty())
> + return arch.str();
> + return (arch + " (" + mach + ")").str();
> }
>
> // There are (arguably too) many MIPS ISAs out there. Their
> relationships
> @@ -274,55 +274,55 @@ static std::string getFullArchName(uint3
> // Output file gets EF_MIPS_ARCH_2 flag. From the other side mips3
> and mips32
> // are incompatible because nor mips3 is a parent for misp32, nor
> mips32
> // is a parent for mips3.
> -static uint32_t getArchFlags(ArrayRef<FileFlags> Files) {
> - uint32_t Ret = Files[0].Flags & (EF_MIPS_ARCH | EF_MIPS_MACH);
> +static uint32_t getArchFlags(ArrayRef<FileFlags> files) {
> + uint32_t ret = files[0].flags & (EF_MIPS_ARCH | EF_MIPS_MACH);
>
> - for (const FileFlags &F : Files.slice(1)) {
> - uint32_t New = F.Flags & (EF_MIPS_ARCH | EF_MIPS_MACH);
> + for (const FileFlags &f : files.slice(1)) {
> + uint32_t New = f.flags & (EF_MIPS_ARCH | EF_MIPS_MACH);
>
> // Check ISA compatibility.
> - if (isArchMatched(New, Ret))
> + if (isArchMatched(New, ret))
> continue;
> - if (!isArchMatched(Ret, New)) {
> - error("incompatible target ISA:\n>>> " +
> toString(Files[0].File) + ": " +
> - getFullArchName(Ret) + "\n>>> " + toString(F.File) + ": "
> +
> + if (!isArchMatched(ret, New)) {
> + error("incompatible target ISA:\n>>> " +
> toString(files[0].file) + ": " +
> + getFullArchName(ret) + "\n>>> " + toString(f.file) + ": "
> +
> getFullArchName(New));
> return 0;
> }
> - Ret = New;
> + ret = New;
> }
> - return Ret;
> + return ret;
> }
>
> template <class ELFT> uint32_t elf::calcMipsEFlags() {
> - std::vector<FileFlags> V;
> - for (InputFile *F : ObjectFiles)
> - V.push_back({F,
> cast<ObjFile<ELFT>>(F)->getObj().getHeader()->e_flags});
> - if (V.empty())
> + std::vector<FileFlags> v;
> + for (InputFile *f : objectFiles)
> + v.push_back({f,
> cast<ObjFile<ELFT>>(f)->getObj().getHeader()->e_flags});
> + if (v.empty())
> return 0;
> - checkFlags(V);
> - return getMiscFlags(V) | getPicFlags(V) | getArchFlags(V);
> + checkFlags(v);
> + return getMiscFlags(v) | getPicFlags(v) | getArchFlags(v);
> }
>
> -static int compareMipsFpAbi(uint8_t FpA, uint8_t FpB) {
> - if (FpA == FpB)
> +static int compareMipsFpAbi(uint8_t fpA, uint8_t fpB) {
> + if (fpA == fpB)
> return 0;
> - if (FpB == Mips::Val_GNU_MIPS_ABI_FP_ANY)
> + if (fpB == Mips::Val_GNU_MIPS_ABI_FP_ANY)
> return 1;
> - if (FpB == Mips::Val_GNU_MIPS_ABI_FP_64A &&
> - FpA == Mips::Val_GNU_MIPS_ABI_FP_64)
> + if (fpB == Mips::Val_GNU_MIPS_ABI_FP_64A &&
> + fpA == Mips::Val_GNU_MIPS_ABI_FP_64)
> return 1;
> - if (FpB != Mips::Val_GNU_MIPS_ABI_FP_XX)
> + if (fpB != Mips::Val_GNU_MIPS_ABI_FP_XX)
> return -1;
> - if (FpA == Mips::Val_GNU_MIPS_ABI_FP_DOUBLE ||
> - FpA == Mips::Val_GNU_MIPS_ABI_FP_64 ||
> - FpA == Mips::Val_GNU_MIPS_ABI_FP_64A)
> + if (fpA == Mips::Val_GNU_MIPS_ABI_FP_DOUBLE ||
> + fpA == Mips::Val_GNU_MIPS_ABI_FP_64 ||
> + fpA == Mips::Val_GNU_MIPS_ABI_FP_64A)
> return 1;
> return -1;
> }
>
> -static StringRef getMipsFpAbiName(uint8_t FpAbi) {
> - switch (FpAbi) {
> +static StringRef getMipsFpAbiName(uint8_t fpAbi) {
> + switch (fpAbi) {
> case Mips::Val_GNU_MIPS_ABI_FP_ANY:
> return "any";
> case Mips::Val_GNU_MIPS_ABI_FP_DOUBLE:
> @@ -344,43 +344,43 @@ static StringRef getMipsFpAbiName(uint8_
> }
> }
>
> -uint8_t elf::getMipsFpAbiFlag(uint8_t OldFlag, uint8_t NewFlag,
> - StringRef FileName) {
> - if (compareMipsFpAbi(NewFlag, OldFlag) >= 0)
> - return NewFlag;
> - if (compareMipsFpAbi(OldFlag, NewFlag) < 0)
> - error(FileName + ": floating point ABI '" +
> getMipsFpAbiName(NewFlag) +
> +uint8_t elf::getMipsFpAbiFlag(uint8_t oldFlag, uint8_t newFlag,
> + StringRef fileName) {
> + if (compareMipsFpAbi(newFlag, oldFlag) >= 0)
> + return newFlag;
> + if (compareMipsFpAbi(oldFlag, newFlag) < 0)
> + error(fileName + ": floating point ABI '" +
> getMipsFpAbiName(newFlag) +
> "' is incompatible with target floating point ABI '" +
> - getMipsFpAbiName(OldFlag) + "'");
> - return OldFlag;
> + getMipsFpAbiName(oldFlag) + "'");
> + return oldFlag;
> }
>
> -template <class ELFT> static bool isN32Abi(const InputFile *F) {
> - if (auto *EF = dyn_cast<ELFFileBase>(F))
> - return EF->template getObj<ELFT>().getHeader()->e_flags &
> EF_MIPS_ABI2;
> +template <class ELFT> static bool isN32Abi(const InputFile *f) {
> + if (auto *ef = dyn_cast<ELFFileBase>(f))
> + return ef->template getObj<ELFT>().getHeader()->e_flags &
> EF_MIPS_ABI2;
> return false;
> }
>
> -bool elf::isMipsN32Abi(const InputFile *F) {
> - switch (Config->EKind) {
> +bool elf::isMipsN32Abi(const InputFile *f) {
> + switch (config->ekind) {
> case ELF32LEKind:
> - return isN32Abi<ELF32LE>(F);
> + return isN32Abi<ELF32LE>(f);
> case ELF32BEKind:
> - return isN32Abi<ELF32BE>(F);
> + return isN32Abi<ELF32BE>(f);
> case ELF64LEKind:
> - return isN32Abi<ELF64LE>(F);
> + return isN32Abi<ELF64LE>(f);
> case ELF64BEKind:
> - return isN32Abi<ELF64BE>(F);
> + return isN32Abi<ELF64BE>(f);
> default:
> llvm_unreachable("unknown Config->EKind");
> }
> }
>
> -bool elf::isMicroMips() { return Config->EFlags & EF_MIPS_MICROMIPS; }
> +bool elf::isMicroMips() { return config->eflags & EF_MIPS_MICROMIPS; }
>
> bool elf::isMipsR6() {
> - uint32_t Arch = Config->EFlags & EF_MIPS_ARCH;
> - return Arch == EF_MIPS_ARCH_32R6 || Arch == EF_MIPS_ARCH_64R6;
> + uint32_t arch = config->eflags & EF_MIPS_ARCH;
> + return arch == EF_MIPS_ARCH_32R6 || arch == EF_MIPS_ARCH_64R6;
> }
>
> template uint32_t elf::calcMipsEFlags<ELF32LE>();
>
> Modified: lld/trunk/ELF/Arch/PPC.cpp
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_Arch_PPC.cpp-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=IWqzOe31N6VoM_s4Ylt8_bMBd6TmS7RY8fsmuAHgFd4&e=
>
> ==============================================================================
> --- lld/trunk/ELF/Arch/PPC.cpp (original)
> +++ lld/trunk/ELF/Arch/PPC.cpp Tue Jul 9 22:00:37 2019
> @@ -23,45 +23,45 @@ namespace {
> class PPC final : public TargetInfo {
> public:
> PPC();
> - RelExpr getRelExpr(RelType Type, const Symbol &S,
> - const uint8_t *Loc) const override;
> - RelType getDynRel(RelType Type) const override;
> - void writeGotHeader(uint8_t *Buf) const override;
> - void writePltHeader(uint8_t *Buf) const override {
> + RelExpr getRelExpr(RelType type, const Symbol &s,
> + const uint8_t *loc) const override;
> + RelType getDynRel(RelType type) const override;
> + void writeGotHeader(uint8_t *buf) const override;
> + void writePltHeader(uint8_t *buf) const override {
> llvm_unreachable("should call writePPC32GlinkSection() instead");
> }
> - void writePlt(uint8_t *Buf, uint64_t GotPltEntryAddr, uint64_t
> PltEntryAddr,
> - int32_t Index, unsigned RelOff) const override {
> + void writePlt(uint8_t *buf, uint64_t gotPltEntryAddr, uint64_t
> pltEntryAddr,
> + int32_t index, unsigned relOff) const override {
> llvm_unreachable("should call writePPC32GlinkSection() instead");
> }
> - void writeGotPlt(uint8_t *Buf, const Symbol &S) const override;
> - bool needsThunk(RelExpr Expr, RelType RelocType, const InputFile
> *File,
> - uint64_t BranchAddr, const Symbol &S) const
> override;
> + void writeGotPlt(uint8_t *buf, const Symbol &s) const override;
> + bool needsThunk(RelExpr expr, RelType relocType, const InputFile
> *file,
> + uint64_t branchAddr, const Symbol &s) const
> override;
> uint32_t getThunkSectionSpacing() const override;
> - bool inBranchRange(RelType Type, uint64_t Src, uint64_t Dst) const
> override;
> - void relocateOne(uint8_t *Loc, RelType Type, uint64_t Val) const
> override;
> - RelExpr adjustRelaxExpr(RelType Type, const uint8_t *Data,
> - RelExpr Expr) const override;
> - int getTlsGdRelaxSkip(RelType Type) const override;
> - void relaxTlsGdToIe(uint8_t *Loc, RelType Type, uint64_t Val) const
> override;
> - void relaxTlsGdToLe(uint8_t *Loc, RelType Type, uint64_t Val) const
> override;
> - void relaxTlsLdToLe(uint8_t *Loc, RelType Type, uint64_t Val) const
> override;
> - void relaxTlsIeToLe(uint8_t *Loc, RelType Type, uint64_t Val) const
> override;
> + bool inBranchRange(RelType type, uint64_t src, uint64_t dst) const
> override;
> + void relocateOne(uint8_t *loc, RelType type, uint64_t val) const
> override;
> + RelExpr adjustRelaxExpr(RelType type, const uint8_t *data,
> + RelExpr expr) const override;
> + int getTlsGdRelaxSkip(RelType type) const override;
> + void relaxTlsGdToIe(uint8_t *loc, RelType type, uint64_t val) const
> override;
> + void relaxTlsGdToLe(uint8_t *loc, RelType type, uint64_t val) const
> override;
> + void relaxTlsLdToLe(uint8_t *loc, RelType type, uint64_t val) const
> override;
> + void relaxTlsIeToLe(uint8_t *loc, RelType type, uint64_t val) const
> override;
> };
> } // namespace
>
> -static uint16_t lo(uint32_t V) { return V; }
> -static uint16_t ha(uint32_t V) { return (V + 0x8000) >> 16; }
> +static uint16_t lo(uint32_t v) { return v; }
> +static uint16_t ha(uint32_t v) { return (v + 0x8000) >> 16; }
>
> -static uint32_t readFromHalf16(const uint8_t *Loc) {
> - return read32(Config->IsLE ? Loc : Loc - 2);
> +static uint32_t readFromHalf16(const uint8_t *loc) {
> + return read32(config->isLE ? loc : loc - 2);
> }
>
> -static void writeFromHalf16(uint8_t *Loc, uint32_t Insn) {
> - write32(Config->IsLE ? Loc : Loc - 2, Insn);
> +static void writeFromHalf16(uint8_t *loc, uint32_t insn) {
> + write32(config->isLE ? loc : loc - 2, insn);
> }
>
> -void elf::writePPC32GlinkSection(uint8_t *Buf, size_t NumEntries) {
> +void elf::writePPC32GlinkSection(uint8_t *buf, size_t numEntries) {
> // On PPC Secure PLT ABI, bl foo at plt jumps to a call stub, which
> loads an
> // absolute address from a specific .plt slot (usually called
> .got.plt on
> // other targets) and jumps there.
> @@ -72,124 +72,124 @@ void elf::writePPC32GlinkSection(uint8_t
> // instruction in .glink, filled in by PPC::writeGotPlt().
>
> // Write N `b PLTresolve` first.
> - for (size_t I = 0; I != NumEntries; ++I)
> - write32(Buf + 4 * I, 0x48000000 | 4 * (NumEntries - I));
> - Buf += 4 * NumEntries;
> + for (size_t i = 0; i != numEntries; ++i)
> + write32(buf + 4 * i, 0x48000000 | 4 * (numEntries - i));
> + buf += 4 * numEntries;
>
> // Then write PLTresolve(), which has two forms: PIC and non-PIC.
> PLTresolve()
> // computes the PLT index (by computing the distance from the
> landing b to
> // itself) and calls _dl_runtime_resolve() (in glibc).
> - uint32_t GOT = In.Got->getVA();
> - uint32_t Glink = In.Plt->getVA(); // VA of .glink
> - const uint8_t *End = Buf + 64;
> - if (Config->Pic) {
> - uint32_t AfterBcl = In.Plt->getSize() - Target->PltHeaderSize +
> 12;
> - uint32_t GotBcl = GOT + 4 - (Glink + AfterBcl);
> - write32(Buf + 0, 0x3d6b0000 | ha(AfterBcl)); // addis
> r11,r11,1f-glink at ha
> - write32(Buf + 4, 0x7c0802a6); // mflr r0
> - write32(Buf + 8, 0x429f0005); // bcl 20,30,.+4
> - write32(Buf + 12, 0x396b0000 | lo(AfterBcl)); // 1: addi
> r11,r11,1b-.glink at l
> - write32(Buf + 16, 0x7d8802a6); // mflr r12
> - write32(Buf + 20, 0x7c0803a6); // mtlr r0
> - write32(Buf + 24, 0x7d6c5850); // sub r11,r11,r12
> - write32(Buf + 28, 0x3d8c0000 | ha(GotBcl)); // addis
> 12,12,GOT+4-1b at ha
> - if (ha(GotBcl) == ha(GotBcl + 4)) {
> - write32(Buf + 32, 0x800c0000 | lo(GotBcl)); // lwz
> r0,r12,GOT+4-1b at l(r12)
> - write32(Buf + 36,
> - 0x818c0000 | lo(GotBcl + 4)); // lwz
> r12,r12,GOT+8-1b at l(r12)
> + uint32_t got = in.got->getVA();
> + uint32_t glink = in.plt->getVA(); // VA of .glink
> + const uint8_t *end = buf + 64;
> + if (config->isPic) {
> + uint32_t afterBcl = in.plt->getSize() - target->pltHeaderSize +
> 12;
> + uint32_t gotBcl = got + 4 - (glink + afterBcl);
> + write32(buf + 0, 0x3d6b0000 | ha(afterBcl)); // addis
> r11,r11,1f-glink at ha
> + write32(buf + 4, 0x7c0802a6); // mflr r0
> + write32(buf + 8, 0x429f0005); // bcl 20,30,.+4
> + write32(buf + 12, 0x396b0000 | lo(afterBcl)); // 1: addi
> r11,r11,1b-.glink at l
> + write32(buf + 16, 0x7d8802a6); // mflr r12
> + write32(buf + 20, 0x7c0803a6); // mtlr r0
> + write32(buf + 24, 0x7d6c5850); // sub r11,r11,r12
> + write32(buf + 28, 0x3d8c0000 | ha(gotBcl)); // addis
> 12,12,GOT+4-1b at ha
> + if (ha(gotBcl) == ha(gotBcl + 4)) {
> + write32(buf + 32, 0x800c0000 | lo(gotBcl)); // lwz
> r0,r12,GOT+4-1b at l(r12)
> + write32(buf + 36,
> + 0x818c0000 | lo(gotBcl + 4)); // lwz
> r12,r12,GOT+8-1b at l(r12)
> } else {
> - write32(Buf + 32, 0x840c0000 | lo(GotBcl)); // lwzu
> r0,r12,GOT+4-1b at l(r12)
> - write32(Buf + 36, 0x818c0000 | 4); // lwz
> r12,r12,4(r12)
> + write32(buf + 32, 0x840c0000 | lo(gotBcl)); // lwzu
> r0,r12,GOT+4-1b at l(r12)
> + write32(buf + 36, 0x818c0000 | 4); // lwz
> r12,r12,4(r12)
> }
> - write32(Buf + 40, 0x7c0903a6); // mtctr 0
> - write32(Buf + 44, 0x7c0b5a14); // add r0,11,11
> - write32(Buf + 48, 0x7d605a14); // add r11,0,11
> - write32(Buf + 52, 0x4e800420); // bctr
> - Buf += 56;
> + write32(buf + 40, 0x7c0903a6); // mtctr 0
> + write32(buf + 44, 0x7c0b5a14); // add r0,11,11
> + write32(buf + 48, 0x7d605a14); // add r11,0,11
> + write32(buf + 52, 0x4e800420); // bctr
> + buf += 56;
> } else {
> - write32(Buf + 0, 0x3d800000 | ha(GOT + 4)); // lis
> r12,GOT+4 at ha
> - write32(Buf + 4, 0x3d6b0000 | ha(-Glink)); // addis
> r11,r11,-Glink at ha
> - if (ha(GOT + 4) == ha(GOT + 8))
> - write32(Buf + 8, 0x800c0000 | lo(GOT + 4)); // lwz r0,GOT+4 at l
> (r12)
> + write32(buf + 0, 0x3d800000 | ha(got + 4)); // lis
> r12,GOT+4 at ha
> + write32(buf + 4, 0x3d6b0000 | ha(-glink)); // addis
> r11,r11,-Glink at ha
> + if (ha(got + 4) == ha(got + 8))
> + write32(buf + 8, 0x800c0000 | lo(got + 4)); // lwz r0,GOT+4 at l
> (r12)
> else
> - write32(Buf + 8, 0x840c0000 | lo(GOT + 4)); // lwzu r0,GOT+4 at l
> (r12)
> - write32(Buf + 12, 0x396b0000 | lo(-Glink)); // addi
> r11,r11,-Glink at l
> - write32(Buf + 16, 0x7c0903a6); // mtctr r0
> - write32(Buf + 20, 0x7c0b5a14); // add
> r0,r11,r11
> - if (ha(GOT + 4) == ha(GOT + 8))
> - write32(Buf + 24, 0x818c0000 | lo(GOT + 8)); // lwz r12,GOT+8 at ha
> (r12)
> + write32(buf + 8, 0x840c0000 | lo(got + 4)); // lwzu r0,GOT+4 at l
> (r12)
> + write32(buf + 12, 0x396b0000 | lo(-glink)); // addi
> r11,r11,-Glink at l
> + write32(buf + 16, 0x7c0903a6); // mtctr r0
> + write32(buf + 20, 0x7c0b5a14); // add
> r0,r11,r11
> + if (ha(got + 4) == ha(got + 8))
> + write32(buf + 24, 0x818c0000 | lo(got + 8)); // lwz r12,GOT+8 at ha
> (r12)
> else
> - write32(Buf + 24, 0x818c0000 | 4); // lwz r12,4(r12)
> - write32(Buf + 28, 0x7d605a14); // add
> r11,r0,r11
> - write32(Buf + 32, 0x4e800420); // bctr
> - Buf += 36;
> + write32(buf + 24, 0x818c0000 | 4); // lwz r12,4(r12)
> + write32(buf + 28, 0x7d605a14); // add
> r11,r0,r11
> + write32(buf + 32, 0x4e800420); // bctr
> + buf += 36;
> }
>
> // Pad with nop. They should not be executed.
> - for (; Buf < End; Buf += 4)
> - write32(Buf, 0x60000000);
> + for (; buf < end; buf += 4)
> + write32(buf, 0x60000000);
> }
>
> PPC::PPC() {
> - GotRel = R_PPC_GLOB_DAT;
> - NoneRel = R_PPC_NONE;
> - PltRel = R_PPC_JMP_SLOT;
> - RelativeRel = R_PPC_RELATIVE;
> - IRelativeRel = R_PPC_IRELATIVE;
> - SymbolicRel = R_PPC_ADDR32;
> - GotBaseSymInGotPlt = false;
> - GotHeaderEntriesNum = 3;
> - GotPltHeaderEntriesNum = 0;
> - PltHeaderSize = 64; // size of PLTresolve in .glink
> - PltEntrySize = 4;
> -
> - NeedsThunks = true;
> -
> - TlsModuleIndexRel = R_PPC_DTPMOD32;
> - TlsOffsetRel = R_PPC_DTPREL32;
> - TlsGotRel = R_PPC_TPREL32;
> + gotRel = R_PPC_GLOB_DAT;
> + noneRel = R_PPC_NONE;
> + pltRel = R_PPC_JMP_SLOT;
> + relativeRel = R_PPC_RELATIVE;
> + iRelativeRel = R_PPC_IRELATIVE;
> + symbolicRel = R_PPC_ADDR32;
> + gotBaseSymInGotPlt = false;
> + gotHeaderEntriesNum = 3;
> + gotPltHeaderEntriesNum = 0;
> + pltHeaderSize = 64; // size of PLTresolve in .glink
> + pltEntrySize = 4;
> +
> + needsThunks = true;
> +
> + tlsModuleIndexRel = R_PPC_DTPMOD32;
> + tlsOffsetRel = R_PPC_DTPREL32;
> + tlsGotRel = R_PPC_TPREL32;
>
> - DefaultMaxPageSize = 65536;
> - DefaultImageBase = 0x10000000;
> + defaultMaxPageSize = 65536;
> + defaultImageBase = 0x10000000;
>
> - write32(TrapInstr.data(), 0x7fe00008);
> + write32(trapInstr.data(), 0x7fe00008);
> }
>
> -void PPC::writeGotHeader(uint8_t *Buf) const {
> +void PPC::writeGotHeader(uint8_t *buf) const {
> // _GLOBAL_OFFSET_TABLE_[0] = _DYNAMIC
> // glibc stores _dl_runtime_resolve in _GLOBAL_OFFSET_TABLE_[1],
> // link_map in _GLOBAL_OFFSET_TABLE_[2].
> - write32(Buf, Main->Dynamic->getVA());
> + write32(buf, mainPart->dynamic->getVA());
> }
>
> -void PPC::writeGotPlt(uint8_t *Buf, const Symbol &S) const {
> +void PPC::writeGotPlt(uint8_t *buf, const Symbol &s) const {
> // Address of the symbol resolver stub in .glink .
> - write32(Buf, In.Plt->getVA() + 4 * S.PltIndex);
> + write32(buf, in.plt->getVA() + 4 * s.pltIndex);
> }
>
> -bool PPC::needsThunk(RelExpr Expr, RelType Type, const InputFile
> *File,
> - uint64_t BranchAddr, const Symbol &S) const {
> - if (Type != R_PPC_REL24 && Type != R_PPC_PLTREL24)
> +bool PPC::needsThunk(RelExpr expr, RelType type, const InputFile
> *file,
> + uint64_t branchAddr, const Symbol &s) const {
> + if (type != R_PPC_REL24 && type != R_PPC_PLTREL24)
> return false;
> - if (S.isInPlt())
> + if (s.isInPlt())
> return true;
> - if (S.isUndefWeak())
> + if (s.isUndefWeak())
> return false;
> - return !(Expr == R_PC && PPC::inBranchRange(Type, BranchAddr,
> S.getVA()));
> + return !(expr == R_PC && PPC::inBranchRange(type, branchAddr,
> s.getVA()));
> }
>
> uint32_t PPC::getThunkSectionSpacing() const { return 0x2000000; }
>
> -bool PPC::inBranchRange(RelType Type, uint64_t Src, uint64_t Dst)
> const {
> - uint64_t Offset = Dst - Src;
> - if (Type == R_PPC_REL24 || Type == R_PPC_PLTREL24)
> - return isInt<26>(Offset);
> +bool PPC::inBranchRange(RelType type, uint64_t src, uint64_t dst)
> const {
> + uint64_t offset = dst - src;
> + if (type == R_PPC_REL24 || type == R_PPC_PLTREL24)
> + return isInt<26>(offset);
> llvm_unreachable("unsupported relocation type used in branch");
> }
>
> -RelExpr PPC::getRelExpr(RelType Type, const Symbol &S,
> - const uint8_t *Loc) const {
> - switch (Type) {
> +RelExpr PPC::getRelExpr(RelType type, const Symbol &s,
> + const uint8_t *loc) const {
> + switch (type) {
> case R_PPC_DTPREL16:
> case R_PPC_DTPREL16_HA:
> case R_PPC_DTPREL16_HI:
> @@ -231,45 +231,45 @@ RelExpr PPC::getRelExpr(RelType Type, co
> }
> }
>
> -RelType PPC::getDynRel(RelType Type) const {
> - if (Type == R_PPC_ADDR32)
> - return Type;
> +RelType PPC::getDynRel(RelType type) const {
> + if (type == R_PPC_ADDR32)
> + return type;
> return R_PPC_NONE;
> }
>
> -static std::pair<RelType, uint64_t> fromDTPREL(RelType Type, uint64_t
> Val) {
> - uint64_t DTPBiasedVal = Val - 0x8000;
> - switch (Type) {
> +static std::pair<RelType, uint64_t> fromDTPREL(RelType type, uint64_t
> val) {
> + uint64_t dtpBiasedVal = val - 0x8000;
> + switch (type) {
> case R_PPC_DTPREL16:
> - return {R_PPC64_ADDR16, DTPBiasedVal};
> + return {R_PPC64_ADDR16, dtpBiasedVal};
> case R_PPC_DTPREL16_HA:
> - return {R_PPC_ADDR16_HA, DTPBiasedVal};
> + return {R_PPC_ADDR16_HA, dtpBiasedVal};
> case R_PPC_DTPREL16_HI:
> - return {R_PPC_ADDR16_HI, DTPBiasedVal};
> + return {R_PPC_ADDR16_HI, dtpBiasedVal};
> case R_PPC_DTPREL16_LO:
> - return {R_PPC_ADDR16_LO, DTPBiasedVal};
> + return {R_PPC_ADDR16_LO, dtpBiasedVal};
> case R_PPC_DTPREL32:
> - return {R_PPC_ADDR32, DTPBiasedVal};
> + return {R_PPC_ADDR32, dtpBiasedVal};
> default:
> - return {Type, Val};
> + return {type, val};
> }
> }
>
> -void PPC::relocateOne(uint8_t *Loc, RelType Type, uint64_t Val) const
> {
> - RelType NewType;
> - std::tie(NewType, Val) = fromDTPREL(Type, Val);
> - switch (NewType) {
> +void PPC::relocateOne(uint8_t *loc, RelType type, uint64_t val) const
> {
> + RelType newType;
> + std::tie(newType, val) = fromDTPREL(type, val);
> + switch (newType) {
> case R_PPC_ADDR16:
> - checkIntUInt(Loc, Val, 16, Type);
> - write16(Loc, Val);
> + checkIntUInt(loc, val, 16, type);
> + write16(loc, val);
> break;
> case R_PPC_GOT16:
> case R_PPC_GOT_TLSGD16:
> case R_PPC_GOT_TLSLD16:
> case R_PPC_GOT_TPREL16:
> case R_PPC_TPREL16:
> - checkInt(Loc, Val, 16, Type);
> - write16(Loc, Val);
> + checkInt(loc, val, 16, type);
> + write16(loc, val);
> break;
> case R_PPC_ADDR16_HA:
> case R_PPC_DTPREL16_HA:
> @@ -278,7 +278,7 @@ void PPC::relocateOne(uint8_t *Loc, RelT
> case R_PPC_GOT_TPREL16_HA:
> case R_PPC_REL16_HA:
> case R_PPC_TPREL16_HA:
> - write16(Loc, ha(Val));
> + write16(loc, ha(val));
> break;
> case R_PPC_ADDR16_HI:
> case R_PPC_DTPREL16_HI:
> @@ -287,7 +287,7 @@ void PPC::relocateOne(uint8_t *Loc, RelT
> case R_PPC_GOT_TPREL16_HI:
> case R_PPC_REL16_HI:
> case R_PPC_TPREL16_HI:
> - write16(Loc, Val >> 16);
> + write16(loc, val >> 16);
> break;
> case R_PPC_ADDR16_LO:
> case R_PPC_DTPREL16_LO:
> @@ -296,43 +296,43 @@ void PPC::relocateOne(uint8_t *Loc, RelT
> case R_PPC_GOT_TPREL16_LO:
> case R_PPC_REL16_LO:
> case R_PPC_TPREL16_LO:
> - write16(Loc, Val);
> + write16(loc, val);
> break;
> case R_PPC_ADDR32:
> case R_PPC_REL32:
> - write32(Loc, Val);
> + write32(loc, val);
> break;
> case R_PPC_REL14: {
> - uint32_t Mask = 0x0000FFFC;
> - checkInt(Loc, Val, 16, Type);
> - checkAlignment(Loc, Val, 4, Type);
> - write32(Loc, (read32(Loc) & ~Mask) | (Val & Mask));
> + uint32_t mask = 0x0000FFFC;
> + checkInt(loc, val, 16, type);
> + checkAlignment(loc, val, 4, type);
> + write32(loc, (read32(loc) & ~mask) | (val & mask));
> break;
> }
> case R_PPC_REL24:
> case R_PPC_LOCAL24PC:
> case R_PPC_PLTREL24: {
> - uint32_t Mask = 0x03FFFFFC;
> - checkInt(Loc, Val, 26, Type);
> - checkAlignment(Loc, Val, 4, Type);
> - write32(Loc, (read32(Loc) & ~Mask) | (Val & Mask));
> + uint32_t mask = 0x03FFFFFC;
> + checkInt(loc, val, 26, type);
> + checkAlignment(loc, val, 4, type);
> + write32(loc, (read32(loc) & ~mask) | (val & mask));
> break;
> }
> default:
> - error(getErrorLocation(Loc) + "unrecognized relocation " +
> toString(Type));
> + error(getErrorLocation(loc) + "unrecognized relocation " +
> toString(type));
> }
> }
>
> -RelExpr PPC::adjustRelaxExpr(RelType Type, const uint8_t *Data,
> - RelExpr Expr) const {
> - if (Expr == R_RELAX_TLS_GD_TO_IE)
> +RelExpr PPC::adjustRelaxExpr(RelType type, const uint8_t *data,
> + RelExpr expr) const {
> + if (expr == R_RELAX_TLS_GD_TO_IE)
> return R_RELAX_TLS_GD_TO_IE_GOT_OFF;
> - if (Expr == R_RELAX_TLS_LD_TO_LE)
> + if (expr == R_RELAX_TLS_LD_TO_LE)
> return R_RELAX_TLS_LD_TO_LE_ABS;
> - return Expr;
> + return expr;
> }
>
> -int PPC::getTlsGdRelaxSkip(RelType Type) const {
> +int PPC::getTlsGdRelaxSkip(RelType type) const {
> // A __tls_get_addr call instruction is marked with 2 relocations:
> //
> // R_PPC_TLSGD / R_PPC_TLSLD: marker relocation
> @@ -341,84 +341,84 @@ int PPC::getTlsGdRelaxSkip(RelType Type)
> // After the relaxation we no longer call __tls_get_addr and should
> skip both
> // relocations to not create a false dependence on __tls_get_addr
> being
> // defined.
> - if (Type == R_PPC_TLSGD || Type == R_PPC_TLSLD)
> + if (type == R_PPC_TLSGD || type == R_PPC_TLSLD)
> return 2;
> return 1;
> }
>
> -void PPC::relaxTlsGdToIe(uint8_t *Loc, RelType Type, uint64_t Val)
> const {
> - switch (Type) {
> +void PPC::relaxTlsGdToIe(uint8_t *loc, RelType type, uint64_t val)
> const {
> + switch (type) {
> case R_PPC_GOT_TLSGD16: {
> // addi rT, rA, x at got@tlsgd --> lwz rT, x at got@tprel(rA)
> - uint32_t Insn = readFromHalf16(Loc);
> - writeFromHalf16(Loc, 0x80000000 | (Insn & 0x03ff0000));
> - relocateOne(Loc, R_PPC_GOT_TPREL16, Val);
> + uint32_t insn = readFromHalf16(loc);
> + writeFromHalf16(loc, 0x80000000 | (insn & 0x03ff0000));
> + relocateOne(loc, R_PPC_GOT_TPREL16, val);
> break;
> }
> case R_PPC_TLSGD:
> // bl __tls_get_addr(x at tldgd) --> add r3, r3, r2
> - write32(Loc, 0x7c631214);
> + write32(loc, 0x7c631214);
> break;
> default:
> llvm_unreachable("unsupported relocation for TLS GD to IE
> relaxation");
> }
> }
>
> -void PPC::relaxTlsGdToLe(uint8_t *Loc, RelType Type, uint64_t Val)
> const {
> - switch (Type) {
> +void PPC::relaxTlsGdToLe(uint8_t *loc, RelType type, uint64_t val)
> const {
> + switch (type) {
> case R_PPC_GOT_TLSGD16:
> // addi r3, r31, x at got@tlsgd --> addis r3, r2, x at tprel@ha
> - writeFromHalf16(Loc, 0x3c620000 | ha(Val));
> + writeFromHalf16(loc, 0x3c620000 | ha(val));
> break;
> case R_PPC_TLSGD:
> // bl __tls_get_addr(x at tldgd) --> add r3, r3, x at tprel@l
> - write32(Loc, 0x38630000 | lo(Val));
> + write32(loc, 0x38630000 | lo(val));
> break;
> default:
> llvm_unreachable("unsupported relocation for TLS GD to LE
> relaxation");
> }
> }
>
> -void PPC::relaxTlsLdToLe(uint8_t *Loc, RelType Type, uint64_t Val)
> const {
> - switch (Type) {
> +void PPC::relaxTlsLdToLe(uint8_t *loc, RelType type, uint64_t val)
> const {
> + switch (type) {
> case R_PPC_GOT_TLSLD16:
> // addi r3, rA, x at got@tlsgd --> addis r3, r2, 0
> - writeFromHalf16(Loc, 0x3c620000);
> + writeFromHalf16(loc, 0x3c620000);
> break;
> case R_PPC_TLSLD:
> // r3+x at dtprel computes r3+x-0x8000, while we want it to compute
> r3+x at tprel
> // = r3+x-0x7000, so add 4096 to r3.
> // bl __tls_get_addr(x at tlsld) --> addi r3, r3, 4096
> - write32(Loc, 0x38631000);
> + write32(loc, 0x38631000);
> break;
> case R_PPC_DTPREL16:
> case R_PPC_DTPREL16_HA:
> case R_PPC_DTPREL16_HI:
> case R_PPC_DTPREL16_LO:
> - relocateOne(Loc, Type, Val);
> + relocateOne(loc, type, val);
> break;
> default:
> llvm_unreachable("unsupported relocation for TLS LD to LE
> relaxation");
> }
> }
>
> -void PPC::relaxTlsIeToLe(uint8_t *Loc, RelType Type, uint64_t Val)
> const {
> - switch (Type) {
> +void PPC::relaxTlsIeToLe(uint8_t *loc, RelType type, uint64_t val)
> const {
> + switch (type) {
> case R_PPC_GOT_TPREL16: {
> // lwz rT, x at got@tprel(rA) --> addis rT, r2, x at tprel@ha
> - uint32_t RT = readFromHalf16(Loc) & 0x03e00000;
> - writeFromHalf16(Loc, 0x3c020000 | RT | ha(Val));
> + uint32_t rt = readFromHalf16(loc) & 0x03e00000;
> + writeFromHalf16(loc, 0x3c020000 | rt | ha(val));
> break;
> }
> case R_PPC_TLS: {
> - uint32_t Insn = read32(Loc);
> - if (Insn >> 26 != 31)
> + uint32_t insn = read32(loc);
> + if (insn >> 26 != 31)
> error("unrecognized instruction for IE to LE R_PPC_TLS");
> // addi rT, rT, x at tls --> addi rT, rT, x at tprel@l
> - uint32_t DFormOp = getPPCDFormOp((read32(Loc) & 0x000007fe) >> 1);
> - if (DFormOp == 0)
> + uint32_t dFormOp = getPPCDFormOp((read32(loc) & 0x000007fe) >> 1);
> + if (dFormOp == 0)
> error("unrecognized instruction for IE to LE R_PPC_TLS");
> - write32(Loc, (DFormOp << 26) | (Insn & 0x03ff0000) | lo(Val));
> + write32(loc, (dFormOp << 26) | (insn & 0x03ff0000) | lo(val));
> break;
> }
> default:
> @@ -427,6 +427,6 @@ void PPC::relaxTlsIeToLe(uint8_t *Loc, R
> }
>
> TargetInfo *elf::getPPCTargetInfo() {
> - static PPC Target;
> - return &Target;
> + static PPC target;
> + return ⌖
> }
>
> Modified: lld/trunk/ELF/Arch/PPC64.cpp
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_Arch_PPC64.cpp-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=EzixpdT6lyPB3vPt-x8pFLwxMAP7gZzNCEfZeFg99qE&e=
>
> ==============================================================================
> --- lld/trunk/ELF/Arch/PPC64.cpp (original)
> +++ lld/trunk/ELF/Arch/PPC64.cpp Tue Jul 9 22:00:37 2019
> @@ -19,8 +19,8 @@ using namespace llvm::ELF;
> using namespace lld;
> using namespace lld::elf;
>
> -static uint64_t PPC64TocOffset = 0x8000;
> -static uint64_t DynamicThreadPointerOffset = 0x8000;
> +static uint64_t ppc64TocOffset = 0x8000;
> +static uint64_t dynamicThreadPointerOffset = 0x8000;
>
> // The instruction encoding of bits 21-30 from the ISA for the Xform
> and Dform
> // instructions that can be used as part of the initial exec TLS
> sequence.
> @@ -64,16 +64,16 @@ uint64_t elf::getPPC64TocBase() {
> // TOC starts where the first of these sections starts. We always
> create a
> // .got when we see a relocation that uses it, so for us the start
> is always
> // the .got.
> - uint64_t TocVA = In.Got->getVA();
> + uint64_t tocVA = in.got->getVA();
>
> // Per the ppc64-elf-linux ABI, The TOC base is TOC value plus
> 0x8000
> // thus permitting a full 64 Kbytes segment. Note that the glibc
> startup
> // code (crt1.o) assumes that you can get from the TOC base to the
> // start of the .toc section with only a single (signed) 16-bit
> relocation.
> - return TocVA + PPC64TocOffset;
> + return tocVA + ppc64TocOffset;
> }
>
> -unsigned elf::getPPC64GlobalEntryToLocalEntryOffset(uint8_t StOther) {
> +unsigned elf::getPPC64GlobalEntryToLocalEntryOffset(uint8_t stOther) {
> // The offset is encoded into the 3 most significant bits of the
> st_other
> // field, with some special values described in section 3.4.1 of
> the ABI:
> // 0 --> Zero offset between the GEP and LEP, and the function
> does NOT use
> @@ -85,29 +85,29 @@ unsigned elf::getPPC64GlobalEntryToLocal
> // 2 --> 2^2 = 4 bytes --> 1 instruction.
> // 6 --> 2^6 = 64 bytes --> 16 instructions.
> // 7 --> Reserved.
> - uint8_t GepToLep = (StOther >> 5) & 7;
> - if (GepToLep < 2)
> + uint8_t gepToLep = (stOther >> 5) & 7;
> + if (gepToLep < 2)
> return 0;
>
> // The value encoded in the st_other bits is the
> // log-base-2(offset).
> - if (GepToLep < 7)
> - return 1 << GepToLep;
> + if (gepToLep < 7)
> + return 1 << gepToLep;
>
> error("reserved value of 7 in the 3 most-significant-bits of
> st_other");
> return 0;
> }
>
> -bool elf::isPPC64SmallCodeModelTocReloc(RelType Type) {
> +bool elf::isPPC64SmallCodeModelTocReloc(RelType type) {
> // The only small code model relocations that access the .toc
> section.
> - return Type == R_PPC64_TOC16 || Type == R_PPC64_TOC16_DS;
> + return type == R_PPC64_TOC16 || type == R_PPC64_TOC16_DS;
> }
>
> // Find the R_PPC64_ADDR64 in .rela.toc with matching offset.
> template <typename ELFT>
> static std::pair<Defined *, int64_t>
> -getRelaTocSymAndAddend(InputSectionBase *TocSec, uint64_t Offset) {
> - if (TocSec->NumRelocations == 0)
> +getRelaTocSymAndAddend(InputSectionBase *tocSec, uint64_t offset) {
> + if (tocSec->numRelocations == 0)
> return {};
>
> // .rela.toc contains exclusively R_PPC64_ADDR64 relocations sorted
> by
> @@ -119,16 +119,16 @@ getRelaTocSymAndAddend(InputSectionBase
> // points to a relocation with larger r_offset. Do a linear probe
> then.
> // Constants are extremely uncommon in .toc and the extra number of
> array
> // accesses can be seen as a small constant.
> - ArrayRef<typename ELFT::Rela> Relas = TocSec->template
> relas<ELFT>();
> - uint64_t Index = std::min<uint64_t>(Offset / 8, Relas.size() - 1);
> + ArrayRef<typename ELFT::Rela> relas = tocSec->template
> relas<ELFT>();
> + uint64_t index = std::min<uint64_t>(offset / 8, relas.size() - 1);
> for (;;) {
> - if (Relas[Index].r_offset == Offset) {
> - Symbol &Sym =
> TocSec->getFile<ELFT>()->getRelocTargetSym(Relas[Index]);
> - return {dyn_cast<Defined>(&Sym), getAddend<ELFT>(Relas[Index])};
> + if (relas[index].r_offset == offset) {
> + Symbol &sym =
> tocSec->getFile<ELFT>()->getRelocTargetSym(relas[index]);
> + return {dyn_cast<Defined>(&sym), getAddend<ELFT>(relas[index])};
> }
> - if (Relas[Index].r_offset < Offset || Index == 0)
> + if (relas[index].r_offset < offset || index == 0)
> break;
> - --Index;
> + --index;
> }
> return {};
> }
> @@ -153,35 +153,35 @@ getRelaTocSymAndAddend(InputSectionBase
> // ld/lwa 3, 0(3) # load the value from the address
> //
> // Returns true if the relaxation is performed.
> -bool elf::tryRelaxPPC64TocIndirection(RelType Type, const Relocation
> &Rel,
> - uint8_t *BufLoc) {
> - assert(Config->TocOptimize);
> - if (Rel.Addend < 0)
> +bool elf::tryRelaxPPC64TocIndirection(RelType type, const Relocation
> &rel,
> + uint8_t *bufLoc) {
> + assert(config->tocOptimize);
> + if (rel.addend < 0)
> return false;
>
> // If the symbol is not the .toc section, this isn't a
> toc-indirection.
> - Defined *DefSym = dyn_cast<Defined>(Rel.Sym);
> - if (!DefSym || !DefSym->isSection() || DefSym->Section->Name !=
> ".toc")
> + Defined *defSym = dyn_cast<Defined>(rel.sym);
> + if (!defSym || !defSym->isSection() || defSym->section->name !=
> ".toc")
> return false;
>
> - Defined *D;
> - int64_t Addend;
> - auto *TocISB = cast<InputSectionBase>(DefSym->Section);
> - std::tie(D, Addend) =
> - Config->IsLE ? getRelaTocSymAndAddend<ELF64LE>(TocISB,
> Rel.Addend)
> - : getRelaTocSymAndAddend<ELF64BE>(TocISB,
> Rel.Addend);
> + Defined *d;
> + int64_t addend;
> + auto *tocISB = cast<InputSectionBase>(defSym->section);
> + std::tie(d, addend) =
> + config->isLE ? getRelaTocSymAndAddend<ELF64LE>(tocISB,
> rel.addend)
> + : getRelaTocSymAndAddend<ELF64BE>(tocISB,
> rel.addend);
>
> // Only non-preemptable defined symbols can be relaxed.
> - if (!D || D->IsPreemptible)
> + if (!d || d->isPreemptible)
> return false;
>
> // Two instructions can materialize a 32-bit signed offset from the
> toc base.
> - uint64_t TocRelative = D->getVA(Addend) - getPPC64TocBase();
> - if (!isInt<32>(TocRelative))
> + uint64_t tocRelative = d->getVA(addend) - getPPC64TocBase();
> + if (!isInt<32>(tocRelative))
> return false;
>
> // Add PPC64TocOffset that will be subtracted by relocateOne().
> - Target->relaxGot(BufLoc, Type, TocRelative + PPC64TocOffset);
> + target->relaxGot(bufLoc, type, tocRelative + ppc64TocOffset);
> return true;
> }
>
> @@ -189,30 +189,30 @@ namespace {
> class PPC64 final : public TargetInfo {
> public:
> PPC64();
> - int getTlsGdRelaxSkip(RelType Type) const override;
> + int getTlsGdRelaxSkip(RelType type) const override;
> uint32_t calcEFlags() const override;
> - RelExpr getRelExpr(RelType Type, const Symbol &S,
> - const uint8_t *Loc) const override;
> - RelType getDynRel(RelType Type) const override;
> - void writePltHeader(uint8_t *Buf) const override;
> - void writePlt(uint8_t *Buf, uint64_t GotPltEntryAddr, uint64_t
> PltEntryAddr,
> - int32_t Index, unsigned RelOff) const override;
> - void relocateOne(uint8_t *Loc, RelType Type, uint64_t Val) const
> override;
> - void writeGotHeader(uint8_t *Buf) const override;
> - bool needsThunk(RelExpr Expr, RelType Type, const InputFile *File,
> - uint64_t BranchAddr, const Symbol &S) const
> override;
> + RelExpr getRelExpr(RelType type, const Symbol &s,
> + const uint8_t *loc) const override;
> + RelType getDynRel(RelType type) const override;
> + void writePltHeader(uint8_t *buf) const override;
> + void writePlt(uint8_t *buf, uint64_t gotPltEntryAddr, uint64_t
> pltEntryAddr,
> + int32_t index, unsigned relOff) const override;
> + void relocateOne(uint8_t *loc, RelType type, uint64_t val) const
> override;
> + void writeGotHeader(uint8_t *buf) const override;
> + bool needsThunk(RelExpr expr, RelType type, const InputFile *file,
> + uint64_t branchAddr, const Symbol &s) const
> override;
> uint32_t getThunkSectionSpacing() const override;
> - bool inBranchRange(RelType Type, uint64_t Src, uint64_t Dst) const
> override;
> - RelExpr adjustRelaxExpr(RelType Type, const uint8_t *Data,
> - RelExpr Expr) const override;
> - void relaxGot(uint8_t *Loc, RelType Type, uint64_t Val) const
> override;
> - void relaxTlsGdToIe(uint8_t *Loc, RelType Type, uint64_t Val) const
> override;
> - void relaxTlsGdToLe(uint8_t *Loc, RelType Type, uint64_t Val) const
> override;
> - void relaxTlsLdToLe(uint8_t *Loc, RelType Type, uint64_t Val) const
> override;
> - void relaxTlsIeToLe(uint8_t *Loc, RelType Type, uint64_t Val) const
> override;
> + bool inBranchRange(RelType type, uint64_t src, uint64_t dst) const
> override;
> + RelExpr adjustRelaxExpr(RelType type, const uint8_t *data,
> + RelExpr expr) const override;
> + void relaxGot(uint8_t *loc, RelType type, uint64_t val) const
> override;
> + void relaxTlsGdToIe(uint8_t *loc, RelType type, uint64_t val) const
> override;
> + void relaxTlsGdToLe(uint8_t *loc, RelType type, uint64_t val) const
> override;
> + void relaxTlsLdToLe(uint8_t *loc, RelType type, uint64_t val) const
> override;
> + void relaxTlsIeToLe(uint8_t *loc, RelType type, uint64_t val) const
> override;
>
> - bool adjustPrologueForCrossSplitStack(uint8_t *Loc, uint8_t *End,
> - uint8_t StOther) const
> override;
> + bool adjustPrologueForCrossSplitStack(uint8_t *loc, uint8_t *end,
> + uint8_t stOther) const
> override;
> };
> } // namespace
>
> @@ -220,19 +220,19 @@ public:
> // #higher(value), #highera(value), #highest(value), and
> #highesta(value)
> // macros defined in section 4.5.1. Relocation Types of the
> PPC-elf64abi
> // document.
> -static uint16_t lo(uint64_t V) { return V; }
> -static uint16_t hi(uint64_t V) { return V >> 16; }
> -static uint16_t ha(uint64_t V) { return (V + 0x8000) >> 16; }
> -static uint16_t higher(uint64_t V) { return V >> 32; }
> -static uint16_t highera(uint64_t V) { return (V + 0x8000) >> 32; }
> -static uint16_t highest(uint64_t V) { return V >> 48; }
> -static uint16_t highesta(uint64_t V) { return (V + 0x8000) >> 48; }
> +static uint16_t lo(uint64_t v) { return v; }
> +static uint16_t hi(uint64_t v) { return v >> 16; }
> +static uint16_t ha(uint64_t v) { return (v + 0x8000) >> 16; }
> +static uint16_t higher(uint64_t v) { return v >> 32; }
> +static uint16_t highera(uint64_t v) { return (v + 0x8000) >> 32; }
> +static uint16_t highest(uint64_t v) { return v >> 48; }
> +static uint16_t highesta(uint64_t v) { return (v + 0x8000) >> 48; }
>
> // Extracts the 'PO' field of an instruction encoding.
> -static uint8_t getPrimaryOpCode(uint32_t Encoding) { return (Encoding
> >> 26); }
> +static uint8_t getPrimaryOpCode(uint32_t encoding) { return (encoding
> >> 26); }
>
> -static bool isDQFormInstruction(uint32_t Encoding) {
> - switch (getPrimaryOpCode(Encoding)) {
> +static bool isDQFormInstruction(uint32_t encoding) {
> + switch (getPrimaryOpCode(encoding)) {
> default:
> return false;
> case 56:
> @@ -242,12 +242,12 @@ static bool isDQFormInstruction(uint32_t
> // There are both DS and DQ instruction forms with this primary
> opcode.
> // Namely `lxv` and `stxv` are the DQ-forms that use it.
> // The DS 'XO' bits being set to 01 is restricted to DQ form.
> - return (Encoding & 3) == 0x1;
> + return (encoding & 3) == 0x1;
> }
> }
>
> -static bool isInstructionUpdateForm(uint32_t Encoding) {
> - switch (getPrimaryOpCode(Encoding)) {
> +static bool isInstructionUpdateForm(uint32_t encoding) {
> + switch (getPrimaryOpCode(encoding)) {
> default:
> return false;
> case LBZU:
> @@ -266,7 +266,7 @@ static bool isInstructionUpdateForm(uint
> // between LD/LDU/LWA
> case LD:
> case STD:
> - return (Encoding & 3) == 1;
> + return (encoding & 3) == 1;
> }
> }
>
> @@ -275,38 +275,38 @@ static bool isInstructionUpdateForm(uint
> // pointer is pointing into the middle of the word we want to
> extract, and on
> // little-endian it is pointing to the start of the word. These 2
> helpers are to
> // simplify reading and writing in that context.
> -static void writeFromHalf16(uint8_t *Loc, uint32_t Insn) {
> - write32(Config->IsLE ? Loc : Loc - 2, Insn);
> +static void writeFromHalf16(uint8_t *loc, uint32_t insn) {
> + write32(config->isLE ? loc : loc - 2, insn);
> }
>
> -static uint32_t readFromHalf16(const uint8_t *Loc) {
> - return read32(Config->IsLE ? Loc : Loc - 2);
> +static uint32_t readFromHalf16(const uint8_t *loc) {
> + return read32(config->isLE ? loc : loc - 2);
> }
>
> PPC64::PPC64() {
> - GotRel = R_PPC64_GLOB_DAT;
> - NoneRel = R_PPC64_NONE;
> - PltRel = R_PPC64_JMP_SLOT;
> - RelativeRel = R_PPC64_RELATIVE;
> - IRelativeRel = R_PPC64_IRELATIVE;
> - SymbolicRel = R_PPC64_ADDR64;
> - PltEntrySize = 4;
> - GotBaseSymInGotPlt = false;
> - GotHeaderEntriesNum = 1;
> - GotPltHeaderEntriesNum = 2;
> - PltHeaderSize = 60;
> - NeedsThunks = true;
> + gotRel = R_PPC64_GLOB_DAT;
> + noneRel = R_PPC64_NONE;
> + pltRel = R_PPC64_JMP_SLOT;
> + relativeRel = R_PPC64_RELATIVE;
> + iRelativeRel = R_PPC64_IRELATIVE;
> + symbolicRel = R_PPC64_ADDR64;
> + pltEntrySize = 4;
> + gotBaseSymInGotPlt = false;
> + gotHeaderEntriesNum = 1;
> + gotPltHeaderEntriesNum = 2;
> + pltHeaderSize = 60;
> + needsThunks = true;
>
> - TlsModuleIndexRel = R_PPC64_DTPMOD64;
> - TlsOffsetRel = R_PPC64_DTPREL64;
> + tlsModuleIndexRel = R_PPC64_DTPMOD64;
> + tlsOffsetRel = R_PPC64_DTPREL64;
>
> - TlsGotRel = R_PPC64_TPREL64;
> + tlsGotRel = R_PPC64_TPREL64;
>
> - NeedsMoreStackNonSplit = false;
> + needsMoreStackNonSplit = false;
>
> // We need 64K pages (at least under glibc/Linux, the loader won't
> // set different permissions on a finer granularity than that).
> - DefaultMaxPageSize = 65536;
> + defaultMaxPageSize = 65536;
>
> // The PPC64 ELF ABI v1 spec, says:
> //
> @@ -316,12 +316,12 @@ PPC64::PPC64() {
> //
> // And because the lowest non-zero 256M boundary is 0x10000000,
> PPC64 linkers
> // use 0x10000000 as the starting address.
> - DefaultImageBase = 0x10000000;
> + defaultImageBase = 0x10000000;
>
> - write32(TrapInstr.data(), 0x7fe00008);
> + write32(trapInstr.data(), 0x7fe00008);
> }
>
> -int PPC64::getTlsGdRelaxSkip(RelType Type) const {
> +int PPC64::getTlsGdRelaxSkip(RelType type) const {
> // A __tls_get_addr call instruction is marked with 2 relocations:
> //
> // R_PPC64_TLSGD / R_PPC64_TLSLD: marker relocation
> @@ -330,44 +330,44 @@ int PPC64::getTlsGdRelaxSkip(RelType Typ
> // After the relaxation we no longer call __tls_get_addr and should
> skip both
> // relocations to not create a false dependence on __tls_get_addr
> being
> // defined.
> - if (Type == R_PPC64_TLSGD || Type == R_PPC64_TLSLD)
> + if (type == R_PPC64_TLSGD || type == R_PPC64_TLSLD)
> return 2;
> return 1;
> }
>
> -static uint32_t getEFlags(InputFile *File) {
> - if (Config->EKind == ELF64BEKind)
> - return
> cast<ObjFile<ELF64BE>>(File)->getObj().getHeader()->e_flags;
> - return cast<ObjFile<ELF64LE>>(File)->getObj().getHeader()->e_flags;
> +static uint32_t getEFlags(InputFile *file) {
> + if (config->ekind == ELF64BEKind)
> + return
> cast<ObjFile<ELF64BE>>(file)->getObj().getHeader()->e_flags;
> + return cast<ObjFile<ELF64LE>>(file)->getObj().getHeader()->e_flags;
> }
>
> // This file implements v2 ABI. This function makes sure that all
> // object files have v2 or an unspecified version as an ABI version.
> uint32_t PPC64::calcEFlags() const {
> - for (InputFile *F : ObjectFiles) {
> - uint32_t Flag = getEFlags(F);
> - if (Flag == 1)
> - error(toString(F) + ": ABI version 1 is not supported");
> - else if (Flag > 2)
> - error(toString(F) + ": unrecognized e_flags: " + Twine(Flag));
> + for (InputFile *f : objectFiles) {
> + uint32_t flag = getEFlags(f);
> + if (flag == 1)
> + error(toString(f) + ": ABI version 1 is not supported");
> + else if (flag > 2)
> + error(toString(f) + ": unrecognized e_flags: " + Twine(flag));
> }
> return 2;
> }
>
> -void PPC64::relaxGot(uint8_t *Loc, RelType Type, uint64_t Val) const {
> - switch (Type) {
> +void PPC64::relaxGot(uint8_t *loc, RelType type, uint64_t val) const {
> + switch (type) {
> case R_PPC64_TOC16_HA:
> // Convert "addis reg, 2, .LC0 at toc@h" to "addis reg, 2, var at toc@h"
> or "nop".
> - relocateOne(Loc, Type, Val);
> + relocateOne(loc, type, val);
> break;
> case R_PPC64_TOC16_LO_DS: {
> // Convert "ld reg, .LC0 at toc@l(reg)" to "addi reg, reg, var at toc@l"
> or
> // "addi reg, 2, var at toc".
> - uint32_t Insn = readFromHalf16(Loc);
> - if (getPrimaryOpCode(Insn) != LD)
> + uint32_t insn = readFromHalf16(loc);
> + if (getPrimaryOpCode(insn) != LD)
> error("expected a 'ld' for got-indirect to toc-relative
> relaxing");
> - writeFromHalf16(Loc, (Insn & 0x03ffffff) | 0x38000000);
> - relocateOne(Loc, R_PPC64_TOC16_LO, Val);
> + writeFromHalf16(loc, (insn & 0x03ffffff) | 0x38000000);
> + relocateOne(loc, R_PPC64_TOC16_LO, val);
> break;
> }
> default:
> @@ -375,7 +375,7 @@ void PPC64::relaxGot(uint8_t *Loc, RelTy
> }
> }
>
> -void PPC64::relaxTlsGdToLe(uint8_t *Loc, RelType Type, uint64_t Val)
> const {
> +void PPC64::relaxTlsGdToLe(uint8_t *loc, RelType type, uint64_t val)
> const {
> // Reference: 3.7.4.2 of the 64-bit ELF V2 abi supplement.
> // The general dynamic code sequence for a global `x` will look
> like:
> // Instruction Relocation Symbol
> @@ -391,30 +391,30 @@ void PPC64::relaxTlsGdToLe(uint8_t *Loc,
> // bl __tls_get_addr(x at tlsgd) into nop
> // nop into addi r3, r3, x at tprel@l
>
> - switch (Type) {
> + switch (type) {
> case R_PPC64_GOT_TLSGD16_HA:
> - writeFromHalf16(Loc, 0x60000000); // nop
> + writeFromHalf16(loc, 0x60000000); // nop
> break;
> case R_PPC64_GOT_TLSGD16:
> case R_PPC64_GOT_TLSGD16_LO:
> - writeFromHalf16(Loc, 0x3c6d0000); // addis r3, r13
> - relocateOne(Loc, R_PPC64_TPREL16_HA, Val);
> + writeFromHalf16(loc, 0x3c6d0000); // addis r3, r13
> + relocateOne(loc, R_PPC64_TPREL16_HA, val);
> break;
> case R_PPC64_TLSGD:
> - write32(Loc, 0x60000000); // nop
> - write32(Loc + 4, 0x38630000); // addi r3, r3
> + write32(loc, 0x60000000); // nop
> + write32(loc + 4, 0x38630000); // addi r3, r3
> // Since we are relocating a half16 type relocation and Loc + 4
> points to
> // the start of an instruction we need to advance the buffer by
> an extra
> // 2 bytes on BE.
> - relocateOne(Loc + 4 + (Config->EKind == ELF64BEKind ? 2 : 0),
> - R_PPC64_TPREL16_LO, Val);
> + relocateOne(loc + 4 + (config->ekind == ELF64BEKind ? 2 : 0),
> + R_PPC64_TPREL16_LO, val);
> break;
> default:
> llvm_unreachable("unsupported relocation for TLS GD to LE
> relaxation");
> }
> }
>
> -void PPC64::relaxTlsLdToLe(uint8_t *Loc, RelType Type, uint64_t Val)
> const {
> +void PPC64::relaxTlsLdToLe(uint8_t *loc, RelType type, uint64_t val)
> const {
> // Reference: 3.7.4.3 of the 64-bit ELF V2 abi supplement.
> // The local dynamic code sequence for a global `x` will look like:
> // Instruction Relocation Symbol
> @@ -430,16 +430,16 @@ void PPC64::relaxTlsLdToLe(uint8_t *Loc,
> // bl __tls_get_addr(x at tlsgd) into nop
> // nop into addi r3, r3, 4096
>
> - switch (Type) {
> + switch (type) {
> case R_PPC64_GOT_TLSLD16_HA:
> - writeFromHalf16(Loc, 0x60000000); // nop
> + writeFromHalf16(loc, 0x60000000); // nop
> break;
> case R_PPC64_GOT_TLSLD16_LO:
> - writeFromHalf16(Loc, 0x3c6d0000); // addis r3, r13, 0
> + writeFromHalf16(loc, 0x3c6d0000); // addis r3, r13, 0
> break;
> case R_PPC64_TLSLD:
> - write32(Loc, 0x60000000); // nop
> - write32(Loc + 4, 0x38631000); // addi r3, r3, 4096
> + write32(loc, 0x60000000); // nop
> + write32(loc + 4, 0x38631000); // addi r3, r3, 4096
> break;
> case R_PPC64_DTPREL16:
> case R_PPC64_DTPREL16_HA:
> @@ -447,15 +447,15 @@ void PPC64::relaxTlsLdToLe(uint8_t *Loc,
> case R_PPC64_DTPREL16_DS:
> case R_PPC64_DTPREL16_LO:
> case R_PPC64_DTPREL16_LO_DS:
> - relocateOne(Loc, Type, Val);
> + relocateOne(loc, type, val);
> break;
> default:
> llvm_unreachable("unsupported relocation for TLS LD to LE
> relaxation");
> }
> }
>
> -unsigned elf::getPPCDFormOp(unsigned SecondaryOp) {
> - switch (SecondaryOp) {
> +unsigned elf::getPPCDFormOp(unsigned secondaryOp) {
> + switch (secondaryOp) {
> case LBZX:
> return LBZ;
> case LHZX:
> @@ -479,7 +479,7 @@ unsigned elf::getPPCDFormOp(unsigned Sec
> }
> }
>
> -void PPC64::relaxTlsIeToLe(uint8_t *Loc, RelType Type, uint64_t Val)
> const {
> +void PPC64::relaxTlsIeToLe(uint8_t *loc, RelType type, uint64_t val)
> const {
> // The initial exec code sequence for a global `x` will look like:
> // Instruction Relocation Symbol
> // addis r9, r2, x at got@tprel at ha R_PPC64_GOT_TPREL16_HA x
> @@ -499,28 +499,28 @@ void PPC64::relaxTlsIeToLe(uint8_t *Loc,
> // instruction, if we are accessing memory it will use any of the
> X-form
> // indexed load or store instructions.
>
> - unsigned Offset = (Config->EKind == ELF64BEKind) ? 2 : 0;
> - switch (Type) {
> + unsigned offset = (config->ekind == ELF64BEKind) ? 2 : 0;
> + switch (type) {
> case R_PPC64_GOT_TPREL16_HA:
> - write32(Loc - Offset, 0x60000000); // nop
> + write32(loc - offset, 0x60000000); // nop
> break;
> case R_PPC64_GOT_TPREL16_LO_DS:
> case R_PPC64_GOT_TPREL16_DS: {
> - uint32_t RegNo = read32(Loc - Offset) & 0x03E00000; // bits 6-10
> - write32(Loc - Offset, 0x3C0D0000 | RegNo); // addis
> RegNo, r13
> - relocateOne(Loc, R_PPC64_TPREL16_HA, Val);
> + uint32_t regNo = read32(loc - offset) & 0x03E00000; // bits 6-10
> + write32(loc - offset, 0x3C0D0000 | regNo); // addis
> RegNo, r13
> + relocateOne(loc, R_PPC64_TPREL16_HA, val);
> break;
> }
> case R_PPC64_TLS: {
> - uint32_t PrimaryOp = getPrimaryOpCode(read32(Loc));
> - if (PrimaryOp != 31)
> + uint32_t primaryOp = getPrimaryOpCode(read32(loc));
> + if (primaryOp != 31)
> error("unrecognized instruction for IE to LE R_PPC64_TLS");
> - uint32_t SecondaryOp = (read32(Loc) & 0x000007FE) >> 1; // bits
> 21-30
> - uint32_t DFormOp = getPPCDFormOp(SecondaryOp);
> - if (DFormOp == 0)
> + uint32_t secondaryOp = (read32(loc) & 0x000007FE) >> 1; // bits
> 21-30
> + uint32_t dFormOp = getPPCDFormOp(secondaryOp);
> + if (dFormOp == 0)
> error("unrecognized instruction for IE to LE R_PPC64_TLS");
> - write32(Loc, ((DFormOp << 26) | (read32(Loc) & 0x03FFFFFF)));
> - relocateOne(Loc + Offset, R_PPC64_TPREL16_LO, Val);
> + write32(loc, ((dFormOp << 26) | (read32(loc) & 0x03FFFFFF)));
> + relocateOne(loc + offset, R_PPC64_TPREL16_LO, val);
> break;
> }
> default:
> @@ -529,9 +529,9 @@ void PPC64::relaxTlsIeToLe(uint8_t *Loc,
> }
> }
>
> -RelExpr PPC64::getRelExpr(RelType Type, const Symbol &S,
> - const uint8_t *Loc) const {
> - switch (Type) {
> +RelExpr PPC64::getRelExpr(RelType type, const Symbol &s,
> + const uint8_t *loc) const {
> + switch (type) {
> case R_PPC64_GOT16:
> case R_PPC64_GOT16_DS:
> case R_PPC64_GOT16_HA:
> @@ -546,7 +546,7 @@ RelExpr PPC64::getRelExpr(RelType Type,
> return R_GOTREL;
> case R_PPC64_TOC16_HA:
> case R_PPC64_TOC16_LO_DS:
> - return Config->TocOptimize ? R_PPC64_RELAX_TOC : R_GOTREL;
> + return config->tocOptimize ? R_PPC64_RELAX_TOC : R_GOTREL;
> case R_PPC64_TOC:
> return R_PPC64_TOCBASE;
> case R_PPC64_REL14:
> @@ -611,121 +611,121 @@ RelExpr PPC64::getRelExpr(RelType Type,
> }
> }
>
> -RelType PPC64::getDynRel(RelType Type) const {
> - if (Type == R_PPC64_ADDR64 || Type == R_PPC64_TOC)
> +RelType PPC64::getDynRel(RelType type) const {
> + if (type == R_PPC64_ADDR64 || type == R_PPC64_TOC)
> return R_PPC64_ADDR64;
> return R_PPC64_NONE;
> }
>
> -void PPC64::writeGotHeader(uint8_t *Buf) const {
> - write64(Buf, getPPC64TocBase());
> +void PPC64::writeGotHeader(uint8_t *buf) const {
> + write64(buf, getPPC64TocBase());
> }
>
> -void PPC64::writePltHeader(uint8_t *Buf) const {
> +void PPC64::writePltHeader(uint8_t *buf) const {
> // The generic resolver stub goes first.
> - write32(Buf + 0, 0x7c0802a6); // mflr r0
> - write32(Buf + 4, 0x429f0005); // bcl 20,4*cr7+so,8 <_glink+0x8>
> - write32(Buf + 8, 0x7d6802a6); // mflr r11
> - write32(Buf + 12, 0x7c0803a6); // mtlr r0
> - write32(Buf + 16, 0x7d8b6050); // subf r12, r11, r12
> - write32(Buf + 20, 0x380cffcc); // subi r0,r12,52
> - write32(Buf + 24, 0x7800f082); // srdi r0,r0,62,2
> - write32(Buf + 28, 0xe98b002c); // ld r12,44(r11)
> - write32(Buf + 32, 0x7d6c5a14); // add r11,r12,r11
> - write32(Buf + 36, 0xe98b0000); // ld r12,0(r11)
> - write32(Buf + 40, 0xe96b0008); // ld r11,8(r11)
> - write32(Buf + 44, 0x7d8903a6); // mtctr r12
> - write32(Buf + 48, 0x4e800420); // bctr
> + write32(buf + 0, 0x7c0802a6); // mflr r0
> + write32(buf + 4, 0x429f0005); // bcl 20,4*cr7+so,8 <_glink+0x8>
> + write32(buf + 8, 0x7d6802a6); // mflr r11
> + write32(buf + 12, 0x7c0803a6); // mtlr r0
> + write32(buf + 16, 0x7d8b6050); // subf r12, r11, r12
> + write32(buf + 20, 0x380cffcc); // subi r0,r12,52
> + write32(buf + 24, 0x7800f082); // srdi r0,r0,62,2
> + write32(buf + 28, 0xe98b002c); // ld r12,44(r11)
> + write32(buf + 32, 0x7d6c5a14); // add r11,r12,r11
> + write32(buf + 36, 0xe98b0000); // ld r12,0(r11)
> + write32(buf + 40, 0xe96b0008); // ld r11,8(r11)
> + write32(buf + 44, 0x7d8903a6); // mtctr r12
> + write32(buf + 48, 0x4e800420); // bctr
>
> // The 'bcl' instruction will set the link register to the address
> of the
> // following instruction ('mflr r11'). Here we store the offset
> from that
> // instruction to the first entry in the GotPlt section.
> - int64_t GotPltOffset = In.GotPlt->getVA() - (In.Plt->getVA() + 8);
> - write64(Buf + 52, GotPltOffset);
> + int64_t gotPltOffset = in.gotPlt->getVA() - (in.plt->getVA() + 8);
> + write64(buf + 52, gotPltOffset);
> }
>
> -void PPC64::writePlt(uint8_t *Buf, uint64_t GotPltEntryAddr,
> - uint64_t PltEntryAddr, int32_t Index,
> - unsigned RelOff) const {
> - int32_t Offset = PltHeaderSize + Index * PltEntrySize;
> +void PPC64::writePlt(uint8_t *buf, uint64_t gotPltEntryAddr,
> + uint64_t pltEntryAddr, int32_t index,
> + unsigned relOff) const {
> + int32_t offset = pltHeaderSize + index * pltEntrySize;
> // bl __glink_PLTresolve
> - write32(Buf, 0x48000000 | ((-Offset) & 0x03FFFFFc));
> + write32(buf, 0x48000000 | ((-offset) & 0x03FFFFFc));
> }
>
> -static std::pair<RelType, uint64_t> toAddr16Rel(RelType Type,
> uint64_t Val) {
> +static std::pair<RelType, uint64_t> toAddr16Rel(RelType type,
> uint64_t val) {
> // Relocations relative to the toc-base need to be adjusted by the
> Toc offset.
> - uint64_t TocBiasedVal = Val - PPC64TocOffset;
> + uint64_t tocBiasedVal = val - ppc64TocOffset;
> // Relocations relative to dtv[dtpmod] need to be adjusted by the
> DTP offset.
> - uint64_t DTPBiasedVal = Val - DynamicThreadPointerOffset;
> + uint64_t dtpBiasedVal = val - dynamicThreadPointerOffset;
>
> - switch (Type) {
> + switch (type) {
> // TOC biased relocation.
> case R_PPC64_GOT16:
> case R_PPC64_GOT_TLSGD16:
> case R_PPC64_GOT_TLSLD16:
> case R_PPC64_TOC16:
> - return {R_PPC64_ADDR16, TocBiasedVal};
> + return {R_PPC64_ADDR16, tocBiasedVal};
> case R_PPC64_GOT16_DS:
> case R_PPC64_TOC16_DS:
> case R_PPC64_GOT_TPREL16_DS:
> case R_PPC64_GOT_DTPREL16_DS:
> - return {R_PPC64_ADDR16_DS, TocBiasedVal};
> + return {R_PPC64_ADDR16_DS, tocBiasedVal};
> case R_PPC64_GOT16_HA:
> case R_PPC64_GOT_TLSGD16_HA:
> case R_PPC64_GOT_TLSLD16_HA:
> case R_PPC64_GOT_TPREL16_HA:
> case R_PPC64_GOT_DTPREL16_HA:
> case R_PPC64_TOC16_HA:
> - return {R_PPC64_ADDR16_HA, TocBiasedVal};
> + return {R_PPC64_ADDR16_HA, tocBiasedVal};
> case R_PPC64_GOT16_HI:
> case R_PPC64_GOT_TLSGD16_HI:
> case R_PPC64_GOT_TLSLD16_HI:
> case R_PPC64_GOT_TPREL16_HI:
> case R_PPC64_GOT_DTPREL16_HI:
> case R_PPC64_TOC16_HI:
> - return {R_PPC64_ADDR16_HI, TocBiasedVal};
> + return {R_PPC64_ADDR16_HI, tocBiasedVal};
> case R_PPC64_GOT16_LO:
> case R_PPC64_GOT_TLSGD16_LO:
> case R_PPC64_GOT_TLSLD16_LO:
> case R_PPC64_TOC16_LO:
> - return {R_PPC64_ADDR16_LO, TocBiasedVal};
> + return {R_PPC64_ADDR16_LO, tocBiasedVal};
> case R_PPC64_GOT16_LO_DS:
> case R_PPC64_TOC16_LO_DS:
> case R_PPC64_GOT_TPREL16_LO_DS:
> case R_PPC64_GOT_DTPREL16_LO_DS:
> - return {R_PPC64_ADDR16_LO_DS, TocBiasedVal};
> + return {R_PPC64_ADDR16_LO_DS, tocBiasedVal};
>
> // Dynamic Thread pointer biased relocation types.
> case R_PPC64_DTPREL16:
> - return {R_PPC64_ADDR16, DTPBiasedVal};
> + return {R_PPC64_ADDR16, dtpBiasedVal};
> case R_PPC64_DTPREL16_DS:
> - return {R_PPC64_ADDR16_DS, DTPBiasedVal};
> + return {R_PPC64_ADDR16_DS, dtpBiasedVal};
> case R_PPC64_DTPREL16_HA:
> - return {R_PPC64_ADDR16_HA, DTPBiasedVal};
> + return {R_PPC64_ADDR16_HA, dtpBiasedVal};
> case R_PPC64_DTPREL16_HI:
> - return {R_PPC64_ADDR16_HI, DTPBiasedVal};
> + return {R_PPC64_ADDR16_HI, dtpBiasedVal};
> case R_PPC64_DTPREL16_HIGHER:
> - return {R_PPC64_ADDR16_HIGHER, DTPBiasedVal};
> + return {R_PPC64_ADDR16_HIGHER, dtpBiasedVal};
> case R_PPC64_DTPREL16_HIGHERA:
> - return {R_PPC64_ADDR16_HIGHERA, DTPBiasedVal};
> + return {R_PPC64_ADDR16_HIGHERA, dtpBiasedVal};
> case R_PPC64_DTPREL16_HIGHEST:
> - return {R_PPC64_ADDR16_HIGHEST, DTPBiasedVal};
> + return {R_PPC64_ADDR16_HIGHEST, dtpBiasedVal};
> case R_PPC64_DTPREL16_HIGHESTA:
> - return {R_PPC64_ADDR16_HIGHESTA, DTPBiasedVal};
> + return {R_PPC64_ADDR16_HIGHESTA, dtpBiasedVal};
> case R_PPC64_DTPREL16_LO:
> - return {R_PPC64_ADDR16_LO, DTPBiasedVal};
> + return {R_PPC64_ADDR16_LO, dtpBiasedVal};
> case R_PPC64_DTPREL16_LO_DS:
> - return {R_PPC64_ADDR16_LO_DS, DTPBiasedVal};
> + return {R_PPC64_ADDR16_LO_DS, dtpBiasedVal};
> case R_PPC64_DTPREL64:
> - return {R_PPC64_ADDR64, DTPBiasedVal};
> + return {R_PPC64_ADDR64, dtpBiasedVal};
>
> default:
> - return {Type, Val};
> + return {type, val};
> }
> }
>
> -static bool isTocOptType(RelType Type) {
> - switch (Type) {
> +static bool isTocOptType(RelType type) {
> + switch (type) {
> case R_PPC64_GOT16_HA:
> case R_PPC64_GOT16_LO_DS:
> case R_PPC64_TOC16_HA:
> @@ -737,69 +737,69 @@ static bool isTocOptType(RelType Type) {
> }
> }
>
> -void PPC64::relocateOne(uint8_t *Loc, RelType Type, uint64_t Val)
> const {
> +void PPC64::relocateOne(uint8_t *loc, RelType type, uint64_t val)
> const {
> // We need to save the original relocation type to use in
> diagnostics, and
> // use the original type to determine if we should toc-optimize the
> // instructions being relocated.
> - RelType OriginalType = Type;
> - bool ShouldTocOptimize = isTocOptType(Type);
> + RelType originalType = type;
> + bool shouldTocOptimize = isTocOptType(type);
> // For dynamic thread pointer relative, toc-relative, and
> got-indirect
> // relocations, proceed in terms of the corresponding ADDR16
> relocation type.
> - std::tie(Type, Val) = toAddr16Rel(Type, Val);
> + std::tie(type, val) = toAddr16Rel(type, val);
>
> - switch (Type) {
> + switch (type) {
> case R_PPC64_ADDR14: {
> - checkAlignment(Loc, Val, 4, Type);
> + checkAlignment(loc, val, 4, type);
> // Preserve the AA/LK bits in the branch instruction
> - uint8_t AALK = Loc[3];
> - write16(Loc + 2, (AALK & 3) | (Val & 0xfffc));
> + uint8_t aalk = loc[3];
> + write16(loc + 2, (aalk & 3) | (val & 0xfffc));
> break;
> }
> case R_PPC64_ADDR16:
> - checkIntUInt(Loc, Val, 16, OriginalType);
> - write16(Loc, Val);
> + checkIntUInt(loc, val, 16, originalType);
> + write16(loc, val);
> break;
> case R_PPC64_ADDR32:
> - checkIntUInt(Loc, Val, 32, OriginalType);
> - write32(Loc, Val);
> + checkIntUInt(loc, val, 32, originalType);
> + write32(loc, val);
> break;
> case R_PPC64_ADDR16_DS:
> case R_PPC64_TPREL16_DS: {
> - checkInt(Loc, Val, 16, OriginalType);
> + checkInt(loc, val, 16, originalType);
> // DQ-form instructions use bits 28-31 as part of the instruction
> encoding
> // DS-form instructions only use bits 30-31.
> - uint16_t Mask = isDQFormInstruction(readFromHalf16(Loc)) ? 0xf :
> 0x3;
> - checkAlignment(Loc, lo(Val), Mask + 1, OriginalType);
> - write16(Loc, (read16(Loc) & Mask) | lo(Val));
> + uint16_t mask = isDQFormInstruction(readFromHalf16(loc)) ? 0xf :
> 0x3;
> + checkAlignment(loc, lo(val), mask + 1, originalType);
> + write16(loc, (read16(loc) & mask) | lo(val));
> } break;
> case R_PPC64_ADDR16_HA:
> case R_PPC64_REL16_HA:
> case R_PPC64_TPREL16_HA:
> - if (Config->TocOptimize && ShouldTocOptimize && ha(Val) == 0)
> - writeFromHalf16(Loc, 0x60000000);
> + if (config->tocOptimize && shouldTocOptimize && ha(val) == 0)
> + writeFromHalf16(loc, 0x60000000);
> else
> - write16(Loc, ha(Val));
> + write16(loc, ha(val));
> break;
> case R_PPC64_ADDR16_HI:
> case R_PPC64_REL16_HI:
> case R_PPC64_TPREL16_HI:
> - write16(Loc, hi(Val));
> + write16(loc, hi(val));
> break;
> case R_PPC64_ADDR16_HIGHER:
> case R_PPC64_TPREL16_HIGHER:
> - write16(Loc, higher(Val));
> + write16(loc, higher(val));
> break;
> case R_PPC64_ADDR16_HIGHERA:
> case R_PPC64_TPREL16_HIGHERA:
> - write16(Loc, highera(Val));
> + write16(loc, highera(val));
> break;
> case R_PPC64_ADDR16_HIGHEST:
> case R_PPC64_TPREL16_HIGHEST:
> - write16(Loc, highest(Val));
> + write16(loc, highest(val));
> break;
> case R_PPC64_ADDR16_HIGHESTA:
> case R_PPC64_TPREL16_HIGHESTA:
> - write16(Loc, highesta(Val));
> + write16(loc, highesta(val));
> break;
> case R_PPC64_ADDR16_LO:
> case R_PPC64_REL16_LO:
> @@ -807,93 +807,93 @@ void PPC64::relocateOne(uint8_t *Loc, Re
> // When the high-adjusted part of a toc relocation evalutes to 0,
> it is
> // changed into a nop. The lo part then needs to be updated to
> use the
> // toc-pointer register r2, as the base register.
> - if (Config->TocOptimize && ShouldTocOptimize && ha(Val) == 0) {
> - uint32_t Insn = readFromHalf16(Loc);
> - if (isInstructionUpdateForm(Insn))
> - error(getErrorLocation(Loc) +
> + if (config->tocOptimize && shouldTocOptimize && ha(val) == 0) {
> + uint32_t insn = readFromHalf16(loc);
> + if (isInstructionUpdateForm(insn))
> + error(getErrorLocation(loc) +
> "can't toc-optimize an update instruction: 0x" +
> - utohexstr(Insn));
> - writeFromHalf16(Loc, (Insn & 0xffe00000) | 0x00020000 |
> lo(Val));
> + utohexstr(insn));
> + writeFromHalf16(loc, (insn & 0xffe00000) | 0x00020000 |
> lo(val));
> } else {
> - write16(Loc, lo(Val));
> + write16(loc, lo(val));
> }
> break;
> case R_PPC64_ADDR16_LO_DS:
> case R_PPC64_TPREL16_LO_DS: {
> // DQ-form instructions use bits 28-31 as part of the instruction
> encoding
> // DS-form instructions only use bits 30-31.
> - uint32_t Insn = readFromHalf16(Loc);
> - uint16_t Mask = isDQFormInstruction(Insn) ? 0xf : 0x3;
> - checkAlignment(Loc, lo(Val), Mask + 1, OriginalType);
> - if (Config->TocOptimize && ShouldTocOptimize && ha(Val) == 0) {
> + uint32_t insn = readFromHalf16(loc);
> + uint16_t mask = isDQFormInstruction(insn) ? 0xf : 0x3;
> + checkAlignment(loc, lo(val), mask + 1, originalType);
> + if (config->tocOptimize && shouldTocOptimize && ha(val) == 0) {
> // When the high-adjusted part of a toc relocation evalutes to
> 0, it is
> // changed into a nop. The lo part then needs to be updated to
> use the toc
> // pointer register r2, as the base register.
> - if (isInstructionUpdateForm(Insn))
> - error(getErrorLocation(Loc) +
> + if (isInstructionUpdateForm(insn))
> + error(getErrorLocation(loc) +
> "Can't toc-optimize an update instruction: 0x" +
> - Twine::utohexstr(Insn));
> - Insn &= 0xffe00000 | Mask;
> - writeFromHalf16(Loc, Insn | 0x00020000 | lo(Val));
> + Twine::utohexstr(insn));
> + insn &= 0xffe00000 | mask;
> + writeFromHalf16(loc, insn | 0x00020000 | lo(val));
> } else {
> - write16(Loc, (read16(Loc) & Mask) | lo(Val));
> + write16(loc, (read16(loc) & mask) | lo(val));
> }
> } break;
> case R_PPC64_TPREL16:
> - checkInt(Loc, Val, 16, OriginalType);
> - write16(Loc, Val);
> + checkInt(loc, val, 16, originalType);
> + write16(loc, val);
> break;
> case R_PPC64_REL32:
> - checkInt(Loc, Val, 32, Type);
> - write32(Loc, Val);
> + checkInt(loc, val, 32, type);
> + write32(loc, val);
> break;
> case R_PPC64_ADDR64:
> case R_PPC64_REL64:
> case R_PPC64_TOC:
> - write64(Loc, Val);
> + write64(loc, val);
> break;
> case R_PPC64_REL14: {
> - uint32_t Mask = 0x0000FFFC;
> - checkInt(Loc, Val, 16, Type);
> - checkAlignment(Loc, Val, 4, Type);
> - write32(Loc, (read32(Loc) & ~Mask) | (Val & Mask));
> + uint32_t mask = 0x0000FFFC;
> + checkInt(loc, val, 16, type);
> + checkAlignment(loc, val, 4, type);
> + write32(loc, (read32(loc) & ~mask) | (val & mask));
> break;
> }
> case R_PPC64_REL24: {
> - uint32_t Mask = 0x03FFFFFC;
> - checkInt(Loc, Val, 26, Type);
> - checkAlignment(Loc, Val, 4, Type);
> - write32(Loc, (read32(Loc) & ~Mask) | (Val & Mask));
> + uint32_t mask = 0x03FFFFFC;
> + checkInt(loc, val, 26, type);
> + checkAlignment(loc, val, 4, type);
> + write32(loc, (read32(loc) & ~mask) | (val & mask));
> break;
> }
> case R_PPC64_DTPREL64:
> - write64(Loc, Val - DynamicThreadPointerOffset);
> + write64(loc, val - dynamicThreadPointerOffset);
> break;
> default:
> - error(getErrorLocation(Loc) + "unrecognized relocation " +
> toString(Type));
> + error(getErrorLocation(loc) + "unrecognized relocation " +
> toString(type));
> }
> }
>
> -bool PPC64::needsThunk(RelExpr Expr, RelType Type, const InputFile
> *File,
> - uint64_t BranchAddr, const Symbol &S) const {
> - if (Type != R_PPC64_REL14 && Type != R_PPC64_REL24)
> +bool PPC64::needsThunk(RelExpr expr, RelType type, const InputFile
> *file,
> + uint64_t branchAddr, const Symbol &s) const {
> + if (type != R_PPC64_REL14 && type != R_PPC64_REL24)
> return false;
>
> // If a function is in the Plt it needs to be called with a
> call-stub.
> - if (S.isInPlt())
> + if (s.isInPlt())
> return true;
>
> // If a symbol is a weak undefined and we are compiling an
> executable
> // it doesn't need a range-extending thunk since it can't be called.
> - if (S.isUndefWeak() && !Config->Shared)
> + if (s.isUndefWeak() && !config->shared)
> return false;
>
> // If the offset exceeds the range of the branch type then it will
> need
> // a range-extending thunk.
> // See the comment in getRelocTargetVA() about R_PPC64_CALL.
> - return !inBranchRange(Type, BranchAddr,
> - S.getVA() +
> -
> getPPC64GlobalEntryToLocalEntryOffset(S.StOther));
> + return !inBranchRange(type, branchAddr,
> + s.getVA() +
> +
> getPPC64GlobalEntryToLocalEntryOffset(s.stOther));
> }
>
> uint32_t PPC64::getThunkSectionSpacing() const {
> @@ -904,22 +904,22 @@ uint32_t PPC64::getThunkSectionSpacing()
> return 0x2000000;
> }
>
> -bool PPC64::inBranchRange(RelType Type, uint64_t Src, uint64_t Dst)
> const {
> - int64_t Offset = Dst - Src;
> - if (Type == R_PPC64_REL14)
> - return isInt<16>(Offset);
> - if (Type == R_PPC64_REL24)
> - return isInt<26>(Offset);
> +bool PPC64::inBranchRange(RelType type, uint64_t src, uint64_t dst)
> const {
> + int64_t offset = dst - src;
> + if (type == R_PPC64_REL14)
> + return isInt<16>(offset);
> + if (type == R_PPC64_REL24)
> + return isInt<26>(offset);
> llvm_unreachable("unsupported relocation type used in branch");
> }
>
> -RelExpr PPC64::adjustRelaxExpr(RelType Type, const uint8_t *Data,
> - RelExpr Expr) const {
> - if (Expr == R_RELAX_TLS_GD_TO_IE)
> +RelExpr PPC64::adjustRelaxExpr(RelType type, const uint8_t *data,
> + RelExpr expr) const {
> + if (expr == R_RELAX_TLS_GD_TO_IE)
> return R_RELAX_TLS_GD_TO_IE_GOT_OFF;
> - if (Expr == R_RELAX_TLS_LD_TO_LE)
> + if (expr == R_RELAX_TLS_LD_TO_LE)
> return R_RELAX_TLS_LD_TO_LE_ABS;
> - return Expr;
> + return expr;
> }
>
> // Reference: 3.7.4.1 of the 64-bit ELF V2 abi supplement.
> @@ -939,24 +939,24 @@ RelExpr PPC64::adjustRelaxExpr(RelType T
> // thread pointer.
> // Since the nop must directly follow the call, the R_PPC64_TLSGD
> relocation is
> // used as the relaxation hint for both steps 2 and 3.
> -void PPC64::relaxTlsGdToIe(uint8_t *Loc, RelType Type, uint64_t Val)
> const {
> - switch (Type) {
> +void PPC64::relaxTlsGdToIe(uint8_t *loc, RelType type, uint64_t val)
> const {
> + switch (type) {
> case R_PPC64_GOT_TLSGD16_HA:
> // This is relaxed from addis rT, r2, sym at got@tlsgd at ha to
> // addis rT, r2, sym at got@tprel at ha.
> - relocateOne(Loc, R_PPC64_GOT_TPREL16_HA, Val);
> + relocateOne(loc, R_PPC64_GOT_TPREL16_HA, val);
> return;
> case R_PPC64_GOT_TLSGD16_LO: {
> // Relax from addi r3, rA, sym at got@tlsgd at l to
> // ld r3, sym at got@tprel at l(rA)
> - uint32_t RA = (readFromHalf16(Loc) & (0x1f << 16));
> - writeFromHalf16(Loc, 0xe8600000 | RA);
> - relocateOne(Loc, R_PPC64_GOT_TPREL16_LO_DS, Val);
> + uint32_t ra = (readFromHalf16(loc) & (0x1f << 16));
> + writeFromHalf16(loc, 0xe8600000 | ra);
> + relocateOne(loc, R_PPC64_GOT_TPREL16_LO_DS, val);
> return;
> }
> case R_PPC64_TLSGD:
> - write32(Loc, 0x60000000); // bl __tls_get_addr(sym at tlsgd)
> --> nop
> - write32(Loc + 4, 0x7c636A14); // nop --> add r3, r3, r13
> + write32(loc, 0x60000000); // bl __tls_get_addr(sym at tlsgd)
> --> nop
> + write32(loc + 4, 0x7c636A14); // nop --> add r3, r3, r13
> return;
> default:
> llvm_unreachable("unsupported relocation for TLS GD to IE
> relaxation");
> @@ -991,86 +991,86 @@ void PPC64::relaxTlsGdToIe(uint8_t *Loc,
> // pair by split-stack-size-adjust.
> // addis r12, r1, ha(-stack-frame size - split-stack-adjust-size)
> // addi r12, r12, l(-stack-frame size - split-stack-adjust-size)
> -bool PPC64::adjustPrologueForCrossSplitStack(uint8_t *Loc, uint8_t
> *End,
> - uint8_t StOther) const {
> +bool PPC64::adjustPrologueForCrossSplitStack(uint8_t *loc, uint8_t
> *end,
> + uint8_t stOther) const {
> // If the caller has a global entry point adjust the buffer past
> it. The start
> // of the split-stack prologue will be at the local entry point.
> - Loc += getPPC64GlobalEntryToLocalEntryOffset(StOther);
> + loc += getPPC64GlobalEntryToLocalEntryOffset(stOther);
>
> // At the very least we expect to see a load of some split-stack
> data from the
> // tcb, and 2 instructions that calculate the ending stack address
> this
> // function will require. If there is not enough room for at least 3
> // instructions it can't be a split-stack prologue.
> - if (Loc + 12 >= End)
> + if (loc + 12 >= end)
> return false;
>
> // First instruction must be `ld r0, -0x7000-64(r13)`
> - if (read32(Loc) != 0xe80d8fc0)
> + if (read32(loc) != 0xe80d8fc0)
> return false;
>
> - int16_t HiImm = 0;
> - int16_t LoImm = 0;
> + int16_t hiImm = 0;
> + int16_t loImm = 0;
> // First instruction can be either an addis if the frame size is
> larger then
> // 32K, or an addi if the size is less then 32K.
> - int32_t FirstInstr = read32(Loc + 4);
> - if (getPrimaryOpCode(FirstInstr) == 15) {
> - HiImm = FirstInstr & 0xFFFF;
> - } else if (getPrimaryOpCode(FirstInstr) == 14) {
> - LoImm = FirstInstr & 0xFFFF;
> + int32_t firstInstr = read32(loc + 4);
> + if (getPrimaryOpCode(firstInstr) == 15) {
> + hiImm = firstInstr & 0xFFFF;
> + } else if (getPrimaryOpCode(firstInstr) == 14) {
> + loImm = firstInstr & 0xFFFF;
> } else {
> return false;
> }
>
> // Second instruction is either an addi or a nop. If the first
> instruction was
> // an addi then LoImm is set and the second instruction must be a
> nop.
> - uint32_t SecondInstr = read32(Loc + 8);
> - if (!LoImm && getPrimaryOpCode(SecondInstr) == 14) {
> - LoImm = SecondInstr & 0xFFFF;
> - } else if (SecondInstr != 0x60000000) {
> + uint32_t secondInstr = read32(loc + 8);
> + if (!loImm && getPrimaryOpCode(secondInstr) == 14) {
> + loImm = secondInstr & 0xFFFF;
> + } else if (secondInstr != 0x60000000) {
> return false;
> }
>
> // The register operands of the first instruction should be the
> stack-pointer
> // (r1) as the input (RA) and r12 as the output (RT). If the second
> // instruction is not a nop, then it should use r12 as both input
> and output.
> - auto CheckRegOperands = [](uint32_t Instr, uint8_t ExpectedRT,
> - uint8_t ExpectedRA) {
> - return ((Instr & 0x3E00000) >> 21 == ExpectedRT) &&
> - ((Instr & 0x1F0000) >> 16 == ExpectedRA);
> + auto checkRegOperands = [](uint32_t instr, uint8_t expectedRT,
> + uint8_t expectedRA) {
> + return ((instr & 0x3E00000) >> 21 == expectedRT) &&
> + ((instr & 0x1F0000) >> 16 == expectedRA);
> };
> - if (!CheckRegOperands(FirstInstr, 12, 1))
> + if (!checkRegOperands(firstInstr, 12, 1))
> return false;
> - if (SecondInstr != 0x60000000 && !CheckRegOperands(SecondInstr, 12,
> 12))
> + if (secondInstr != 0x60000000 && !checkRegOperands(secondInstr, 12,
> 12))
> return false;
>
> - int32_t StackFrameSize = (HiImm * 65536) + LoImm;
> + int32_t stackFrameSize = (hiImm * 65536) + loImm;
> // Check that the adjusted size doesn't overflow what we can
> represent with 2
> // instructions.
> - if (StackFrameSize < Config->SplitStackAdjustSize + INT32_MIN) {
> - error(getErrorLocation(Loc) + "split-stack prologue adjustment
> overflows");
> + if (stackFrameSize < config->splitStackAdjustSize + INT32_MIN) {
> + error(getErrorLocation(loc) + "split-stack prologue adjustment
> overflows");
> return false;
> }
>
> - int32_t AdjustedStackFrameSize =
> - StackFrameSize - Config->SplitStackAdjustSize;
> + int32_t adjustedStackFrameSize =
> + stackFrameSize - config->splitStackAdjustSize;
>
> - LoImm = AdjustedStackFrameSize & 0xFFFF;
> - HiImm = (AdjustedStackFrameSize + 0x8000) >> 16;
> - if (HiImm) {
> - write32(Loc + 4, 0x3D810000 | (uint16_t)HiImm);
> + loImm = adjustedStackFrameSize & 0xFFFF;
> + hiImm = (adjustedStackFrameSize + 0x8000) >> 16;
> + if (hiImm) {
> + write32(loc + 4, 0x3D810000 | (uint16_t)hiImm);
> // If the low immediate is zero the second instruction will be a
> nop.
> - SecondInstr = LoImm ? 0x398C0000 | (uint16_t)LoImm : 0x60000000;
> - write32(Loc + 8, SecondInstr);
> + secondInstr = loImm ? 0x398C0000 | (uint16_t)loImm : 0x60000000;
> + write32(loc + 8, secondInstr);
> } else {
> // addi r12, r1, imm
> - write32(Loc + 4, (0x39810000) | (uint16_t)LoImm);
> - write32(Loc + 8, 0x60000000);
> + write32(loc + 4, (0x39810000) | (uint16_t)loImm);
> + write32(loc + 8, 0x60000000);
> }
>
> return true;
> }
>
> TargetInfo *elf::getPPC64TargetInfo() {
> - static PPC64 Target;
> - return &Target;
> + static PPC64 target;
> + return ⌖
> }
>
> Modified: lld/trunk/ELF/Arch/RISCV.cpp
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_Arch_RISCV.cpp-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=1UdBu57jfGbNMKRWbCRk2oXiBufnWWIwcMAQ8exYR_g&e=
>
> ==============================================================================
> --- lld/trunk/ELF/Arch/RISCV.cpp (original)
> +++ lld/trunk/ELF/Arch/RISCV.cpp Tue Jul 9 22:00:37 2019
> @@ -23,20 +23,20 @@ class RISCV final : public TargetInfo {
> public:
> RISCV();
> uint32_t calcEFlags() const override;
> - void writeGotHeader(uint8_t *Buf) const override;
> - void writeGotPlt(uint8_t *Buf, const Symbol &S) const override;
> - void writePltHeader(uint8_t *Buf) const override;
> - void writePlt(uint8_t *Buf, uint64_t GotPltEntryAddr, uint64_t
> PltEntryAddr,
> - int32_t Index, unsigned RelOff) const override;
> - RelType getDynRel(RelType Type) const override;
> - RelExpr getRelExpr(RelType Type, const Symbol &S,
> - const uint8_t *Loc) const override;
> - void relocateOne(uint8_t *Loc, RelType Type, uint64_t Val) const
> override;
> + void writeGotHeader(uint8_t *buf) const override;
> + void writeGotPlt(uint8_t *buf, const Symbol &s) const override;
> + void writePltHeader(uint8_t *buf) const override;
> + void writePlt(uint8_t *buf, uint64_t gotPltEntryAddr, uint64_t
> pltEntryAddr,
> + int32_t index, unsigned relOff) const override;
> + RelType getDynRel(RelType type) const override;
> + RelExpr getRelExpr(RelType type, const Symbol &s,
> + const uint8_t *loc) const override;
> + void relocateOne(uint8_t *loc, RelType type, uint64_t val) const
> override;
> };
>
> } // end anonymous namespace
>
> -const uint64_t DTPOffset = 0x800;
> +const uint64_t dtpOffset = 0x800;
>
> enum Op {
> ADDI = 0x13,
> @@ -56,91 +56,91 @@ enum Reg {
> X_T3 = 28,
> };
>
> -static uint32_t hi20(uint32_t Val) { return (Val + 0x800) >> 12; }
> -static uint32_t lo12(uint32_t Val) { return Val & 4095; }
> +static uint32_t hi20(uint32_t val) { return (val + 0x800) >> 12; }
> +static uint32_t lo12(uint32_t val) { return val & 4095; }
>
> -static uint32_t itype(uint32_t Op, uint32_t Rd, uint32_t Rs1,
> uint32_t Imm) {
> - return Op | (Rd << 7) | (Rs1 << 15) | (Imm << 20);
> +static uint32_t itype(uint32_t op, uint32_t rd, uint32_t rs1,
> uint32_t imm) {
> + return op | (rd << 7) | (rs1 << 15) | (imm << 20);
> }
> -static uint32_t rtype(uint32_t Op, uint32_t Rd, uint32_t Rs1,
> uint32_t Rs2) {
> - return Op | (Rd << 7) | (Rs1 << 15) | (Rs2 << 20);
> +static uint32_t rtype(uint32_t op, uint32_t rd, uint32_t rs1,
> uint32_t rs2) {
> + return op | (rd << 7) | (rs1 << 15) | (rs2 << 20);
> }
> -static uint32_t utype(uint32_t Op, uint32_t Rd, uint32_t Imm) {
> - return Op | (Rd << 7) | (Imm << 12);
> +static uint32_t utype(uint32_t op, uint32_t rd, uint32_t imm) {
> + return op | (rd << 7) | (imm << 12);
> }
>
> RISCV::RISCV() {
> - CopyRel = R_RISCV_COPY;
> - NoneRel = R_RISCV_NONE;
> - PltRel = R_RISCV_JUMP_SLOT;
> - RelativeRel = R_RISCV_RELATIVE;
> - if (Config->Is64) {
> - SymbolicRel = R_RISCV_64;
> - TlsModuleIndexRel = R_RISCV_TLS_DTPMOD64;
> - TlsOffsetRel = R_RISCV_TLS_DTPREL64;
> - TlsGotRel = R_RISCV_TLS_TPREL64;
> + copyRel = R_RISCV_COPY;
> + noneRel = R_RISCV_NONE;
> + pltRel = R_RISCV_JUMP_SLOT;
> + relativeRel = R_RISCV_RELATIVE;
> + if (config->is64) {
> + symbolicRel = R_RISCV_64;
> + tlsModuleIndexRel = R_RISCV_TLS_DTPMOD64;
> + tlsOffsetRel = R_RISCV_TLS_DTPREL64;
> + tlsGotRel = R_RISCV_TLS_TPREL64;
> } else {
> - SymbolicRel = R_RISCV_32;
> - TlsModuleIndexRel = R_RISCV_TLS_DTPMOD32;
> - TlsOffsetRel = R_RISCV_TLS_DTPREL32;
> - TlsGotRel = R_RISCV_TLS_TPREL32;
> + symbolicRel = R_RISCV_32;
> + tlsModuleIndexRel = R_RISCV_TLS_DTPMOD32;
> + tlsOffsetRel = R_RISCV_TLS_DTPREL32;
> + tlsGotRel = R_RISCV_TLS_TPREL32;
> }
> - GotRel = SymbolicRel;
> + gotRel = symbolicRel;
>
> // .got[0] = _DYNAMIC
> - GotBaseSymInGotPlt = false;
> - GotHeaderEntriesNum = 1;
> + gotBaseSymInGotPlt = false;
> + gotHeaderEntriesNum = 1;
>
> // .got.plt[0] = _dl_runtime_resolve, .got.plt[1] = link_map
> - GotPltHeaderEntriesNum = 2;
> + gotPltHeaderEntriesNum = 2;
>
> - PltEntrySize = 16;
> - PltHeaderSize = 32;
> + pltEntrySize = 16;
> + pltHeaderSize = 32;
> }
>
> -static uint32_t getEFlags(InputFile *F) {
> - if (Config->Is64)
> - return cast<ObjFile<ELF64LE>>(F)->getObj().getHeader()->e_flags;
> - return cast<ObjFile<ELF32LE>>(F)->getObj().getHeader()->e_flags;
> +static uint32_t getEFlags(InputFile *f) {
> + if (config->is64)
> + return cast<ObjFile<ELF64LE>>(f)->getObj().getHeader()->e_flags;
> + return cast<ObjFile<ELF32LE>>(f)->getObj().getHeader()->e_flags;
> }
>
> uint32_t RISCV::calcEFlags() const {
> - assert(!ObjectFiles.empty());
> + assert(!objectFiles.empty());
>
> - uint32_t Target = getEFlags(ObjectFiles.front());
> + uint32_t target = getEFlags(objectFiles.front());
>
> - for (InputFile *F : ObjectFiles) {
> - uint32_t EFlags = getEFlags(F);
> - if (EFlags & EF_RISCV_RVC)
> - Target |= EF_RISCV_RVC;
> + for (InputFile *f : objectFiles) {
> + uint32_t eflags = getEFlags(f);
> + if (eflags & EF_RISCV_RVC)
> + target |= EF_RISCV_RVC;
>
> - if ((EFlags & EF_RISCV_FLOAT_ABI) != (Target &
> EF_RISCV_FLOAT_ABI))
> - error(toString(F) +
> + if ((eflags & EF_RISCV_FLOAT_ABI) != (target &
> EF_RISCV_FLOAT_ABI))
> + error(toString(f) +
> ": cannot link object files with different floating-point
> ABI");
>
> - if ((EFlags & EF_RISCV_RVE) != (Target & EF_RISCV_RVE))
> - error(toString(F) +
> + if ((eflags & EF_RISCV_RVE) != (target & EF_RISCV_RVE))
> + error(toString(f) +
> ": cannot link object files with different EF_RISCV_RVE");
> }
>
> - return Target;
> + return target;
> }
>
> -void RISCV::writeGotHeader(uint8_t *Buf) const {
> - if (Config->Is64)
> - write64le(Buf, Main->Dynamic->getVA());
> +void RISCV::writeGotHeader(uint8_t *buf) const {
> + if (config->is64)
> + write64le(buf, mainPart->dynamic->getVA());
> else
> - write32le(Buf, Main->Dynamic->getVA());
> + write32le(buf, mainPart->dynamic->getVA());
> }
>
> -void RISCV::writeGotPlt(uint8_t *Buf, const Symbol &S) const {
> - if (Config->Is64)
> - write64le(Buf, In.Plt->getVA());
> +void RISCV::writeGotPlt(uint8_t *buf, const Symbol &s) const {
> + if (config->is64)
> + write64le(buf, in.plt->getVA());
> else
> - write32le(Buf, In.Plt->getVA());
> + write32le(buf, in.plt->getVA());
> }
>
> -void RISCV::writePltHeader(uint8_t *Buf) const {
> +void RISCV::writePltHeader(uint8_t *buf) const {
> // 1: auipc t2, %pcrel_hi(.got.plt)
> // sub t1, t1, t3
> // l[wd] t3, %pcrel_lo(1b)(t2); t3 = _dl_runtime_resolve
> @@ -149,40 +149,40 @@ void RISCV::writePltHeader(uint8_t *Buf)
> // srli t1, t1, (rv64?1:2); t1 = &.got.plt[i] - &.got.plt[0]
> // l[wd] t0, Wordsize(t0); t0 = link_map
> // jr t3
> - uint32_t Offset = In.GotPlt->getVA() - In.Plt->getVA();
> - uint32_t Load = Config->Is64 ? LD : LW;
> - write32le(Buf + 0, utype(AUIPC, X_T2, hi20(Offset)));
> - write32le(Buf + 4, rtype(SUB, X_T1, X_T1, X_T3));
> - write32le(Buf + 8, itype(Load, X_T3, X_T2, lo12(Offset)));
> - write32le(Buf + 12, itype(ADDI, X_T1, X_T1, -Target->PltHeaderSize
> - 12));
> - write32le(Buf + 16, itype(ADDI, X_T0, X_T2, lo12(Offset)));
> - write32le(Buf + 20, itype(SRLI, X_T1, X_T1, Config->Is64 ? 1 : 2));
> - write32le(Buf + 24, itype(Load, X_T0, X_T0, Config->Wordsize));
> - write32le(Buf + 28, itype(JALR, 0, X_T3, 0));
> + uint32_t offset = in.gotPlt->getVA() - in.plt->getVA();
> + uint32_t load = config->is64 ? LD : LW;
> + write32le(buf + 0, utype(AUIPC, X_T2, hi20(offset)));
> + write32le(buf + 4, rtype(SUB, X_T1, X_T1, X_T3));
> + write32le(buf + 8, itype(load, X_T3, X_T2, lo12(offset)));
> + write32le(buf + 12, itype(ADDI, X_T1, X_T1, -target->pltHeaderSize
> - 12));
> + write32le(buf + 16, itype(ADDI, X_T0, X_T2, lo12(offset)));
> + write32le(buf + 20, itype(SRLI, X_T1, X_T1, config->is64 ? 1 : 2));
> + write32le(buf + 24, itype(load, X_T0, X_T0, config->wordsize));
> + write32le(buf + 28, itype(JALR, 0, X_T3, 0));
> }
>
> -void RISCV::writePlt(uint8_t *Buf, uint64_t GotPltEntryAddr,
> - uint64_t PltEntryAddr, int32_t Index,
> - unsigned RelOff) const {
> +void RISCV::writePlt(uint8_t *buf, uint64_t gotPltEntryAddr,
> + uint64_t pltEntryAddr, int32_t index,
> + unsigned relOff) const {
> // 1: auipc t3, %pcrel_hi(f at .got.plt)
> // l[wd] t3, %pcrel_lo(1b)(t3)
> // jalr t1, t3
> // nop
> - uint32_t Offset = GotPltEntryAddr - PltEntryAddr;
> - write32le(Buf + 0, utype(AUIPC, X_T3, hi20(Offset)));
> - write32le(Buf + 4, itype(Config->Is64 ? LD : LW, X_T3, X_T3,
> lo12(Offset)));
> - write32le(Buf + 8, itype(JALR, X_T1, X_T3, 0));
> - write32le(Buf + 12, itype(ADDI, 0, 0, 0));
> + uint32_t offset = gotPltEntryAddr - pltEntryAddr;
> + write32le(buf + 0, utype(AUIPC, X_T3, hi20(offset)));
> + write32le(buf + 4, itype(config->is64 ? LD : LW, X_T3, X_T3,
> lo12(offset)));
> + write32le(buf + 8, itype(JALR, X_T1, X_T3, 0));
> + write32le(buf + 12, itype(ADDI, 0, 0, 0));
> }
>
> -RelType RISCV::getDynRel(RelType Type) const {
> - return Type == Target->SymbolicRel ? Type
> +RelType RISCV::getDynRel(RelType type) const {
> + return type == target->symbolicRel ? type
> :
> static_cast<RelType>(R_RISCV_NONE);
> }
>
> -RelExpr RISCV::getRelExpr(const RelType Type, const Symbol &S,
> - const uint8_t *Loc) const {
> - switch (Type) {
> +RelExpr RISCV::getRelExpr(const RelType type, const Symbol &s,
> + const uint8_t *loc) const {
> + switch (type) {
> case R_RISCV_ADD8:
> case R_RISCV_ADD16:
> case R_RISCV_ADD32:
> @@ -215,7 +215,7 @@ RelExpr RISCV::getRelExpr(const RelType
> case R_RISCV_TLS_GD_HI20:
> return R_TLSGD_PC;
> case R_RISCV_TLS_GOT_HI20:
> - Config->HasStaticTlsModel = true;
> + config->hasStaticTlsModel = true;
> return R_GOT_PC;
> case R_RISCV_TPREL_HI20:
> case R_RISCV_TPREL_LO12_I:
> @@ -231,106 +231,106 @@ RelExpr RISCV::getRelExpr(const RelType
> }
>
> // Extract bits V[Begin:End], where range is inclusive, and Begin
> must be < 63.
> -static uint32_t extractBits(uint64_t V, uint32_t Begin, uint32_t End)
> {
> - return (V & ((1ULL << (Begin + 1)) - 1)) >> End;
> +static uint32_t extractBits(uint64_t v, uint32_t begin, uint32_t end)
> {
> + return (v & ((1ULL << (begin + 1)) - 1)) >> end;
> }
>
> -void RISCV::relocateOne(uint8_t *Loc, const RelType Type,
> - const uint64_t Val) const {
> - const unsigned Bits = Config->Wordsize * 8;
> +void RISCV::relocateOne(uint8_t *loc, const RelType type,
> + const uint64_t val) const {
> + const unsigned bits = config->wordsize * 8;
>
> - switch (Type) {
> + switch (type) {
> case R_RISCV_32:
> - write32le(Loc, Val);
> + write32le(loc, val);
> return;
> case R_RISCV_64:
> - write64le(Loc, Val);
> + write64le(loc, val);
> return;
>
> case R_RISCV_RVC_BRANCH: {
> - checkInt(Loc, static_cast<int64_t>(Val) >> 1, 8, Type);
> - checkAlignment(Loc, Val, 2, Type);
> - uint16_t Insn = read16le(Loc) & 0xE383;
> - uint16_t Imm8 = extractBits(Val, 8, 8) << 12;
> - uint16_t Imm4_3 = extractBits(Val, 4, 3) << 10;
> - uint16_t Imm7_6 = extractBits(Val, 7, 6) << 5;
> - uint16_t Imm2_1 = extractBits(Val, 2, 1) << 3;
> - uint16_t Imm5 = extractBits(Val, 5, 5) << 2;
> - Insn |= Imm8 | Imm4_3 | Imm7_6 | Imm2_1 | Imm5;
> + checkInt(loc, static_cast<int64_t>(val) >> 1, 8, type);
> + checkAlignment(loc, val, 2, type);
> + uint16_t insn = read16le(loc) & 0xE383;
> + uint16_t imm8 = extractBits(val, 8, 8) << 12;
> + uint16_t imm4_3 = extractBits(val, 4, 3) << 10;
> + uint16_t imm7_6 = extractBits(val, 7, 6) << 5;
> + uint16_t imm2_1 = extractBits(val, 2, 1) << 3;
> + uint16_t imm5 = extractBits(val, 5, 5) << 2;
> + insn |= imm8 | imm4_3 | imm7_6 | imm2_1 | imm5;
>
> - write16le(Loc, Insn);
> + write16le(loc, insn);
> return;
> }
>
> case R_RISCV_RVC_JUMP: {
> - checkInt(Loc, static_cast<int64_t>(Val) >> 1, 11, Type);
> - checkAlignment(Loc, Val, 2, Type);
> - uint16_t Insn = read16le(Loc) & 0xE003;
> - uint16_t Imm11 = extractBits(Val, 11, 11) << 12;
> - uint16_t Imm4 = extractBits(Val, 4, 4) << 11;
> - uint16_t Imm9_8 = extractBits(Val, 9, 8) << 9;
> - uint16_t Imm10 = extractBits(Val, 10, 10) << 8;
> - uint16_t Imm6 = extractBits(Val, 6, 6) << 7;
> - uint16_t Imm7 = extractBits(Val, 7, 7) << 6;
> - uint16_t Imm3_1 = extractBits(Val, 3, 1) << 3;
> - uint16_t Imm5 = extractBits(Val, 5, 5) << 2;
> - Insn |= Imm11 | Imm4 | Imm9_8 | Imm10 | Imm6 | Imm7 | Imm3_1 |
> Imm5;
> + checkInt(loc, static_cast<int64_t>(val) >> 1, 11, type);
> + checkAlignment(loc, val, 2, type);
> + uint16_t insn = read16le(loc) & 0xE003;
> + uint16_t imm11 = extractBits(val, 11, 11) << 12;
> + uint16_t imm4 = extractBits(val, 4, 4) << 11;
> + uint16_t imm9_8 = extractBits(val, 9, 8) << 9;
> + uint16_t imm10 = extractBits(val, 10, 10) << 8;
> + uint16_t imm6 = extractBits(val, 6, 6) << 7;
> + uint16_t imm7 = extractBits(val, 7, 7) << 6;
> + uint16_t imm3_1 = extractBits(val, 3, 1) << 3;
> + uint16_t imm5 = extractBits(val, 5, 5) << 2;
> + insn |= imm11 | imm4 | imm9_8 | imm10 | imm6 | imm7 | imm3_1 |
> imm5;
>
> - write16le(Loc, Insn);
> + write16le(loc, insn);
> return;
> }
>
> case R_RISCV_RVC_LUI: {
> - int64_t Imm = SignExtend64(Val + 0x800, Bits) >> 12;
> - checkInt(Loc, Imm, 6, Type);
> - if (Imm == 0) { // `c.lui rd, 0` is illegal, convert to `c.li
> rd, 0`
> - write16le(Loc, (read16le(Loc) & 0x0F83) | 0x4000);
> + int64_t imm = SignExtend64(val + 0x800, bits) >> 12;
> + checkInt(loc, imm, 6, type);
> + if (imm == 0) { // `c.lui rd, 0` is illegal, convert to `c.li
> rd, 0`
> + write16le(loc, (read16le(loc) & 0x0F83) | 0x4000);
> } else {
> - uint16_t Imm17 = extractBits(Val + 0x800, 17, 17) << 12;
> - uint16_t Imm16_12 = extractBits(Val + 0x800, 16, 12) << 2;
> - write16le(Loc, (read16le(Loc) & 0xEF83) | Imm17 | Imm16_12);
> + uint16_t imm17 = extractBits(val + 0x800, 17, 17) << 12;
> + uint16_t imm16_12 = extractBits(val + 0x800, 16, 12) << 2;
> + write16le(loc, (read16le(loc) & 0xEF83) | imm17 | imm16_12);
> }
> return;
> }
>
> case R_RISCV_JAL: {
> - checkInt(Loc, static_cast<int64_t>(Val) >> 1, 20, Type);
> - checkAlignment(Loc, Val, 2, Type);
> + checkInt(loc, static_cast<int64_t>(val) >> 1, 20, type);
> + checkAlignment(loc, val, 2, type);
>
> - uint32_t Insn = read32le(Loc) & 0xFFF;
> - uint32_t Imm20 = extractBits(Val, 20, 20) << 31;
> - uint32_t Imm10_1 = extractBits(Val, 10, 1) << 21;
> - uint32_t Imm11 = extractBits(Val, 11, 11) << 20;
> - uint32_t Imm19_12 = extractBits(Val, 19, 12) << 12;
> - Insn |= Imm20 | Imm10_1 | Imm11 | Imm19_12;
> + uint32_t insn = read32le(loc) & 0xFFF;
> + uint32_t imm20 = extractBits(val, 20, 20) << 31;
> + uint32_t imm10_1 = extractBits(val, 10, 1) << 21;
> + uint32_t imm11 = extractBits(val, 11, 11) << 20;
> + uint32_t imm19_12 = extractBits(val, 19, 12) << 12;
> + insn |= imm20 | imm10_1 | imm11 | imm19_12;
>
> - write32le(Loc, Insn);
> + write32le(loc, insn);
> return;
> }
>
> case R_RISCV_BRANCH: {
> - checkInt(Loc, static_cast<int64_t>(Val) >> 1, 12, Type);
> - checkAlignment(Loc, Val, 2, Type);
> + checkInt(loc, static_cast<int64_t>(val) >> 1, 12, type);
> + checkAlignment(loc, val, 2, type);
>
> - uint32_t Insn = read32le(Loc) & 0x1FFF07F;
> - uint32_t Imm12 = extractBits(Val, 12, 12) << 31;
> - uint32_t Imm10_5 = extractBits(Val, 10, 5) << 25;
> - uint32_t Imm4_1 = extractBits(Val, 4, 1) << 8;
> - uint32_t Imm11 = extractBits(Val, 11, 11) << 7;
> - Insn |= Imm12 | Imm10_5 | Imm4_1 | Imm11;
> + uint32_t insn = read32le(loc) & 0x1FFF07F;
> + uint32_t imm12 = extractBits(val, 12, 12) << 31;
> + uint32_t imm10_5 = extractBits(val, 10, 5) << 25;
> + uint32_t imm4_1 = extractBits(val, 4, 1) << 8;
> + uint32_t imm11 = extractBits(val, 11, 11) << 7;
> + insn |= imm12 | imm10_5 | imm4_1 | imm11;
>
> - write32le(Loc, Insn);
> + write32le(loc, insn);
> return;
> }
>
> // auipc + jalr pair
> case R_RISCV_CALL:
> case R_RISCV_CALL_PLT: {
> - int64_t Hi = SignExtend64(Val + 0x800, Bits) >> 12;
> - checkInt(Loc, Hi, 20, Type);
> - if (isInt<20>(Hi)) {
> - relocateOne(Loc, R_RISCV_PCREL_HI20, Val);
> - relocateOne(Loc + 4, R_RISCV_PCREL_LO12_I, Val);
> + int64_t hi = SignExtend64(val + 0x800, bits) >> 12;
> + checkInt(loc, hi, 20, type);
> + if (isInt<20>(hi)) {
> + relocateOne(loc, R_RISCV_PCREL_HI20, val);
> + relocateOne(loc + 4, R_RISCV_PCREL_LO12_I, val);
> }
> return;
> }
> @@ -341,78 +341,78 @@ void RISCV::relocateOne(uint8_t *Loc, co
> case R_RISCV_TLS_GOT_HI20:
> case R_RISCV_TPREL_HI20:
> case R_RISCV_HI20: {
> - uint64_t Hi = Val + 0x800;
> - checkInt(Loc, SignExtend64(Hi, Bits) >> 12, 20, Type);
> - write32le(Loc, (read32le(Loc) & 0xFFF) | (Hi & 0xFFFFF000));
> + uint64_t hi = val + 0x800;
> + checkInt(loc, SignExtend64(hi, bits) >> 12, 20, type);
> + write32le(loc, (read32le(loc) & 0xFFF) | (hi & 0xFFFFF000));
> return;
> }
>
> case R_RISCV_PCREL_LO12_I:
> case R_RISCV_TPREL_LO12_I:
> case R_RISCV_LO12_I: {
> - uint64_t Hi = (Val + 0x800) >> 12;
> - uint64_t Lo = Val - (Hi << 12);
> - write32le(Loc, (read32le(Loc) & 0xFFFFF) | ((Lo & 0xFFF) << 20));
> + uint64_t hi = (val + 0x800) >> 12;
> + uint64_t lo = val - (hi << 12);
> + write32le(loc, (read32le(loc) & 0xFFFFF) | ((lo & 0xFFF) << 20));
> return;
> }
>
> case R_RISCV_PCREL_LO12_S:
> case R_RISCV_TPREL_LO12_S:
> case R_RISCV_LO12_S: {
> - uint64_t Hi = (Val + 0x800) >> 12;
> - uint64_t Lo = Val - (Hi << 12);
> - uint32_t Imm11_5 = extractBits(Lo, 11, 5) << 25;
> - uint32_t Imm4_0 = extractBits(Lo, 4, 0) << 7;
> - write32le(Loc, (read32le(Loc) & 0x1FFF07F) | Imm11_5 | Imm4_0);
> + uint64_t hi = (val + 0x800) >> 12;
> + uint64_t lo = val - (hi << 12);
> + uint32_t imm11_5 = extractBits(lo, 11, 5) << 25;
> + uint32_t imm4_0 = extractBits(lo, 4, 0) << 7;
> + write32le(loc, (read32le(loc) & 0x1FFF07F) | imm11_5 | imm4_0);
> return;
> }
>
> case R_RISCV_ADD8:
> - *Loc += Val;
> + *loc += val;
> return;
> case R_RISCV_ADD16:
> - write16le(Loc, read16le(Loc) + Val);
> + write16le(loc, read16le(loc) + val);
> return;
> case R_RISCV_ADD32:
> - write32le(Loc, read32le(Loc) + Val);
> + write32le(loc, read32le(loc) + val);
> return;
> case R_RISCV_ADD64:
> - write64le(Loc, read64le(Loc) + Val);
> + write64le(loc, read64le(loc) + val);
> return;
> case R_RISCV_SUB6:
> - *Loc = (*Loc & 0xc0) | (((*Loc & 0x3f) - Val) & 0x3f);
> + *loc = (*loc & 0xc0) | (((*loc & 0x3f) - val) & 0x3f);
> return;
> case R_RISCV_SUB8:
> - *Loc -= Val;
> + *loc -= val;
> return;
> case R_RISCV_SUB16:
> - write16le(Loc, read16le(Loc) - Val);
> + write16le(loc, read16le(loc) - val);
> return;
> case R_RISCV_SUB32:
> - write32le(Loc, read32le(Loc) - Val);
> + write32le(loc, read32le(loc) - val);
> return;
> case R_RISCV_SUB64:
> - write64le(Loc, read64le(Loc) - Val);
> + write64le(loc, read64le(loc) - val);
> return;
> case R_RISCV_SET6:
> - *Loc = (*Loc & 0xc0) | (Val & 0x3f);
> + *loc = (*loc & 0xc0) | (val & 0x3f);
> return;
> case R_RISCV_SET8:
> - *Loc = Val;
> + *loc = val;
> return;
> case R_RISCV_SET16:
> - write16le(Loc, Val);
> + write16le(loc, val);
> return;
> case R_RISCV_SET32:
> case R_RISCV_32_PCREL:
> - write32le(Loc, Val);
> + write32le(loc, val);
> return;
>
> case R_RISCV_TLS_DTPREL32:
> - write32le(Loc, Val - DTPOffset);
> + write32le(loc, val - dtpOffset);
> break;
> case R_RISCV_TLS_DTPREL64:
> - write64le(Loc, Val - DTPOffset);
> + write64le(loc, val - dtpOffset);
> break;
>
> case R_RISCV_ALIGN:
> @@ -430,13 +430,13 @@ void RISCV::relocateOne(uint8_t *Loc, co
> case R_RISCV_GPREL_I:
> case R_RISCV_GPREL_S:
> default:
> - error(getErrorLocation(Loc) +
> - "unimplemented relocation: " + toString(Type));
> + error(getErrorLocation(loc) +
> + "unimplemented relocation: " + toString(type));
> return;
> }
> }
>
> TargetInfo *elf::getRISCVTargetInfo() {
> - static RISCV Target;
> - return &Target;
> + static RISCV target;
> + return ⌖
> }
>
> Modified: lld/trunk/ELF/Arch/SPARCV9.cpp
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_Arch_SPARCV9.cpp-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=OJ_bWBG79cEd8wnTohjOqJjcK_6NQIDMrXX550rPwPE&e=
>
> ==============================================================================
> --- lld/trunk/ELF/Arch/SPARCV9.cpp (original)
> +++ lld/trunk/ELF/Arch/SPARCV9.cpp Tue Jul 9 22:00:37 2019
> @@ -23,32 +23,32 @@ namespace {
> class SPARCV9 final : public TargetInfo {
> public:
> SPARCV9();
> - RelExpr getRelExpr(RelType Type, const Symbol &S,
> - const uint8_t *Loc) const override;
> - void writePlt(uint8_t *Buf, uint64_t GotEntryAddr, uint64_t
> PltEntryAddr,
> - int32_t Index, unsigned RelOff) const override;
> - void relocateOne(uint8_t *Loc, RelType Type, uint64_t Val) const
> override;
> + RelExpr getRelExpr(RelType type, const Symbol &s,
> + const uint8_t *loc) const override;
> + void writePlt(uint8_t *buf, uint64_t gotEntryAddr, uint64_t
> pltEntryAddr,
> + int32_t index, unsigned relOff) const override;
> + void relocateOne(uint8_t *loc, RelType type, uint64_t val) const
> override;
> };
> } // namespace
>
> SPARCV9::SPARCV9() {
> - CopyRel = R_SPARC_COPY;
> - GotRel = R_SPARC_GLOB_DAT;
> - NoneRel = R_SPARC_NONE;
> - PltRel = R_SPARC_JMP_SLOT;
> - RelativeRel = R_SPARC_RELATIVE;
> - SymbolicRel = R_SPARC_64;
> - PltEntrySize = 32;
> - PltHeaderSize = 4 * PltEntrySize;
> -
> - DefaultCommonPageSize = 8192;
> - DefaultMaxPageSize = 0x100000;
> - DefaultImageBase = 0x100000;
> + copyRel = R_SPARC_COPY;
> + gotRel = R_SPARC_GLOB_DAT;
> + noneRel = R_SPARC_NONE;
> + pltRel = R_SPARC_JMP_SLOT;
> + relativeRel = R_SPARC_RELATIVE;
> + symbolicRel = R_SPARC_64;
> + pltEntrySize = 32;
> + pltHeaderSize = 4 * pltEntrySize;
> +
> + defaultCommonPageSize = 8192;
> + defaultMaxPageSize = 0x100000;
> + defaultImageBase = 0x100000;
> }
>
> -RelExpr SPARCV9::getRelExpr(RelType Type, const Symbol &S,
> - const uint8_t *Loc) const {
> - switch (Type) {
> +RelExpr SPARCV9::getRelExpr(RelType type, const Symbol &s,
> + const uint8_t *loc) const {
> + switch (type) {
> case R_SPARC_32:
> case R_SPARC_UA32:
> case R_SPARC_64:
> @@ -68,65 +68,65 @@ RelExpr SPARCV9::getRelExpr(RelType Type
> case R_SPARC_NONE:
> return R_NONE;
> default:
> - error(getErrorLocation(Loc) + "unknown relocation (" +
> Twine(Type) +
> - ") against symbol " + toString(S));
> + error(getErrorLocation(loc) + "unknown relocation (" +
> Twine(type) +
> + ") against symbol " + toString(s));
> return R_NONE;
> }
> }
>
> -void SPARCV9::relocateOne(uint8_t *Loc, RelType Type, uint64_t Val)
> const {
> - switch (Type) {
> +void SPARCV9::relocateOne(uint8_t *loc, RelType type, uint64_t val)
> const {
> + switch (type) {
> case R_SPARC_32:
> case R_SPARC_UA32:
> // V-word32
> - checkUInt(Loc, Val, 32, Type);
> - write32be(Loc, Val);
> + checkUInt(loc, val, 32, type);
> + write32be(loc, val);
> break;
> case R_SPARC_DISP32:
> // V-disp32
> - checkInt(Loc, Val, 32, Type);
> - write32be(Loc, Val);
> + checkInt(loc, val, 32, type);
> + write32be(loc, val);
> break;
> case R_SPARC_WDISP30:
> case R_SPARC_WPLT30:
> // V-disp30
> - checkInt(Loc, Val, 32, Type);
> - write32be(Loc, (read32be(Loc) & ~0x3fffffff) | ((Val >> 2) &
> 0x3fffffff));
> + checkInt(loc, val, 32, type);
> + write32be(loc, (read32be(loc) & ~0x3fffffff) | ((val >> 2) &
> 0x3fffffff));
> break;
> case R_SPARC_22:
> // V-imm22
> - checkUInt(Loc, Val, 22, Type);
> - write32be(Loc, (read32be(Loc) & ~0x003fffff) | (Val &
> 0x003fffff));
> + checkUInt(loc, val, 22, type);
> + write32be(loc, (read32be(loc) & ~0x003fffff) | (val &
> 0x003fffff));
> break;
> case R_SPARC_GOT22:
> case R_SPARC_PC22:
> // T-imm22
> - write32be(Loc, (read32be(Loc) & ~0x003fffff) | ((Val >> 10) &
> 0x003fffff));
> + write32be(loc, (read32be(loc) & ~0x003fffff) | ((val >> 10) &
> 0x003fffff));
> break;
> case R_SPARC_WDISP19:
> // V-disp19
> - checkInt(Loc, Val, 21, Type);
> - write32be(Loc, (read32be(Loc) & ~0x0007ffff) | ((Val >> 2) &
> 0x0007ffff));
> + checkInt(loc, val, 21, type);
> + write32be(loc, (read32be(loc) & ~0x0007ffff) | ((val >> 2) &
> 0x0007ffff));
> break;
> case R_SPARC_GOT10:
> case R_SPARC_PC10:
> // T-simm10
> - write32be(Loc, (read32be(Loc) & ~0x000003ff) | (Val &
> 0x000003ff));
> + write32be(loc, (read32be(loc) & ~0x000003ff) | (val &
> 0x000003ff));
> break;
> case R_SPARC_64:
> case R_SPARC_UA64:
> // V-xword64
> - write64be(Loc, Val);
> + write64be(loc, val);
> break;
> default:
> llvm_unreachable("unknown relocation");
> }
> }
>
> -void SPARCV9::writePlt(uint8_t *Buf, uint64_t GotEntryAddr,
> - uint64_t PltEntryAddr, int32_t Index,
> - unsigned RelOff) const {
> - const uint8_t PltData[] = {
> +void SPARCV9::writePlt(uint8_t *buf, uint64_t gotEntryAddr,
> + uint64_t pltEntryAddr, int32_t index,
> + unsigned relOff) const {
> + const uint8_t pltData[] = {
> 0x03, 0x00, 0x00, 0x00, // sethi (. - .PLT0), %g1
> 0x30, 0x68, 0x00, 0x00, // ba,a %xcc, .PLT1
> 0x01, 0x00, 0x00, 0x00, // nop
> @@ -136,14 +136,14 @@ void SPARCV9::writePlt(uint8_t *Buf, uin
> 0x01, 0x00, 0x00, 0x00, // nop
> 0x01, 0x00, 0x00, 0x00 // nop
> };
> - memcpy(Buf, PltData, sizeof(PltData));
> + memcpy(buf, pltData, sizeof(pltData));
>
> - uint64_t Off = PltHeaderSize + PltEntrySize * Index;
> - relocateOne(Buf, R_SPARC_22, Off);
> - relocateOne(Buf + 4, R_SPARC_WDISP19, -(Off + 4 - PltEntrySize));
> + uint64_t off = pltHeaderSize + pltEntrySize * index;
> + relocateOne(buf, R_SPARC_22, off);
> + relocateOne(buf + 4, R_SPARC_WDISP19, -(off + 4 - pltEntrySize));
> }
>
> TargetInfo *elf::getSPARCV9TargetInfo() {
> - static SPARCV9 Target;
> - return &Target;
> + static SPARCV9 target;
> + return ⌖
> }
>
> Modified: lld/trunk/ELF/Arch/X86.cpp
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_Arch_X86.cpp-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=cApiwTib39xcmU3JhNlSqsKs-D0E8YFIZQpR8rbxwUs&e=
>
> ==============================================================================
> --- lld/trunk/ELF/Arch/X86.cpp (original)
> +++ lld/trunk/ELF/Arch/X86.cpp Tue Jul 9 22:00:37 2019
> @@ -23,63 +23,63 @@ namespace {
> class X86 : public TargetInfo {
> public:
> X86();
> - int getTlsGdRelaxSkip(RelType Type) const override;
> - RelExpr getRelExpr(RelType Type, const Symbol &S,
> - const uint8_t *Loc) const override;
> - int64_t getImplicitAddend(const uint8_t *Buf, RelType Type) const
> override;
> - void writeGotPltHeader(uint8_t *Buf) const override;
> - RelType getDynRel(RelType Type) const override;
> - void writeGotPlt(uint8_t *Buf, const Symbol &S) const override;
> - void writeIgotPlt(uint8_t *Buf, const Symbol &S) const override;
> - void writePltHeader(uint8_t *Buf) const override;
> - void writePlt(uint8_t *Buf, uint64_t GotPltEntryAddr, uint64_t
> PltEntryAddr,
> - int32_t Index, unsigned RelOff) const override;
> - void relocateOne(uint8_t *Loc, RelType Type, uint64_t Val) const
> override;
> -
> - RelExpr adjustRelaxExpr(RelType Type, const uint8_t *Data,
> - RelExpr Expr) const override;
> - void relaxTlsGdToIe(uint8_t *Loc, RelType Type, uint64_t Val) const
> override;
> - void relaxTlsGdToLe(uint8_t *Loc, RelType Type, uint64_t Val) const
> override;
> - void relaxTlsIeToLe(uint8_t *Loc, RelType Type, uint64_t Val) const
> override;
> - void relaxTlsLdToLe(uint8_t *Loc, RelType Type, uint64_t Val) const
> override;
> + int getTlsGdRelaxSkip(RelType type) const override;
> + RelExpr getRelExpr(RelType type, const Symbol &s,
> + const uint8_t *loc) const override;
> + int64_t getImplicitAddend(const uint8_t *buf, RelType type) const
> override;
> + void writeGotPltHeader(uint8_t *buf) const override;
> + RelType getDynRel(RelType type) const override;
> + void writeGotPlt(uint8_t *buf, const Symbol &s) const override;
> + void writeIgotPlt(uint8_t *buf, const Symbol &s) const override;
> + void writePltHeader(uint8_t *buf) const override;
> + void writePlt(uint8_t *buf, uint64_t gotPltEntryAddr, uint64_t
> pltEntryAddr,
> + int32_t index, unsigned relOff) const override;
> + void relocateOne(uint8_t *loc, RelType type, uint64_t val) const
> override;
> +
> + RelExpr adjustRelaxExpr(RelType type, const uint8_t *data,
> + RelExpr expr) const override;
> + void relaxTlsGdToIe(uint8_t *loc, RelType type, uint64_t val) const
> override;
> + void relaxTlsGdToLe(uint8_t *loc, RelType type, uint64_t val) const
> override;
> + void relaxTlsIeToLe(uint8_t *loc, RelType type, uint64_t val) const
> override;
> + void relaxTlsLdToLe(uint8_t *loc, RelType type, uint64_t val) const
> override;
> };
> } // namespace
>
> X86::X86() {
> - CopyRel = R_386_COPY;
> - GotRel = R_386_GLOB_DAT;
> - NoneRel = R_386_NONE;
> - PltRel = R_386_JUMP_SLOT;
> - IRelativeRel = R_386_IRELATIVE;
> - RelativeRel = R_386_RELATIVE;
> - SymbolicRel = R_386_32;
> - TlsGotRel = R_386_TLS_TPOFF;
> - TlsModuleIndexRel = R_386_TLS_DTPMOD32;
> - TlsOffsetRel = R_386_TLS_DTPOFF32;
> - PltEntrySize = 16;
> - PltHeaderSize = 16;
> - TrapInstr = {0xcc, 0xcc, 0xcc, 0xcc}; // 0xcc = INT3
> + copyRel = R_386_COPY;
> + gotRel = R_386_GLOB_DAT;
> + noneRel = R_386_NONE;
> + pltRel = R_386_JUMP_SLOT;
> + iRelativeRel = R_386_IRELATIVE;
> + relativeRel = R_386_RELATIVE;
> + symbolicRel = R_386_32;
> + tlsGotRel = R_386_TLS_TPOFF;
> + tlsModuleIndexRel = R_386_TLS_DTPMOD32;
> + tlsOffsetRel = R_386_TLS_DTPOFF32;
> + pltEntrySize = 16;
> + pltHeaderSize = 16;
> + trapInstr = {0xcc, 0xcc, 0xcc, 0xcc}; // 0xcc = INT3
>
> // Align to the non-PAE large page size (known as a superpage or
> huge page).
> // FreeBSD automatically promotes large, superpage-aligned
> allocations.
> - DefaultImageBase = 0x400000;
> + defaultImageBase = 0x400000;
> }
>
> -int X86::getTlsGdRelaxSkip(RelType Type) const {
> +int X86::getTlsGdRelaxSkip(RelType type) const {
> return 2;
> }
>
> -RelExpr X86::getRelExpr(RelType Type, const Symbol &S,
> - const uint8_t *Loc) const {
> +RelExpr X86::getRelExpr(RelType type, const Symbol &s,
> + const uint8_t *loc) const {
> // There are 4 different TLS variable models with varying degrees of
> // flexibility and performance. LocalExec and InitialExec models
> are fast but
> // less-flexible models. If they are in use, we set DF_STATIC_TLS
> flag in the
> // dynamic section to let runtime know about that.
> - if (Type == R_386_TLS_LE || Type == R_386_TLS_LE_32 || Type ==
> R_386_TLS_IE ||
> - Type == R_386_TLS_GOTIE)
> - Config->HasStaticTlsModel = true;
> + if (type == R_386_TLS_LE || type == R_386_TLS_LE_32 || type ==
> R_386_TLS_IE ||
> + type == R_386_TLS_GOTIE)
> + config->hasStaticTlsModel = true;
>
> - switch (Type) {
> + switch (type) {
> case R_386_8:
> case R_386_16:
> case R_386_32:
> @@ -137,7 +137,7 @@ RelExpr X86::getRelExpr(RelType Type, co
> // instruction. That means a ModRM byte is at Loc[-1]. By taking
> a look at
> // the byte, we can determine whether the instruction uses the
> operand as an
> // absolute address (R_GOT) or a register-relative address
> (R_GOTPLT).
> - return (Loc[-1] & 0xc7) == 0x5 ? R_GOT : R_GOTPLT;
> + return (loc[-1] & 0xc7) == 0x5 ? R_GOT : R_GOTPLT;
> case R_386_TLS_GOTIE:
> return R_GOTPLT;
> case R_386_GOTOFF:
> @@ -149,17 +149,17 @@ RelExpr X86::getRelExpr(RelType Type, co
> case R_386_NONE:
> return R_NONE;
> default:
> - error(getErrorLocation(Loc) + "unknown relocation (" +
> Twine(Type) +
> - ") against symbol " + toString(S));
> + error(getErrorLocation(loc) + "unknown relocation (" +
> Twine(type) +
> + ") against symbol " + toString(s));
> return R_NONE;
> }
> }
>
> -RelExpr X86::adjustRelaxExpr(RelType Type, const uint8_t *Data,
> - RelExpr Expr) const {
> - switch (Expr) {
> +RelExpr X86::adjustRelaxExpr(RelType type, const uint8_t *data,
> + RelExpr expr) const {
> + switch (expr) {
> default:
> - return Expr;
> + return expr;
> case R_RELAX_TLS_GD_TO_IE:
> return R_RELAX_TLS_GD_TO_IE_GOTPLT;
> case R_RELAX_TLS_GD_TO_LE:
> @@ -167,84 +167,84 @@ RelExpr X86::adjustRelaxExpr(RelType Typ
> }
> }
>
> -void X86::writeGotPltHeader(uint8_t *Buf) const {
> - write32le(Buf, Main->Dynamic->getVA());
> +void X86::writeGotPltHeader(uint8_t *buf) const {
> + write32le(buf, mainPart->dynamic->getVA());
> }
>
> -void X86::writeGotPlt(uint8_t *Buf, const Symbol &S) const {
> +void X86::writeGotPlt(uint8_t *buf, const Symbol &s) const {
> // Entries in .got.plt initially points back to the corresponding
> // PLT entries with a fixed offset to skip the first instruction.
> - write32le(Buf, S.getPltVA() + 6);
> + write32le(buf, s.getPltVA() + 6);
> }
>
> -void X86::writeIgotPlt(uint8_t *Buf, const Symbol &S) const {
> +void X86::writeIgotPlt(uint8_t *buf, const Symbol &s) const {
> // An x86 entry is the address of the ifunc resolver function.
> - write32le(Buf, S.getVA());
> + write32le(buf, s.getVA());
> }
>
> -RelType X86::getDynRel(RelType Type) const {
> - if (Type == R_386_TLS_LE)
> +RelType X86::getDynRel(RelType type) const {
> + if (type == R_386_TLS_LE)
> return R_386_TLS_TPOFF;
> - if (Type == R_386_TLS_LE_32)
> + if (type == R_386_TLS_LE_32)
> return R_386_TLS_TPOFF32;
> - return Type;
> + return type;
> }
>
> -void X86::writePltHeader(uint8_t *Buf) const {
> - if (Config->Pic) {
> - const uint8_t V[] = {
> +void X86::writePltHeader(uint8_t *buf) const {
> + if (config->isPic) {
> + const uint8_t v[] = {
> 0xff, 0xb3, 0x04, 0x00, 0x00, 0x00, // pushl 4(%ebx)
> 0xff, 0xa3, 0x08, 0x00, 0x00, 0x00, // jmp *8(%ebx)
> 0x90, 0x90, 0x90, 0x90 // nop
> };
> - memcpy(Buf, V, sizeof(V));
> + memcpy(buf, v, sizeof(v));
> return;
> }
>
> - const uint8_t PltData[] = {
> + const uint8_t pltData[] = {
> 0xff, 0x35, 0, 0, 0, 0, // pushl (GOTPLT+4)
> 0xff, 0x25, 0, 0, 0, 0, // jmp *(GOTPLT+8)
> 0x90, 0x90, 0x90, 0x90, // nop
> };
> - memcpy(Buf, PltData, sizeof(PltData));
> - uint32_t GotPlt = In.GotPlt->getVA();
> - write32le(Buf + 2, GotPlt + 4);
> - write32le(Buf + 8, GotPlt + 8);
> + memcpy(buf, pltData, sizeof(pltData));
> + uint32_t gotPlt = in.gotPlt->getVA();
> + write32le(buf + 2, gotPlt + 4);
> + write32le(buf + 8, gotPlt + 8);
> }
>
> -void X86::writePlt(uint8_t *Buf, uint64_t GotPltEntryAddr,
> - uint64_t PltEntryAddr, int32_t Index,
> - unsigned RelOff) const {
> - if (Config->Pic) {
> - const uint8_t Inst[] = {
> +void X86::writePlt(uint8_t *buf, uint64_t gotPltEntryAddr,
> + uint64_t pltEntryAddr, int32_t index,
> + unsigned relOff) const {
> + if (config->isPic) {
> + const uint8_t inst[] = {
> 0xff, 0xa3, 0, 0, 0, 0, // jmp *foo at GOT(%ebx)
> 0x68, 0, 0, 0, 0, // pushl $reloc_offset
> 0xe9, 0, 0, 0, 0, // jmp .PLT0 at PC
> };
> - memcpy(Buf, Inst, sizeof(Inst));
> - write32le(Buf + 2, GotPltEntryAddr - In.GotPlt->getVA());
> + memcpy(buf, inst, sizeof(inst));
> + write32le(buf + 2, gotPltEntryAddr - in.gotPlt->getVA());
> } else {
> - const uint8_t Inst[] = {
> + const uint8_t inst[] = {
> 0xff, 0x25, 0, 0, 0, 0, // jmp *foo at GOT
> 0x68, 0, 0, 0, 0, // pushl $reloc_offset
> 0xe9, 0, 0, 0, 0, // jmp .PLT0 at PC
> };
> - memcpy(Buf, Inst, sizeof(Inst));
> - write32le(Buf + 2, GotPltEntryAddr);
> + memcpy(buf, inst, sizeof(inst));
> + write32le(buf + 2, gotPltEntryAddr);
> }
>
> - write32le(Buf + 7, RelOff);
> - write32le(Buf + 12, -PltHeaderSize - PltEntrySize * Index - 16);
> + write32le(buf + 7, relOff);
> + write32le(buf + 12, -pltHeaderSize - pltEntrySize * index - 16);
> }
>
> -int64_t X86::getImplicitAddend(const uint8_t *Buf, RelType Type)
> const {
> - switch (Type) {
> +int64_t X86::getImplicitAddend(const uint8_t *buf, RelType type)
> const {
> + switch (type) {
> case R_386_8:
> case R_386_PC8:
> - return SignExtend64<8>(*Buf);
> + return SignExtend64<8>(*buf);
> case R_386_16:
> case R_386_PC16:
> - return SignExtend64<16>(read16le(Buf));
> + return SignExtend64<16>(read16le(buf));
> case R_386_32:
> case R_386_GOT32:
> case R_386_GOT32X:
> @@ -254,28 +254,28 @@ int64_t X86::getImplicitAddend(const uin
> case R_386_PLT32:
> case R_386_TLS_LDO_32:
> case R_386_TLS_LE:
> - return SignExtend64<32>(read32le(Buf));
> + return SignExtend64<32>(read32le(buf));
> default:
> return 0;
> }
> }
>
> -void X86::relocateOne(uint8_t *Loc, RelType Type, uint64_t Val) const
> {
> - switch (Type) {
> +void X86::relocateOne(uint8_t *loc, RelType type, uint64_t val) const
> {
> + switch (type) {
> case R_386_8:
> // R_386_{PC,}{8,16} are not part of the i386 psABI, but they are
> // being used for some 16-bit programs such as boot loaders, so
> // we want to support them.
> - checkIntUInt(Loc, Val, 8, Type);
> - *Loc = Val;
> + checkIntUInt(loc, val, 8, type);
> + *loc = val;
> break;
> case R_386_PC8:
> - checkInt(Loc, Val, 8, Type);
> - *Loc = Val;
> + checkInt(loc, val, 8, type);
> + *loc = val;
> break;
> case R_386_16:
> - checkIntUInt(Loc, Val, 16, Type);
> - write16le(Loc, Val);
> + checkIntUInt(loc, val, 16, type);
> + write16le(loc, val);
> break;
> case R_386_PC16:
> // R_386_PC16 is normally used with 16 bit code. In that situation
> @@ -288,8 +288,8 @@ void X86::relocateOne(uint8_t *Loc, RelT
> // current location subtracted from it.
> // We just check that Val fits in 17 bits. This misses some
> cases, but
> // should have no false positives.
> - checkInt(Loc, Val, 17, Type);
> - write16le(Loc, Val);
> + checkInt(loc, val, 17, type);
> + write16le(loc, val);
> break;
> case R_386_32:
> case R_386_GOT32:
> @@ -310,86 +310,86 @@ void X86::relocateOne(uint8_t *Loc, RelT
> case R_386_TLS_LE_32:
> case R_386_TLS_TPOFF:
> case R_386_TLS_TPOFF32:
> - checkInt(Loc, Val, 32, Type);
> - write32le(Loc, Val);
> + checkInt(loc, val, 32, type);
> + write32le(loc, val);
> break;
> default:
> llvm_unreachable("unknown relocation");
> }
> }
>
> -void X86::relaxTlsGdToLe(uint8_t *Loc, RelType Type, uint64_t Val)
> const {
> +void X86::relaxTlsGdToLe(uint8_t *loc, RelType type, uint64_t val)
> const {
> // Convert
> // leal x at tlsgd(, %ebx, 1),
> // call __tls_get_addr at plt
> // to
> // movl %gs:0,%eax
> // subl $x at ntpoff,%eax
> - const uint8_t Inst[] = {
> + const uint8_t inst[] = {
> 0x65, 0xa1, 0x00, 0x00, 0x00, 0x00, // movl %gs:0, %eax
> 0x81, 0xe8, 0, 0, 0, 0, // subl Val(%ebx), %eax
> };
> - memcpy(Loc - 3, Inst, sizeof(Inst));
> - write32le(Loc + 5, Val);
> + memcpy(loc - 3, inst, sizeof(inst));
> + write32le(loc + 5, val);
> }
>
> -void X86::relaxTlsGdToIe(uint8_t *Loc, RelType Type, uint64_t Val)
> const {
> +void X86::relaxTlsGdToIe(uint8_t *loc, RelType type, uint64_t val)
> const {
> // Convert
> // leal x at tlsgd(, %ebx, 1),
> // call __tls_get_addr at plt
> // to
> // movl %gs:0, %eax
> // addl x at gotntpoff(%ebx), %eax
> - const uint8_t Inst[] = {
> + const uint8_t inst[] = {
> 0x65, 0xa1, 0x00, 0x00, 0x00, 0x00, // movl %gs:0, %eax
> 0x03, 0x83, 0, 0, 0, 0, // addl Val(%ebx), %eax
> };
> - memcpy(Loc - 3, Inst, sizeof(Inst));
> - write32le(Loc + 5, Val);
> + memcpy(loc - 3, inst, sizeof(inst));
> + write32le(loc + 5, val);
> }
>
> // In some conditions, relocations can be optimized to avoid using
> GOT.
> // This function does that for Initial Exec to Local Exec case.
> -void X86::relaxTlsIeToLe(uint8_t *Loc, RelType Type, uint64_t Val)
> const {
> +void X86::relaxTlsIeToLe(uint8_t *loc, RelType type, uint64_t val)
> const {
> // Ulrich's document section 6.2 says that @gotntpoff can
> // be used with MOVL or ADDL instructions.
> // @indntpoff is similar to @gotntpoff, but for use in
> // position dependent code.
> - uint8_t Reg = (Loc[-1] >> 3) & 7;
> + uint8_t reg = (loc[-1] >> 3) & 7;
>
> - if (Type == R_386_TLS_IE) {
> - if (Loc[-1] == 0xa1) {
> + if (type == R_386_TLS_IE) {
> + if (loc[-1] == 0xa1) {
> // "movl foo at indntpoff,%eax" -> "movl $foo,%eax"
> // This case is different from the generic case below because
> // this is a 5 byte instruction while below is 6 bytes.
> - Loc[-1] = 0xb8;
> - } else if (Loc[-2] == 0x8b) {
> + loc[-1] = 0xb8;
> + } else if (loc[-2] == 0x8b) {
> // "movl foo at indntpoff,%reg" -> "movl $foo,%reg"
> - Loc[-2] = 0xc7;
> - Loc[-1] = 0xc0 | Reg;
> + loc[-2] = 0xc7;
> + loc[-1] = 0xc0 | reg;
> } else {
> // "addl foo at indntpoff,%reg" -> "addl $foo,%reg"
> - Loc[-2] = 0x81;
> - Loc[-1] = 0xc0 | Reg;
> + loc[-2] = 0x81;
> + loc[-1] = 0xc0 | reg;
> }
> } else {
> - assert(Type == R_386_TLS_GOTIE);
> - if (Loc[-2] == 0x8b) {
> + assert(type == R_386_TLS_GOTIE);
> + if (loc[-2] == 0x8b) {
> // "movl foo at gottpoff(%rip),%reg" -> "movl $foo,%reg"
> - Loc[-2] = 0xc7;
> - Loc[-1] = 0xc0 | Reg;
> + loc[-2] = 0xc7;
> + loc[-1] = 0xc0 | reg;
> } else {
> // "addl foo at gotntpoff(%rip),%reg" -> "leal foo(%reg),%reg"
> - Loc[-2] = 0x8d;
> - Loc[-1] = 0x80 | (Reg << 3) | Reg;
> + loc[-2] = 0x8d;
> + loc[-1] = 0x80 | (reg << 3) | reg;
> }
> }
> - write32le(Loc, Val);
> + write32le(loc, val);
> }
>
> -void X86::relaxTlsLdToLe(uint8_t *Loc, RelType Type, uint64_t Val)
> const {
> - if (Type == R_386_TLS_LDO_32) {
> - write32le(Loc, Val);
> +void X86::relaxTlsLdToLe(uint8_t *loc, RelType type, uint64_t val)
> const {
> + if (type == R_386_TLS_LDO_32) {
> + write32le(loc, val);
> return;
> }
>
> @@ -400,45 +400,45 @@ void X86::relaxTlsLdToLe(uint8_t *Loc, R
> // movl %gs:0,%eax
> // nop
> // leal 0(%esi,1),%esi
> - const uint8_t Inst[] = {
> + const uint8_t inst[] = {
> 0x65, 0xa1, 0x00, 0x00, 0x00, 0x00, // movl %gs:0,%eax
> 0x90, // nop
> 0x8d, 0x74, 0x26, 0x00, // leal 0(%esi,1),%esi
> };
> - memcpy(Loc - 2, Inst, sizeof(Inst));
> + memcpy(loc - 2, inst, sizeof(inst));
> }
>
> namespace {
> class RetpolinePic : public X86 {
> public:
> RetpolinePic();
> - void writeGotPlt(uint8_t *Buf, const Symbol &S) const override;
> - void writePltHeader(uint8_t *Buf) const override;
> - void writePlt(uint8_t *Buf, uint64_t GotPltEntryAddr, uint64_t
> PltEntryAddr,
> - int32_t Index, unsigned RelOff) const override;
> + void writeGotPlt(uint8_t *buf, const Symbol &s) const override;
> + void writePltHeader(uint8_t *buf) const override;
> + void writePlt(uint8_t *buf, uint64_t gotPltEntryAddr, uint64_t
> pltEntryAddr,
> + int32_t index, unsigned relOff) const override;
> };
>
> class RetpolineNoPic : public X86 {
> public:
> RetpolineNoPic();
> - void writeGotPlt(uint8_t *Buf, const Symbol &S) const override;
> - void writePltHeader(uint8_t *Buf) const override;
> - void writePlt(uint8_t *Buf, uint64_t GotPltEntryAddr, uint64_t
> PltEntryAddr,
> - int32_t Index, unsigned RelOff) const override;
> + void writeGotPlt(uint8_t *buf, const Symbol &s) const override;
> + void writePltHeader(uint8_t *buf) const override;
> + void writePlt(uint8_t *buf, uint64_t gotPltEntryAddr, uint64_t
> pltEntryAddr,
> + int32_t index, unsigned relOff) const override;
> };
> } // namespace
>
> RetpolinePic::RetpolinePic() {
> - PltHeaderSize = 48;
> - PltEntrySize = 32;
> + pltHeaderSize = 48;
> + pltEntrySize = 32;
> }
>
> -void RetpolinePic::writeGotPlt(uint8_t *Buf, const Symbol &S) const {
> - write32le(Buf, S.getPltVA() + 17);
> +void RetpolinePic::writeGotPlt(uint8_t *buf, const Symbol &s) const {
> + write32le(buf, s.getPltVA() + 17);
> }
>
> -void RetpolinePic::writePltHeader(uint8_t *Buf) const {
> - const uint8_t Insn[] = {
> +void RetpolinePic::writePltHeader(uint8_t *buf) const {
> + const uint8_t insn[] = {
> 0xff, 0xb3, 4, 0, 0, 0, // 0: pushl 4(%ebx)
> 0x50, // 6: pushl %eax
> 0x8b, 0x83, 8, 0, 0, 0, // 7: mov 8(%ebx),
> %eax
> @@ -455,13 +455,13 @@ void RetpolinePic::writePltHeader(uint8_
> 0xc3, // 2e: ret
> 0xcc, // 2f: int3; padding
> };
> - memcpy(Buf, Insn, sizeof(Insn));
> + memcpy(buf, insn, sizeof(insn));
> }
>
> -void RetpolinePic::writePlt(uint8_t *Buf, uint64_t GotPltEntryAddr,
> - uint64_t PltEntryAddr, int32_t Index,
> - unsigned RelOff) const {
> - const uint8_t Insn[] = {
> +void RetpolinePic::writePlt(uint8_t *buf, uint64_t gotPltEntryAddr,
> + uint64_t pltEntryAddr, int32_t index,
> + unsigned relOff) const {
> + const uint8_t insn[] = {
> 0x50, // pushl %eax
> 0x8b, 0x83, 0, 0, 0, 0, // mov foo at GOT(%ebx), %eax
> 0xe8, 0, 0, 0, 0, // call plt+0x20
> @@ -470,28 +470,28 @@ void RetpolinePic::writePlt(uint8_t *Buf
> 0xe9, 0, 0, 0, 0, // jmp plt+0
> 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, // int3; padding
> };
> - memcpy(Buf, Insn, sizeof(Insn));
> + memcpy(buf, insn, sizeof(insn));
>
> - uint32_t Ebx = In.GotPlt->getVA();
> - unsigned Off = PltHeaderSize + PltEntrySize * Index;
> - write32le(Buf + 3, GotPltEntryAddr - Ebx);
> - write32le(Buf + 8, -Off - 12 + 32);
> - write32le(Buf + 13, -Off - 17 + 18);
> - write32le(Buf + 18, RelOff);
> - write32le(Buf + 23, -Off - 27);
> + uint32_t ebx = in.gotPlt->getVA();
> + unsigned off = pltHeaderSize + pltEntrySize * index;
> + write32le(buf + 3, gotPltEntryAddr - ebx);
> + write32le(buf + 8, -off - 12 + 32);
> + write32le(buf + 13, -off - 17 + 18);
> + write32le(buf + 18, relOff);
> + write32le(buf + 23, -off - 27);
> }
>
> RetpolineNoPic::RetpolineNoPic() {
> - PltHeaderSize = 48;
> - PltEntrySize = 32;
> + pltHeaderSize = 48;
> + pltEntrySize = 32;
> }
>
> -void RetpolineNoPic::writeGotPlt(uint8_t *Buf, const Symbol &S) const
> {
> - write32le(Buf, S.getPltVA() + 16);
> +void RetpolineNoPic::writeGotPlt(uint8_t *buf, const Symbol &s) const
> {
> + write32le(buf, s.getPltVA() + 16);
> }
>
> -void RetpolineNoPic::writePltHeader(uint8_t *Buf) const {
> - const uint8_t Insn[] = {
> +void RetpolineNoPic::writePltHeader(uint8_t *buf) const {
> + const uint8_t insn[] = {
> 0xff, 0x35, 0, 0, 0, 0, // 0: pushl GOTPLT+4
> 0x50, // 6: pushl %eax
> 0xa1, 0, 0, 0, 0, // 7: mov GOTPLT+8, %eax
> @@ -509,17 +509,17 @@ void RetpolineNoPic::writePltHeader(uint
> 0xc3, // 2e: ret
> 0xcc, // 2f: int3; padding
> };
> - memcpy(Buf, Insn, sizeof(Insn));
> + memcpy(buf, insn, sizeof(insn));
>
> - uint32_t GotPlt = In.GotPlt->getVA();
> - write32le(Buf + 2, GotPlt + 4);
> - write32le(Buf + 8, GotPlt + 8);
> + uint32_t gotPlt = in.gotPlt->getVA();
> + write32le(buf + 2, gotPlt + 4);
> + write32le(buf + 8, gotPlt + 8);
> }
>
> -void RetpolineNoPic::writePlt(uint8_t *Buf, uint64_t GotPltEntryAddr,
> - uint64_t PltEntryAddr, int32_t Index,
> - unsigned RelOff) const {
> - const uint8_t Insn[] = {
> +void RetpolineNoPic::writePlt(uint8_t *buf, uint64_t gotPltEntryAddr,
> + uint64_t pltEntryAddr, int32_t index,
> + unsigned relOff) const {
> + const uint8_t insn[] = {
> 0x50, // 0: pushl %eax
> 0xa1, 0, 0, 0, 0, // 1: mov foo_in_GOT, %eax
> 0xe8, 0, 0, 0, 0, // 6: call plt+0x20
> @@ -529,26 +529,26 @@ void RetpolineNoPic::writePlt(uint8_t *B
> 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, // 1a: int3; padding
> 0xcc, // 1f: int3; padding
> };
> - memcpy(Buf, Insn, sizeof(Insn));
> + memcpy(buf, insn, sizeof(insn));
>
> - unsigned Off = PltHeaderSize + PltEntrySize * Index;
> - write32le(Buf + 2, GotPltEntryAddr);
> - write32le(Buf + 7, -Off - 11 + 32);
> - write32le(Buf + 12, -Off - 16 + 17);
> - write32le(Buf + 17, RelOff);
> - write32le(Buf + 22, -Off - 26);
> + unsigned off = pltHeaderSize + pltEntrySize * index;
> + write32le(buf + 2, gotPltEntryAddr);
> + write32le(buf + 7, -off - 11 + 32);
> + write32le(buf + 12, -off - 16 + 17);
> + write32le(buf + 17, relOff);
> + write32le(buf + 22, -off - 26);
> }
>
> TargetInfo *elf::getX86TargetInfo() {
> - if (Config->ZRetpolineplt) {
> - if (Config->Pic) {
> - static RetpolinePic T;
> - return &T;
> + if (config->zRetpolineplt) {
> + if (config->isPic) {
> + static RetpolinePic t;
> + return &t;
> }
> - static RetpolineNoPic T;
> - return &T;
> + static RetpolineNoPic t;
> + return &t;
> }
>
> - static X86 T;
> - return &T;
> + static X86 t;
> + return &t;
> }
>
> Modified: lld/trunk/ELF/Arch/X86_64.cpp
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_Arch_X86-5F64.cpp-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=TGAOZ7veH0Ul105s3GGTO0vrS286zSLemA1NY1QmSc4&e=
>
> ==============================================================================
> --- lld/trunk/ELF/Arch/X86_64.cpp (original)
> +++ lld/trunk/ELF/Arch/X86_64.cpp Tue Jul 9 22:00:37 2019
> @@ -25,58 +25,58 @@ namespace {
> class X86_64 : public TargetInfo {
> public:
> X86_64();
> - int getTlsGdRelaxSkip(RelType Type) const override;
> - RelExpr getRelExpr(RelType Type, const Symbol &S,
> - const uint8_t *Loc) const override;
> - RelType getDynRel(RelType Type) const override;
> - void writeGotPltHeader(uint8_t *Buf) const override;
> - void writeGotPlt(uint8_t *Buf, const Symbol &S) const override;
> - void writePltHeader(uint8_t *Buf) const override;
> - void writePlt(uint8_t *Buf, uint64_t GotPltEntryAddr, uint64_t
> PltEntryAddr,
> - int32_t Index, unsigned RelOff) const override;
> - void relocateOne(uint8_t *Loc, RelType Type, uint64_t Val) const
> override;
> -
> - RelExpr adjustRelaxExpr(RelType Type, const uint8_t *Data,
> - RelExpr Expr) const override;
> - void relaxGot(uint8_t *Loc, RelType Type, uint64_t Val) const
> override;
> - void relaxTlsGdToIe(uint8_t *Loc, RelType Type, uint64_t Val) const
> override;
> - void relaxTlsGdToLe(uint8_t *Loc, RelType Type, uint64_t Val) const
> override;
> - void relaxTlsIeToLe(uint8_t *Loc, RelType Type, uint64_t Val) const
> override;
> - void relaxTlsLdToLe(uint8_t *Loc, RelType Type, uint64_t Val) const
> override;
> - bool adjustPrologueForCrossSplitStack(uint8_t *Loc, uint8_t *End,
> - uint8_t StOther) const
> override;
> + int getTlsGdRelaxSkip(RelType type) const override;
> + RelExpr getRelExpr(RelType type, const Symbol &s,
> + const uint8_t *loc) const override;
> + RelType getDynRel(RelType type) const override;
> + void writeGotPltHeader(uint8_t *buf) const override;
> + void writeGotPlt(uint8_t *buf, const Symbol &s) const override;
> + void writePltHeader(uint8_t *buf) const override;
> + void writePlt(uint8_t *buf, uint64_t gotPltEntryAddr, uint64_t
> pltEntryAddr,
> + int32_t index, unsigned relOff) const override;
> + void relocateOne(uint8_t *loc, RelType type, uint64_t val) const
> override;
> +
> + RelExpr adjustRelaxExpr(RelType type, const uint8_t *data,
> + RelExpr expr) const override;
> + void relaxGot(uint8_t *loc, RelType type, uint64_t val) const
> override;
> + void relaxTlsGdToIe(uint8_t *loc, RelType type, uint64_t val) const
> override;
> + void relaxTlsGdToLe(uint8_t *loc, RelType type, uint64_t val) const
> override;
> + void relaxTlsIeToLe(uint8_t *loc, RelType type, uint64_t val) const
> override;
> + void relaxTlsLdToLe(uint8_t *loc, RelType type, uint64_t val) const
> override;
> + bool adjustPrologueForCrossSplitStack(uint8_t *loc, uint8_t *end,
> + uint8_t stOther) const
> override;
> };
> } // namespace
>
> X86_64::X86_64() {
> - CopyRel = R_X86_64_COPY;
> - GotRel = R_X86_64_GLOB_DAT;
> - NoneRel = R_X86_64_NONE;
> - PltRel = R_X86_64_JUMP_SLOT;
> - RelativeRel = R_X86_64_RELATIVE;
> - IRelativeRel = R_X86_64_IRELATIVE;
> - SymbolicRel = R_X86_64_64;
> - TlsDescRel = R_X86_64_TLSDESC;
> - TlsGotRel = R_X86_64_TPOFF64;
> - TlsModuleIndexRel = R_X86_64_DTPMOD64;
> - TlsOffsetRel = R_X86_64_DTPOFF64;
> - PltEntrySize = 16;
> - PltHeaderSize = 16;
> - TrapInstr = {0xcc, 0xcc, 0xcc, 0xcc}; // 0xcc = INT3
> + copyRel = R_X86_64_COPY;
> + gotRel = R_X86_64_GLOB_DAT;
> + noneRel = R_X86_64_NONE;
> + pltRel = R_X86_64_JUMP_SLOT;
> + relativeRel = R_X86_64_RELATIVE;
> + iRelativeRel = R_X86_64_IRELATIVE;
> + symbolicRel = R_X86_64_64;
> + tlsDescRel = R_X86_64_TLSDESC;
> + tlsGotRel = R_X86_64_TPOFF64;
> + tlsModuleIndexRel = R_X86_64_DTPMOD64;
> + tlsOffsetRel = R_X86_64_DTPOFF64;
> + pltEntrySize = 16;
> + pltHeaderSize = 16;
> + trapInstr = {0xcc, 0xcc, 0xcc, 0xcc}; // 0xcc = INT3
>
> // Align to the large page size (known as a superpage or huge page).
> // FreeBSD automatically promotes large, superpage-aligned
> allocations.
> - DefaultImageBase = 0x200000;
> + defaultImageBase = 0x200000;
> }
>
> -int X86_64::getTlsGdRelaxSkip(RelType Type) const { return 2; }
> +int X86_64::getTlsGdRelaxSkip(RelType type) const { return 2; }
>
> -RelExpr X86_64::getRelExpr(RelType Type, const Symbol &S,
> - const uint8_t *Loc) const {
> - if (Type == R_X86_64_GOTTPOFF)
> - Config->HasStaticTlsModel = true;
> +RelExpr X86_64::getRelExpr(RelType type, const Symbol &s,
> + const uint8_t *loc) const {
> + if (type == R_X86_64_GOTTPOFF)
> + config->hasStaticTlsModel = true;
>
> - switch (Type) {
> + switch (type) {
> case R_X86_64_8:
> case R_X86_64_16:
> case R_X86_64_32:
> @@ -122,62 +122,62 @@ RelExpr X86_64::getRelExpr(RelType Type,
> case R_X86_64_NONE:
> return R_NONE;
> default:
> - error(getErrorLocation(Loc) + "unknown relocation (" +
> Twine(Type) +
> - ") against symbol " + toString(S));
> + error(getErrorLocation(loc) + "unknown relocation (" +
> Twine(type) +
> + ") against symbol " + toString(s));
> return R_NONE;
> }
> }
>
> -void X86_64::writeGotPltHeader(uint8_t *Buf) const {
> +void X86_64::writeGotPltHeader(uint8_t *buf) const {
> // The first entry holds the value of _DYNAMIC. It is not clear why
> that is
> // required, but it is documented in the psabi and the glibc
> dynamic linker
> // seems to use it (note that this is relevant for linking ld.so,
> not any
> // other program).
> - write64le(Buf, Main->Dynamic->getVA());
> + write64le(buf, mainPart->dynamic->getVA());
> }
>
> -void X86_64::writeGotPlt(uint8_t *Buf, const Symbol &S) const {
> +void X86_64::writeGotPlt(uint8_t *buf, const Symbol &s) const {
> // See comments in X86::writeGotPlt.
> - write64le(Buf, S.getPltVA() + 6);
> + write64le(buf, s.getPltVA() + 6);
> }
>
> -void X86_64::writePltHeader(uint8_t *Buf) const {
> - const uint8_t PltData[] = {
> +void X86_64::writePltHeader(uint8_t *buf) const {
> + const uint8_t pltData[] = {
> 0xff, 0x35, 0, 0, 0, 0, // pushq GOTPLT+8(%rip)
> 0xff, 0x25, 0, 0, 0, 0, // jmp *GOTPLT+16(%rip)
> 0x0f, 0x1f, 0x40, 0x00, // nop
> };
> - memcpy(Buf, PltData, sizeof(PltData));
> - uint64_t GotPlt = In.GotPlt->getVA();
> - uint64_t Plt = In.Plt->getVA();
> - write32le(Buf + 2, GotPlt - Plt + 2); // GOTPLT+8
> - write32le(Buf + 8, GotPlt - Plt + 4); // GOTPLT+16
> + memcpy(buf, pltData, sizeof(pltData));
> + uint64_t gotPlt = in.gotPlt->getVA();
> + uint64_t plt = in.plt->getVA();
> + write32le(buf + 2, gotPlt - plt + 2); // GOTPLT+8
> + write32le(buf + 8, gotPlt - plt + 4); // GOTPLT+16
> }
>
> -void X86_64::writePlt(uint8_t *Buf, uint64_t GotPltEntryAddr,
> - uint64_t PltEntryAddr, int32_t Index,
> - unsigned RelOff) const {
> - const uint8_t Inst[] = {
> +void X86_64::writePlt(uint8_t *buf, uint64_t gotPltEntryAddr,
> + uint64_t pltEntryAddr, int32_t index,
> + unsigned relOff) const {
> + const uint8_t inst[] = {
> 0xff, 0x25, 0, 0, 0, 0, // jmpq *got(%rip)
> 0x68, 0, 0, 0, 0, // pushq <relocation index>
> 0xe9, 0, 0, 0, 0, // jmpq plt[0]
> };
> - memcpy(Buf, Inst, sizeof(Inst));
> + memcpy(buf, inst, sizeof(inst));
>
> - write32le(Buf + 2, GotPltEntryAddr - PltEntryAddr - 6);
> - write32le(Buf + 7, Index);
> - write32le(Buf + 12, -PltHeaderSize - PltEntrySize * Index - 16);
> + write32le(buf + 2, gotPltEntryAddr - pltEntryAddr - 6);
> + write32le(buf + 7, index);
> + write32le(buf + 12, -pltHeaderSize - pltEntrySize * index - 16);
> }
>
> -RelType X86_64::getDynRel(RelType Type) const {
> - if (Type == R_X86_64_64 || Type == R_X86_64_PC64 || Type ==
> R_X86_64_SIZE32 ||
> - Type == R_X86_64_SIZE64)
> - return Type;
> +RelType X86_64::getDynRel(RelType type) const {
> + if (type == R_X86_64_64 || type == R_X86_64_PC64 || type ==
> R_X86_64_SIZE32 ||
> + type == R_X86_64_SIZE64)
> + return type;
> return R_X86_64_NONE;
> }
>
> -void X86_64::relaxTlsGdToLe(uint8_t *Loc, RelType Type, uint64_t Val)
> const {
> - if (Type == R_X86_64_TLSGD) {
> +void X86_64::relaxTlsGdToLe(uint8_t *loc, RelType type, uint64_t val)
> const {
> + if (type == R_X86_64_TLSGD) {
> // Convert
> // .byte 0x66
> // leaq x at tlsgd(%rip), %rdi
> @@ -185,39 +185,39 @@ void X86_64::relaxTlsGdToLe(uint8_t *Loc
> // rex64
> // call __tls_get_addr at plt
> // to the following two instructions.
> - const uint8_t Inst[] = {
> + const uint8_t inst[] = {
> 0x64, 0x48, 0x8b, 0x04, 0x25, 0x00, 0x00,
> 0x00, 0x00, // mov %fs:0x0,%rax
> 0x48, 0x8d, 0x80, 0, 0, 0, 0, // lea x at tpoff,%rax
> };
> - memcpy(Loc - 4, Inst, sizeof(Inst));
> + memcpy(loc - 4, inst, sizeof(inst));
>
> // The original code used a pc relative relocation and so we have
> to
> // compensate for the -4 in had in the addend.
> - write32le(Loc + 8, Val + 4);
> + write32le(loc + 8, val + 4);
> } else {
> // Convert
> // lea x at tlsgd(%rip), %rax
> // call *(%rax)
> // to the following two instructions.
> - assert(Type == R_X86_64_GOTPC32_TLSDESC);
> - if (memcmp(Loc - 3, "\x48\x8d\x05", 3)) {
> - error(getErrorLocation(Loc - 3) + "R_X86_64_GOTPC32_TLSDESC
> must be used "
> + assert(type == R_X86_64_GOTPC32_TLSDESC);
> + if (memcmp(loc - 3, "\x48\x8d\x05", 3)) {
> + error(getErrorLocation(loc - 3) + "R_X86_64_GOTPC32_TLSDESC
> must be used "
> "in callq *x at tlsdesc(%rip),
> %rax");
> return;
> }
> // movq $x at tpoff(%rip),%rax
> - Loc[-2] = 0xc7;
> - Loc[-1] = 0xc0;
> - write32le(Loc, Val + 4);
> + loc[-2] = 0xc7;
> + loc[-1] = 0xc0;
> + write32le(loc, val + 4);
> // xchg ax,ax
> - Loc[4] = 0x66;
> - Loc[5] = 0x90;
> + loc[4] = 0x66;
> + loc[5] = 0x90;
> }
> }
>
> -void X86_64::relaxTlsGdToIe(uint8_t *Loc, RelType Type, uint64_t Val)
> const {
> - if (Type == R_X86_64_TLSGD) {
> +void X86_64::relaxTlsGdToIe(uint8_t *loc, RelType type, uint64_t val)
> const {
> + if (type == R_X86_64_TLSGD) {
> // Convert
> // .byte 0x66
> // leaq x at tlsgd(%rip), %rdi
> @@ -225,96 +225,96 @@ void X86_64::relaxTlsGdToIe(uint8_t *Loc
> // rex64
> // call __tls_get_addr at plt
> // to the following two instructions.
> - const uint8_t Inst[] = {
> + const uint8_t inst[] = {
> 0x64, 0x48, 0x8b, 0x04, 0x25, 0x00, 0x00,
> 0x00, 0x00, // mov %fs:0x0,%rax
> 0x48, 0x03, 0x05, 0, 0, 0, 0, // addq x at gottpoff
> (%rip),%rax
> };
> - memcpy(Loc - 4, Inst, sizeof(Inst));
> + memcpy(loc - 4, inst, sizeof(inst));
>
> // Both code sequences are PC relatives, but since we are moving
> the
> // constant forward by 8 bytes we have to subtract the value by 8.
> - write32le(Loc + 8, Val - 8);
> + write32le(loc + 8, val - 8);
> } else {
> // Convert
> // lea x at tlsgd(%rip), %rax
> // call *(%rax)
> // to the following two instructions.
> - assert(Type == R_X86_64_GOTPC32_TLSDESC);
> - if (memcmp(Loc - 3, "\x48\x8d\x05", 3)) {
> - error(getErrorLocation(Loc - 3) + "R_X86_64_GOTPC32_TLSDESC
> must be used "
> + assert(type == R_X86_64_GOTPC32_TLSDESC);
> + if (memcmp(loc - 3, "\x48\x8d\x05", 3)) {
> + error(getErrorLocation(loc - 3) + "R_X86_64_GOTPC32_TLSDESC
> must be used "
> "in callq *x at tlsdesc(%rip),
> %rax");
> return;
> }
> // movq x at gottpoff(%rip),%rax
> - Loc[-2] = 0x8b;
> - write32le(Loc, Val);
> + loc[-2] = 0x8b;
> + write32le(loc, val);
> // xchg ax,ax
> - Loc[4] = 0x66;
> - Loc[5] = 0x90;
> + loc[4] = 0x66;
> + loc[5] = 0x90;
> }
> }
>
> // In some conditions, R_X86_64_GOTTPOFF relocation can be optimized
> to
> // R_X86_64_TPOFF32 so that it does not use GOT.
> -void X86_64::relaxTlsIeToLe(uint8_t *Loc, RelType Type, uint64_t Val)
> const {
> - uint8_t *Inst = Loc - 3;
> - uint8_t Reg = Loc[-1] >> 3;
> - uint8_t *RegSlot = Loc - 1;
> +void X86_64::relaxTlsIeToLe(uint8_t *loc, RelType type, uint64_t val)
> const {
> + uint8_t *inst = loc - 3;
> + uint8_t reg = loc[-1] >> 3;
> + uint8_t *regSlot = loc - 1;
>
> // Note that ADD with RSP or R12 is converted to ADD instead of LEA
> // because LEA with these registers needs 4 bytes to encode and thus
> // wouldn't fit the space.
>
> - if (memcmp(Inst, "\x48\x03\x25", 3) == 0) {
> + if (memcmp(inst, "\x48\x03\x25", 3) == 0) {
> // "addq foo at gottpoff(%rip),%rsp" -> "addq $foo,%rsp"
> - memcpy(Inst, "\x48\x81\xc4", 3);
> - } else if (memcmp(Inst, "\x4c\x03\x25", 3) == 0) {
> + memcpy(inst, "\x48\x81\xc4", 3);
> + } else if (memcmp(inst, "\x4c\x03\x25", 3) == 0) {
> // "addq foo at gottpoff(%rip),%r12" -> "addq $foo,%r12"
> - memcpy(Inst, "\x49\x81\xc4", 3);
> - } else if (memcmp(Inst, "\x4c\x03", 2) == 0) {
> + memcpy(inst, "\x49\x81\xc4", 3);
> + } else if (memcmp(inst, "\x4c\x03", 2) == 0) {
> // "addq foo at gottpoff(%rip),%r[8-15]" -> "leaq
> foo(%r[8-15]),%r[8-15]"
> - memcpy(Inst, "\x4d\x8d", 2);
> - *RegSlot = 0x80 | (Reg << 3) | Reg;
> - } else if (memcmp(Inst, "\x48\x03", 2) == 0) {
> + memcpy(inst, "\x4d\x8d", 2);
> + *regSlot = 0x80 | (reg << 3) | reg;
> + } else if (memcmp(inst, "\x48\x03", 2) == 0) {
> // "addq foo at gottpoff(%rip),%reg -> "leaq foo(%reg),%reg"
> - memcpy(Inst, "\x48\x8d", 2);
> - *RegSlot = 0x80 | (Reg << 3) | Reg;
> - } else if (memcmp(Inst, "\x4c\x8b", 2) == 0) {
> + memcpy(inst, "\x48\x8d", 2);
> + *regSlot = 0x80 | (reg << 3) | reg;
> + } else if (memcmp(inst, "\x4c\x8b", 2) == 0) {
> // "movq foo at gottpoff(%rip),%r[8-15]" -> "movq $foo,%r[8-15]"
> - memcpy(Inst, "\x49\xc7", 2);
> - *RegSlot = 0xc0 | Reg;
> - } else if (memcmp(Inst, "\x48\x8b", 2) == 0) {
> + memcpy(inst, "\x49\xc7", 2);
> + *regSlot = 0xc0 | reg;
> + } else if (memcmp(inst, "\x48\x8b", 2) == 0) {
> // "movq foo at gottpoff(%rip),%reg" -> "movq $foo,%reg"
> - memcpy(Inst, "\x48\xc7", 2);
> - *RegSlot = 0xc0 | Reg;
> + memcpy(inst, "\x48\xc7", 2);
> + *regSlot = 0xc0 | reg;
> } else {
> - error(getErrorLocation(Loc - 3) +
> + error(getErrorLocation(loc - 3) +
> "R_X86_64_GOTTPOFF must be used in MOVQ or ADDQ
> instructions only");
> }
>
> // The original code used a PC relative relocation.
> // Need to compensate for the -4 it had in the addend.
> - write32le(Loc, Val + 4);
> + write32le(loc, val + 4);
> }
>
> -void X86_64::relaxTlsLdToLe(uint8_t *Loc, RelType Type, uint64_t Val)
> const {
> - if (Type == R_X86_64_DTPOFF64) {
> - write64le(Loc, Val);
> +void X86_64::relaxTlsLdToLe(uint8_t *loc, RelType type, uint64_t val)
> const {
> + if (type == R_X86_64_DTPOFF64) {
> + write64le(loc, val);
> return;
> }
> - if (Type == R_X86_64_DTPOFF32) {
> - write32le(Loc, Val);
> + if (type == R_X86_64_DTPOFF32) {
> + write32le(loc, val);
> return;
> }
>
> - const uint8_t Inst[] = {
> + const uint8_t inst[] = {
> 0x66, 0x66, // .word
> 0x6666
> 0x66, // .byte
> 0x66
> 0x64, 0x48, 0x8b, 0x04, 0x25, 0x00, 0x00, 0x00, 0x00, // mov
> %fs:0,%rax
> };
>
> - if (Loc[4] == 0xe8) {
> + if (loc[4] == 0xe8) {
> // Convert
> // leaq bar at tlsld(%rip), %rdi # 48 8d 3d <Loc>
> // callq __tls_get_addr at PLT # e8 <disp32>
> @@ -324,11 +324,11 @@ void X86_64::relaxTlsLdToLe(uint8_t *Loc
> // .byte 0x66
> // mov %fs:0,%rax
> // leaq bar at tpoff(%rax), %rcx
> - memcpy(Loc - 3, Inst, sizeof(Inst));
> + memcpy(loc - 3, inst, sizeof(inst));
> return;
> }
>
> - if (Loc[4] == 0xff && Loc[5] == 0x15) {
> + if (loc[4] == 0xff && loc[5] == 0x15) {
> // Convert
> // leaq x at tlsld(%rip),%rdi # 48 8d 3d <Loc>
> // call *__tls_get_addr at GOTPCREL(%rip) # ff 15 <disp32>
> @@ -337,36 +337,36 @@ void X86_64::relaxTlsLdToLe(uint8_t *Loc
> // movq %fs:0,%rax
> // See "Table 11.9: LD -> LE Code Transition (LP64)" in
> //
> https://urldefense.proofpoint.com/v2/url?u=https-3A__raw.githubusercontent.com_wiki_hjl-2Dtools_x86-2DpsABI_x86-2D64-2DpsABI-2D1.0.pdf&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=dCSIEZTA2rQv4Ih9njsVKtftDKD74swhRtAi89d7yRo&e=
> - Loc[-3] = 0x66;
> - memcpy(Loc - 2, Inst, sizeof(Inst));
> + loc[-3] = 0x66;
> + memcpy(loc - 2, inst, sizeof(inst));
> return;
> }
>
> - error(getErrorLocation(Loc - 3) +
> + error(getErrorLocation(loc - 3) +
> "expected R_X86_64_PLT32 or R_X86_64_GOTPCRELX after
> R_X86_64_TLSLD");
> }
>
> -void X86_64::relocateOne(uint8_t *Loc, RelType Type, uint64_t Val)
> const {
> - switch (Type) {
> +void X86_64::relocateOne(uint8_t *loc, RelType type, uint64_t val)
> const {
> + switch (type) {
> case R_X86_64_8:
> - checkIntUInt(Loc, Val, 8, Type);
> - *Loc = Val;
> + checkIntUInt(loc, val, 8, type);
> + *loc = val;
> break;
> case R_X86_64_PC8:
> - checkInt(Loc, Val, 8, Type);
> - *Loc = Val;
> + checkInt(loc, val, 8, type);
> + *loc = val;
> break;
> case R_X86_64_16:
> - checkIntUInt(Loc, Val, 16, Type);
> - write16le(Loc, Val);
> + checkIntUInt(loc, val, 16, type);
> + write16le(loc, val);
> break;
> case R_X86_64_PC16:
> - checkInt(Loc, Val, 16, Type);
> - write16le(Loc, Val);
> + checkInt(loc, val, 16, type);
> + write16le(loc, val);
> break;
> case R_X86_64_32:
> - checkUInt(Loc, Val, 32, Type);
> - write32le(Loc, Val);
> + checkUInt(loc, val, 32, type);
> + write32le(loc, val);
> break;
> case R_X86_64_32S:
> case R_X86_64_TPOFF32:
> @@ -383,8 +383,8 @@ void X86_64::relocateOne(uint8_t *Loc, R
> case R_X86_64_TLSLD:
> case R_X86_64_DTPOFF32:
> case R_X86_64_SIZE32:
> - checkInt(Loc, Val, 32, Type);
> - write32le(Loc, Val);
> + checkInt(loc, val, 32, type);
> + write32le(loc, val);
> break;
> case R_X86_64_64:
> case R_X86_64_DTPOFF64:
> @@ -393,37 +393,37 @@ void X86_64::relocateOne(uint8_t *Loc, R
> case R_X86_64_GOT64:
> case R_X86_64_GOTOFF64:
> case R_X86_64_GOTPC64:
> - write64le(Loc, Val);
> + write64le(loc, val);
> break;
> default:
> llvm_unreachable("unknown relocation");
> }
> }
>
> -RelExpr X86_64::adjustRelaxExpr(RelType Type, const uint8_t *Data,
> - RelExpr RelExpr) const {
> - if (Type != R_X86_64_GOTPCRELX && Type != R_X86_64_REX_GOTPCRELX)
> - return RelExpr;
> - const uint8_t Op = Data[-2];
> - const uint8_t ModRm = Data[-1];
> +RelExpr X86_64::adjustRelaxExpr(RelType type, const uint8_t *data,
> + RelExpr relExpr) const {
> + if (type != R_X86_64_GOTPCRELX && type != R_X86_64_REX_GOTPCRELX)
> + return relExpr;
> + const uint8_t op = data[-2];
> + const uint8_t modRm = data[-1];
>
> // FIXME: When PIC is disabled and foo is defined locally in the
> // lower 32 bit address space, memory operand in mov can be
> converted into
> // immediate operand. Otherwise, mov must be changed to lea. We
> support only
> // latter relaxation at this moment.
> - if (Op == 0x8b)
> + if (op == 0x8b)
> return R_RELAX_GOT_PC;
>
> // Relax call and jmp.
> - if (Op == 0xff && (ModRm == 0x15 || ModRm == 0x25))
> + if (op == 0xff && (modRm == 0x15 || modRm == 0x25))
> return R_RELAX_GOT_PC;
>
> // Relaxation of test, adc, add, and, cmp, or, sbb, sub, xor.
> // If PIC then no relaxation is available.
> // We also don't relax test/binop instructions without REX byte,
> // they are 32bit operations and not common to have.
> - assert(Type == R_X86_64_REX_GOTPCRELX);
> - return Config->Pic ? RelExpr : R_RELAX_GOT_PC_NOPIC;
> + assert(type == R_X86_64_REX_GOTPCRELX);
> + return config->isPic ? relExpr : R_RELAX_GOT_PC_NOPIC;
> }
>
> // A subset of relaxations can only be applied for no-PIC. This method
> @@ -431,11 +431,11 @@ RelExpr X86_64::adjustRelaxExpr(RelType
> // "Intel 64 and IA-32 Architectures Software Developer's Manual V2"
> // (
> https://urldefense.proofpoint.com/v2/url?u=http-3A__www.intel.com_content_dam_www_public_us_en_documents_manuals_&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=sIEBEeFXuFPtqrzXsYt1Xiee8tYhUuv6AY5UmD7WjX0&e=
> //
> 64-ia-32-architectures-software-developer-instruction-set-reference-manual-325383.pdf)
> -static void relaxGotNoPic(uint8_t *Loc, uint64_t Val, uint8_t Op,
> - uint8_t ModRm) {
> - const uint8_t Rex = Loc[-3];
> +static void relaxGotNoPic(uint8_t *loc, uint64_t val, uint8_t op,
> + uint8_t modRm) {
> + const uint8_t rex = loc[-3];
> // Convert "test %reg, foo at GOTPCREL(%rip)" to "test $foo, %reg".
> - if (Op == 0x85) {
> + if (op == 0x85) {
> // See "TEST-Logical Compare" (4-428 Vol. 2B),
> // TEST r/m64, r64 uses "full" ModR / M byte (no opcode
> extension).
>
> @@ -452,11 +452,11 @@ static void relaxGotNoPic(uint8_t *Loc,
> // 0x38 == 00 111 000 binary.
> // We transfer reg2 to reg1 here as operand.
> // See "2.1.3 ModR/M and SIB Bytes" (Vol. 2A 2-3).
> - Loc[-1] = 0xc0 | (ModRm & 0x38) >> 3; // ModR/M byte.
> + loc[-1] = 0xc0 | (modRm & 0x38) >> 3; // ModR/M byte.
>
> // Change opcode from TEST r/m64, r64 to TEST r/m64, imm32
> // See "TEST-Logical Compare" (4-428 Vol. 2B).
> - Loc[-2] = 0xf7;
> + loc[-2] = 0xf7;
>
> // Move R bit to the B bit in REX byte.
> // REX byte is encoded as 0100WRXB, where
> @@ -469,8 +469,8 @@ static void relaxGotNoPic(uint8_t *Loc,
> // REX.B This 1-bit value is an extension to the MODRM.rm field
> or the
> // SIB.base field.
> // See "2.2.1.2 More on REX Prefix Fields " (2-8 Vol. 2A).
> - Loc[-3] = (Rex & ~0x4) | (Rex & 0x4) >> 2;
> - write32le(Loc, Val);
> + loc[-3] = (rex & ~0x4) | (rex & 0x4) >> 2;
> + write32le(loc, val);
> return;
> }
>
> @@ -480,7 +480,7 @@ static void relaxGotNoPic(uint8_t *Loc,
> // Convert "binop foo at GOTPCREL(%rip), %reg" to "binop $foo, %reg".
> // Logic is close to one for test instruction above, but we also
> // write opcode extension here, see below for details.
> - Loc[-1] = 0xc0 | (ModRm & 0x38) >> 3 | (Op & 0x3c); // ModR/M byte.
> + loc[-1] = 0xc0 | (modRm & 0x38) >> 3 | (op & 0x3c); // ModR/M byte.
>
> // Primary opcode is 0x81, opcode extension is one of:
> // 000b = ADD, 001b is OR, 010b is ADC, 011b is SBB,
> @@ -489,67 +489,67 @@ static void relaxGotNoPic(uint8_t *Loc,
> // See "3.2 INSTRUCTIONS (A-M)" (Vol. 2A 3-15),
> // "INSTRUCTION SET REFERENCE, N-Z" (Vol. 2B 4-1) for
> // descriptions about each operation.
> - Loc[-2] = 0x81;
> - Loc[-3] = (Rex & ~0x4) | (Rex & 0x4) >> 2;
> - write32le(Loc, Val);
> + loc[-2] = 0x81;
> + loc[-3] = (rex & ~0x4) | (rex & 0x4) >> 2;
> + write32le(loc, val);
> }
>
> -void X86_64::relaxGot(uint8_t *Loc, RelType Type, uint64_t Val) const
> {
> - const uint8_t Op = Loc[-2];
> - const uint8_t ModRm = Loc[-1];
> +void X86_64::relaxGot(uint8_t *loc, RelType type, uint64_t val) const
> {
> + const uint8_t op = loc[-2];
> + const uint8_t modRm = loc[-1];
>
> // Convert "mov foo at GOTPCREL(%rip),%reg" to "lea foo(%rip),%reg".
> - if (Op == 0x8b) {
> - Loc[-2] = 0x8d;
> - write32le(Loc, Val);
> + if (op == 0x8b) {
> + loc[-2] = 0x8d;
> + write32le(loc, val);
> return;
> }
>
> - if (Op != 0xff) {
> + if (op != 0xff) {
> // We are relaxing a rip relative to an absolute, so compensate
> // for the old -4 addend.
> - assert(!Config->Pic);
> - relaxGotNoPic(Loc, Val + 4, Op, ModRm);
> + assert(!config->isPic);
> + relaxGotNoPic(loc, val + 4, op, modRm);
> return;
> }
>
> // Convert call/jmp instructions.
> - if (ModRm == 0x15) {
> + if (modRm == 0x15) {
> // ABI says we can convert "call *foo at GOTPCREL(%rip)" to "nop;
> call foo".
> // Instead we convert to "addr32 call foo" where addr32 is an
> instruction
> // prefix. That makes result expression to be a single
> instruction.
> - Loc[-2] = 0x67; // addr32 prefix
> - Loc[-1] = 0xe8; // call
> - write32le(Loc, Val);
> + loc[-2] = 0x67; // addr32 prefix
> + loc[-1] = 0xe8; // call
> + write32le(loc, val);
> return;
> }
>
> // Convert "jmp *foo at GOTPCREL(%rip)" to "jmp foo; nop".
> // jmp doesn't return, so it is fine to use nop here, it is just a
> stub.
> - assert(ModRm == 0x25);
> - Loc[-2] = 0xe9; // jmp
> - Loc[3] = 0x90; // nop
> - write32le(Loc - 1, Val + 1);
> + assert(modRm == 0x25);
> + loc[-2] = 0xe9; // jmp
> + loc[3] = 0x90; // nop
> + write32le(loc - 1, val + 1);
> }
>
> // A split-stack prologue starts by checking the amount of stack
> remaining
> // in one of two ways:
> // A) Comparing of the stack pointer to a field in the tcb.
> // B) Or a load of a stack pointer offset with an lea to r10 or r11.
> -bool X86_64::adjustPrologueForCrossSplitStack(uint8_t *Loc, uint8_t
> *End,
> - uint8_t StOther) const {
> - if (!Config->Is64) {
> +bool X86_64::adjustPrologueForCrossSplitStack(uint8_t *loc, uint8_t
> *end,
> + uint8_t stOther) const {
> + if (!config->is64) {
> error("Target doesn't support split stacks.");
> return false;
> }
>
> - if (Loc + 8 >= End)
> + if (loc + 8 >= end)
> return false;
>
> // Replace "cmp %fs:0x70,%rsp" and subsequent branch
> // with "stc, nopl 0x0(%rax,%rax,1)"
> - if (memcmp(Loc, "\x64\x48\x3b\x24\x25", 5) == 0) {
> - memcpy(Loc, "\xf9\x0f\x1f\x84\x00\x00\x00\x00", 8);
> + if (memcmp(loc, "\x64\x48\x3b\x24\x25", 5) == 0) {
> + memcpy(loc, "\xf9\x0f\x1f\x84\x00\x00\x00\x00", 8);
> return true;
> }
>
> @@ -557,11 +557,11 @@ bool X86_64::adjustPrologueForCrossSplit
> // be r10 or r11. The lea instruction feeds a subsequent compare
> which checks
> // if there is X available stack space. Making X larger effectively
> reserves
> // that much additional space. The stack grows downward so subtract
> the value.
> - if (memcmp(Loc, "\x4c\x8d\x94\x24", 4) == 0 ||
> - memcmp(Loc, "\x4c\x8d\x9c\x24", 4) == 0) {
> + if (memcmp(loc, "\x4c\x8d\x94\x24", 4) == 0 ||
> + memcmp(loc, "\x4c\x8d\x9c\x24", 4) == 0) {
> // The offset bytes are encoded four bytes after the start of the
> // instruction.
> - write32le(Loc + 4, read32le(Loc + 4) - 0x4000);
> + write32le(loc + 4, read32le(loc + 4) - 0x4000);
> return true;
> }
> return false;
> @@ -580,33 +580,33 @@ namespace {
> class Retpoline : public X86_64 {
> public:
> Retpoline();
> - void writeGotPlt(uint8_t *Buf, const Symbol &S) const override;
> - void writePltHeader(uint8_t *Buf) const override;
> - void writePlt(uint8_t *Buf, uint64_t GotPltEntryAddr, uint64_t
> PltEntryAddr,
> - int32_t Index, unsigned RelOff) const override;
> + void writeGotPlt(uint8_t *buf, const Symbol &s) const override;
> + void writePltHeader(uint8_t *buf) const override;
> + void writePlt(uint8_t *buf, uint64_t gotPltEntryAddr, uint64_t
> pltEntryAddr,
> + int32_t index, unsigned relOff) const override;
> };
>
> class RetpolineZNow : public X86_64 {
> public:
> RetpolineZNow();
> - void writeGotPlt(uint8_t *Buf, const Symbol &S) const override {}
> - void writePltHeader(uint8_t *Buf) const override;
> - void writePlt(uint8_t *Buf, uint64_t GotPltEntryAddr, uint64_t
> PltEntryAddr,
> - int32_t Index, unsigned RelOff) const override;
> + void writeGotPlt(uint8_t *buf, const Symbol &s) const override {}
> + void writePltHeader(uint8_t *buf) const override;
> + void writePlt(uint8_t *buf, uint64_t gotPltEntryAddr, uint64_t
> pltEntryAddr,
> + int32_t index, unsigned relOff) const override;
> };
> } // namespace
>
> Retpoline::Retpoline() {
> - PltHeaderSize = 48;
> - PltEntrySize = 32;
> + pltHeaderSize = 48;
> + pltEntrySize = 32;
> }
>
> -void Retpoline::writeGotPlt(uint8_t *Buf, const Symbol &S) const {
> - write64le(Buf, S.getPltVA() + 17);
> +void Retpoline::writeGotPlt(uint8_t *buf, const Symbol &s) const {
> + write64le(buf, s.getPltVA() + 17);
> }
>
> -void Retpoline::writePltHeader(uint8_t *Buf) const {
> - const uint8_t Insn[] = {
> +void Retpoline::writePltHeader(uint8_t *buf) const {
> + const uint8_t insn[] = {
> 0xff, 0x35, 0, 0, 0, 0, // 0: pushq
> GOTPLT+8(%rip)
> 0x4c, 0x8b, 0x1d, 0, 0, 0, 0, // 6: mov
> GOTPLT+16(%rip), %r11
> 0xe8, 0x0e, 0x00, 0x00, 0x00, // d: callq next
> @@ -619,18 +619,18 @@ void Retpoline::writePltHeader(uint8_t *
> 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, // 25: int3; padding
> 0xcc, 0xcc, 0xcc, 0xcc, // 2c: int3; padding
> };
> - memcpy(Buf, Insn, sizeof(Insn));
> + memcpy(buf, insn, sizeof(insn));
>
> - uint64_t GotPlt = In.GotPlt->getVA();
> - uint64_t Plt = In.Plt->getVA();
> - write32le(Buf + 2, GotPlt - Plt - 6 + 8);
> - write32le(Buf + 9, GotPlt - Plt - 13 + 16);
> + uint64_t gotPlt = in.gotPlt->getVA();
> + uint64_t plt = in.plt->getVA();
> + write32le(buf + 2, gotPlt - plt - 6 + 8);
> + write32le(buf + 9, gotPlt - plt - 13 + 16);
> }
>
> -void Retpoline::writePlt(uint8_t *Buf, uint64_t GotPltEntryAddr,
> - uint64_t PltEntryAddr, int32_t Index,
> - unsigned RelOff) const {
> - const uint8_t Insn[] = {
> +void Retpoline::writePlt(uint8_t *buf, uint64_t gotPltEntryAddr,
> + uint64_t pltEntryAddr, int32_t index,
> + unsigned relOff) const {
> + const uint8_t insn[] = {
> 0x4c, 0x8b, 0x1d, 0, 0, 0, 0, // 0: mov foo at GOTPLT(%rip), %r11
> 0xe8, 0, 0, 0, 0, // 7: callq plt+0x20
> 0xe9, 0, 0, 0, 0, // c: jmp plt+0x12
> @@ -638,24 +638,24 @@ void Retpoline::writePlt(uint8_t *Buf, u
> 0xe9, 0, 0, 0, 0, // 16: jmp plt+0
> 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, // 1b: int3; padding
> };
> - memcpy(Buf, Insn, sizeof(Insn));
> + memcpy(buf, insn, sizeof(insn));
>
> - uint64_t Off = PltHeaderSize + PltEntrySize * Index;
> + uint64_t off = pltHeaderSize + pltEntrySize * index;
>
> - write32le(Buf + 3, GotPltEntryAddr - PltEntryAddr - 7);
> - write32le(Buf + 8, -Off - 12 + 32);
> - write32le(Buf + 13, -Off - 17 + 18);
> - write32le(Buf + 18, Index);
> - write32le(Buf + 23, -Off - 27);
> + write32le(buf + 3, gotPltEntryAddr - pltEntryAddr - 7);
> + write32le(buf + 8, -off - 12 + 32);
> + write32le(buf + 13, -off - 17 + 18);
> + write32le(buf + 18, index);
> + write32le(buf + 23, -off - 27);
> }
>
> RetpolineZNow::RetpolineZNow() {
> - PltHeaderSize = 32;
> - PltEntrySize = 16;
> + pltHeaderSize = 32;
> + pltEntrySize = 16;
> }
>
> -void RetpolineZNow::writePltHeader(uint8_t *Buf) const {
> - const uint8_t Insn[] = {
> +void RetpolineZNow::writePltHeader(uint8_t *buf) const {
> + const uint8_t insn[] = {
> 0xe8, 0x0b, 0x00, 0x00, 0x00, // 0: call next
> 0xf3, 0x90, // 5: loop: pause
> 0x0f, 0xae, 0xe8, // 7: lfence
> @@ -667,35 +667,35 @@ void RetpolineZNow::writePltHeader(uint8
> 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, // 1a: int3; padding
> 0xcc, // 1f: int3; padding
> };
> - memcpy(Buf, Insn, sizeof(Insn));
> + memcpy(buf, insn, sizeof(insn));
> }
>
> -void RetpolineZNow::writePlt(uint8_t *Buf, uint64_t GotPltEntryAddr,
> - uint64_t PltEntryAddr, int32_t Index,
> - unsigned RelOff) const {
> - const uint8_t Insn[] = {
> +void RetpolineZNow::writePlt(uint8_t *buf, uint64_t gotPltEntryAddr,
> + uint64_t pltEntryAddr, int32_t index,
> + unsigned relOff) const {
> + const uint8_t insn[] = {
> 0x4c, 0x8b, 0x1d, 0, 0, 0, 0, // mov foo at GOTPLT(%rip), %r11
> 0xe9, 0, 0, 0, 0, // jmp plt+0
> 0xcc, 0xcc, 0xcc, 0xcc, // int3; padding
> };
> - memcpy(Buf, Insn, sizeof(Insn));
> + memcpy(buf, insn, sizeof(insn));
>
> - write32le(Buf + 3, GotPltEntryAddr - PltEntryAddr - 7);
> - write32le(Buf + 8, -PltHeaderSize - PltEntrySize * Index - 12);
> + write32le(buf + 3, gotPltEntryAddr - pltEntryAddr - 7);
> + write32le(buf + 8, -pltHeaderSize - pltEntrySize * index - 12);
> }
>
> static TargetInfo *getTargetInfo() {
> - if (Config->ZRetpolineplt) {
> - if (Config->ZNow) {
> - static RetpolineZNow T;
> - return &T;
> + if (config->zRetpolineplt) {
> + if (config->zNow) {
> + static RetpolineZNow t;
> + return &t;
> }
> - static Retpoline T;
> - return &T;
> + static Retpoline t;
> + return &t;
> }
>
> - static X86_64 T;
> - return &T;
> + static X86_64 t;
> + return &t;
> }
>
> TargetInfo *elf::getX86_64TargetInfo() { return getTargetInfo(); }
>
> Modified: lld/trunk/ELF/CallGraphSort.cpp
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_CallGraphSort.cpp-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=DB-x29S8eVeIYCA2mlQi3CPqh7MHn1MHuT7UcQ8E6Wg&e=
>
> ==============================================================================
> --- lld/trunk/ELF/CallGraphSort.cpp (original)
> +++ lld/trunk/ELF/CallGraphSort.cpp Tue Jul 9 22:00:37 2019
> @@ -51,24 +51,24 @@ using namespace lld::elf;
>
> namespace {
> struct Edge {
> - int From;
> - uint64_t Weight;
> + int from;
> + uint64_t weight;
> };
>
> struct Cluster {
> - Cluster(int Sec, size_t S) : Sections{Sec}, Size(S) {}
> + Cluster(int sec, size_t s) : sections{sec}, size(s) {}
>
> double getDensity() const {
> - if (Size == 0)
> + if (size == 0)
> return 0;
> - return double(Weight) / double(Size);
> + return double(weight) / double(size);
> }
>
> - std::vector<int> Sections;
> - size_t Size = 0;
> - uint64_t Weight = 0;
> - uint64_t InitialWeight = 0;
> - Edge BestPred = {-1, 0};
> + std::vector<int> sections;
> + size_t size = 0;
> + uint64_t weight = 0;
> + uint64_t initialWeight = 0;
> + Edge bestPred = {-1, 0};
> };
>
> class CallGraphSort {
> @@ -78,8 +78,8 @@ public:
> DenseMap<const InputSectionBase *, int> run();
>
> private:
> - std::vector<Cluster> Clusters;
> - std::vector<const InputSectionBase *> Sections;
> + std::vector<Cluster> clusters;
> + std::vector<const InputSectionBase *> sections;
>
> void groupClusters();
> };
> @@ -99,23 +99,23 @@ using SectionPair =
> // Symbols, and generate a graph between InputSections with the
> provided
> // weights.
> CallGraphSort::CallGraphSort() {
> - MapVector<SectionPair, uint64_t> &Profile =
> Config->CallGraphProfile;
> - DenseMap<const InputSectionBase *, int> SecToCluster;
> + MapVector<SectionPair, uint64_t> &profile =
> config->callGraphProfile;
> + DenseMap<const InputSectionBase *, int> secToCluster;
>
> - auto GetOrCreateNode = [&](const InputSectionBase *IS) -> int {
> - auto Res = SecToCluster.insert(std::make_pair(IS,
> Clusters.size()));
> - if (Res.second) {
> - Sections.push_back(IS);
> - Clusters.emplace_back(Clusters.size(), IS->getSize());
> + auto getOrCreateNode = [&](const InputSectionBase *isec) -> int {
> + auto res = secToCluster.insert(std::make_pair(isec,
> clusters.size()));
> + if (res.second) {
> + sections.push_back(isec);
> + clusters.emplace_back(clusters.size(), isec->getSize());
> }
> - return Res.first->second;
> + return res.first->second;
> };
>
> // Create the graph.
> - for (std::pair<SectionPair, uint64_t> &C : Profile) {
> - const auto *FromSB = cast<InputSectionBase>(C.first.first->Repl);
> - const auto *ToSB = cast<InputSectionBase>(C.first.second->Repl);
> - uint64_t Weight = C.second;
> + for (std::pair<SectionPair, uint64_t> &c : profile) {
> + const auto *fromSB = cast<InputSectionBase>(c.first.first->repl);
> + const auto *toSB = cast<InputSectionBase>(c.first.second->repl);
> + uint64_t weight = c.second;
>
> // Ignore edges between input sections belonging to different
> output
> // sections. This is done because otherwise we would end up with
> clusters
> @@ -123,94 +123,94 @@ CallGraphSort::CallGraphSort() {
> // output. This messes with the cluster size and density
> calculations. We
> // would also end up moving input sections in other output
> sections without
> // moving them closer to what calls them.
> - if (FromSB->getOutputSection() != ToSB->getOutputSection())
> + if (fromSB->getOutputSection() != toSB->getOutputSection())
> continue;
>
> - int From = GetOrCreateNode(FromSB);
> - int To = GetOrCreateNode(ToSB);
> + int from = getOrCreateNode(fromSB);
> + int to = getOrCreateNode(toSB);
>
> - Clusters[To].Weight += Weight;
> + clusters[to].weight += weight;
>
> - if (From == To)
> + if (from == to)
> continue;
>
> // Remember the best edge.
> - Cluster &ToC = Clusters[To];
> - if (ToC.BestPred.From == -1 || ToC.BestPred.Weight < Weight) {
> - ToC.BestPred.From = From;
> - ToC.BestPred.Weight = Weight;
> + Cluster &toC = clusters[to];
> + if (toC.bestPred.from == -1 || toC.bestPred.weight < weight) {
> + toC.bestPred.from = from;
> + toC.bestPred.weight = weight;
> }
> }
> - for (Cluster &C : Clusters)
> - C.InitialWeight = C.Weight;
> + for (Cluster &c : clusters)
> + c.initialWeight = c.weight;
> }
>
> // It's bad to merge clusters which would degrade the density too
> much.
> -static bool isNewDensityBad(Cluster &A, Cluster &B) {
> - double NewDensity = double(A.Weight + B.Weight) / double(A.Size +
> B.Size);
> - return NewDensity < A.getDensity() / MAX_DENSITY_DEGRADATION;
> +static bool isNewDensityBad(Cluster &a, Cluster &b) {
> + double newDensity = double(a.weight + b.weight) / double(a.size +
> b.size);
> + return newDensity < a.getDensity() / MAX_DENSITY_DEGRADATION;
> }
>
> -static void mergeClusters(Cluster &Into, Cluster &From) {
> - Into.Sections.insert(Into.Sections.end(), From.Sections.begin(),
> - From.Sections.end());
> - Into.Size += From.Size;
> - Into.Weight += From.Weight;
> - From.Sections.clear();
> - From.Size = 0;
> - From.Weight = 0;
> +static void mergeClusters(Cluster &into, Cluster &from) {
> + into.sections.insert(into.sections.end(), from.sections.begin(),
> + from.sections.end());
> + into.size += from.size;
> + into.weight += from.weight;
> + from.sections.clear();
> + from.size = 0;
> + from.weight = 0;
> }
>
> // Group InputSections into clusters using the Call-Chain Clustering
> heuristic
> // then sort the clusters by density.
> void CallGraphSort::groupClusters() {
> - std::vector<int> SortedSecs(Clusters.size());
> - std::vector<Cluster *> SecToCluster(Clusters.size());
> + std::vector<int> sortedSecs(clusters.size());
> + std::vector<Cluster *> secToCluster(clusters.size());
>
> - for (size_t I = 0; I < Clusters.size(); ++I) {
> - SortedSecs[I] = I;
> - SecToCluster[I] = &Clusters[I];
> + for (size_t i = 0; i < clusters.size(); ++i) {
> + sortedSecs[i] = i;
> + secToCluster[i] = &clusters[i];
> }
>
> - llvm::stable_sort(SortedSecs, [&](int A, int B) {
> - return Clusters[A].getDensity() > Clusters[B].getDensity();
> + llvm::stable_sort(sortedSecs, [&](int a, int b) {
> + return clusters[a].getDensity() > clusters[b].getDensity();
> });
>
> - for (int SI : SortedSecs) {
> + for (int si : sortedSecs) {
> // Clusters[SI] is the same as SecToClusters[SI] here because it
> has not
> // been merged into another cluster yet.
> - Cluster &C = Clusters[SI];
> + Cluster &c = clusters[si];
>
> // Don't consider merging if the edge is unlikely.
> - if (C.BestPred.From == -1 || C.BestPred.Weight * 10 <=
> C.InitialWeight)
> + if (c.bestPred.from == -1 || c.bestPred.weight * 10 <=
> c.initialWeight)
> continue;
>
> - Cluster *PredC = SecToCluster[C.BestPred.From];
> - if (PredC == &C)
> + Cluster *predC = secToCluster[c.bestPred.from];
> + if (predC == &c)
> continue;
>
> - if (C.Size + PredC->Size > MAX_CLUSTER_SIZE)
> + if (c.size + predC->size > MAX_CLUSTER_SIZE)
> continue;
>
> - if (isNewDensityBad(*PredC, C))
> + if (isNewDensityBad(*predC, c))
> continue;
>
> // NOTE: Consider using a disjoint-set to track section ->
> cluster mapping
> // if this is ever slow.
> - for (int SI : C.Sections)
> - SecToCluster[SI] = PredC;
> + for (int si : c.sections)
> + secToCluster[si] = predC;
>
> - mergeClusters(*PredC, C);
> + mergeClusters(*predC, c);
> }
>
> // Remove empty or dead nodes. Invalidates all cluster indices.
> - llvm::erase_if(Clusters, [](const Cluster &C) {
> - return C.Size == 0 || C.Sections.empty();
> + llvm::erase_if(clusters, [](const Cluster &c) {
> + return c.size == 0 || c.sections.empty();
> });
>
> // Sort by density.
> - llvm::stable_sort(Clusters, [](const Cluster &A, const Cluster &B) {
> - return A.getDensity() > B.getDensity();
> + llvm::stable_sort(clusters, [](const Cluster &a, const Cluster &b) {
> + return a.getDensity() > b.getDensity();
> });
> }
>
> @@ -218,35 +218,35 @@ DenseMap<const InputSectionBase *, int>
> groupClusters();
>
> // Generate order.
> - DenseMap<const InputSectionBase *, int> OrderMap;
> - ssize_t CurOrder = 1;
> + DenseMap<const InputSectionBase *, int> orderMap;
> + ssize_t curOrder = 1;
>
> - for (const Cluster &C : Clusters)
> - for (int SecIndex : C.Sections)
> - OrderMap[Sections[SecIndex]] = CurOrder++;
> -
> - if (!Config->PrintSymbolOrder.empty()) {
> - std::error_code EC;
> - raw_fd_ostream OS(Config->PrintSymbolOrder, EC, sys::fs::F_None);
> - if (EC) {
> - error("cannot open " + Config->PrintSymbolOrder + ": " +
> EC.message());
> - return OrderMap;
> + for (const Cluster &c : clusters)
> + for (int secIndex : c.sections)
> + orderMap[sections[secIndex]] = curOrder++;
> +
> + if (!config->printSymbolOrder.empty()) {
> + std::error_code ec;
> + raw_fd_ostream os(config->printSymbolOrder, ec, sys::fs::F_None);
> + if (ec) {
> + error("cannot open " + config->printSymbolOrder + ": " +
> ec.message());
> + return orderMap;
> }
>
> // Print the symbols ordered by C3, in the order of increasing
> CurOrder
> // Instead of sorting all the OrderMap, just repeat the loops
> above.
> - for (const Cluster &C : Clusters)
> - for (int SecIndex : C.Sections)
> + for (const Cluster &c : clusters)
> + for (int secIndex : c.sections)
> // Search all the symbols in the file of the section
> // and find out a Defined symbol with name that is within the
> section.
> - for (Symbol *Sym: Sections[SecIndex]->File->getSymbols())
> - if (!Sym->isSection()) // Filter out section-type symbols
> here.
> - if (auto *D = dyn_cast<Defined>(Sym))
> - if (Sections[SecIndex] == D->Section)
> - OS << Sym->getName() << "\n";
> + for (Symbol *sym: sections[secIndex]->file->getSymbols())
> + if (!sym->isSection()) // Filter out section-type symbols
> here.
> + if (auto *d = dyn_cast<Defined>(sym))
> + if (sections[secIndex] == d->section)
> + os << sym->getName() << "\n";
> }
>
> - return OrderMap;
> + return orderMap;
> }
>
> // Sort sections by the profile data provided by
> -callgraph-profile-file
>
> Modified: lld/trunk/ELF/Config.h
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_Config.h-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=QpGb94Dq6oEgxb6qrfgCHW1bQkDf00XI7rs-EQ0ToHg&e=
>
> ==============================================================================
> --- lld/trunk/ELF/Config.h (original)
> +++ lld/trunk/ELF/Config.h Tue Jul 9 22:00:37 2019
> @@ -62,17 +62,17 @@ enum class Target2Policy { Abs, Rel, Got
> enum class ARMVFPArgKind { Default, Base, VFP, ToolChain };
>
> struct SymbolVersion {
> - llvm::StringRef Name;
> - bool IsExternCpp;
> - bool HasWildcard;
> + llvm::StringRef name;
> + bool isExternCpp;
> + bool hasWildcard;
> };
>
> // This struct contains symbols version definition that
> // can be found in version script if it is used for link.
> struct VersionDefinition {
> - llvm::StringRef Name;
> - uint16_t Id = 0;
> - std::vector<SymbolVersion> Globals;
> + llvm::StringRef name;
> + uint16_t id = 0;
> + std::vector<SymbolVersion> globals;
> };
>
> // This struct contains the global configuration for the linker.
> @@ -80,177 +80,177 @@ struct VersionDefinition {
> // and such fields have the same name as the corresponding options.
> // Most fields are initialized by the driver.
> struct Configuration {
> - uint8_t OSABI = 0;
> - uint32_t AndFeatures = 0;
> - llvm::CachePruningPolicy ThinLTOCachePolicy;
> - llvm::StringMap<uint64_t> SectionStartMap;
> - llvm::StringRef Chroot;
> - llvm::StringRef DynamicLinker;
> - llvm::StringRef DwoDir;
> - llvm::StringRef Entry;
> - llvm::StringRef Emulation;
> - llvm::StringRef Fini;
> - llvm::StringRef Init;
> - llvm::StringRef LTOAAPipeline;
> - llvm::StringRef LTOCSProfileFile;
> - llvm::StringRef LTONewPmPasses;
> - llvm::StringRef LTOObjPath;
> - llvm::StringRef LTOSampleProfile;
> - llvm::StringRef MapFile;
> - llvm::StringRef OutputFile;
> - llvm::StringRef OptRemarksFilename;
> - llvm::StringRef OptRemarksPasses;
> - llvm::StringRef OptRemarksFormat;
> - llvm::StringRef ProgName;
> - llvm::StringRef PrintSymbolOrder;
> - llvm::StringRef SoName;
> - llvm::StringRef Sysroot;
> - llvm::StringRef ThinLTOCacheDir;
> - llvm::StringRef ThinLTOIndexOnlyArg;
> - std::pair<llvm::StringRef, llvm::StringRef>
> ThinLTOObjectSuffixReplace;
> - std::pair<llvm::StringRef, llvm::StringRef> ThinLTOPrefixReplace;
> - std::string Rpath;
> - std::vector<VersionDefinition> VersionDefinitions;
> - std::vector<llvm::StringRef> AuxiliaryList;
> - std::vector<llvm::StringRef> FilterList;
> - std::vector<llvm::StringRef> SearchPaths;
> - std::vector<llvm::StringRef> SymbolOrderingFile;
> - std::vector<llvm::StringRef> Undefined;
> - std::vector<SymbolVersion> DynamicList;
> - std::vector<SymbolVersion> VersionScriptGlobals;
> - std::vector<SymbolVersion> VersionScriptLocals;
> - std::vector<uint8_t> BuildIdVector;
> + uint8_t osabi = 0;
> + uint32_t andFeatures = 0;
> + llvm::CachePruningPolicy thinLTOCachePolicy;
> + llvm::StringMap<uint64_t> sectionStartMap;
> + llvm::StringRef chroot;
> + llvm::StringRef dynamicLinker;
> + llvm::StringRef dwoDir;
> + llvm::StringRef entry;
> + llvm::StringRef emulation;
> + llvm::StringRef fini;
> + llvm::StringRef init;
> + llvm::StringRef ltoAAPipeline;
> + llvm::StringRef ltoCSProfileFile;
> + llvm::StringRef ltoNewPmPasses;
> + llvm::StringRef ltoObjPath;
> + llvm::StringRef ltoSampleProfile;
> + llvm::StringRef mapFile;
> + llvm::StringRef outputFile;
> + llvm::StringRef optRemarksFilename;
> + llvm::StringRef optRemarksPasses;
> + llvm::StringRef optRemarksFormat;
> + llvm::StringRef progName;
> + llvm::StringRef printSymbolOrder;
> + llvm::StringRef soName;
> + llvm::StringRef sysroot;
> + llvm::StringRef thinLTOCacheDir;
> + llvm::StringRef thinLTOIndexOnlyArg;
> + std::pair<llvm::StringRef, llvm::StringRef>
> thinLTOObjectSuffixReplace;
> + std::pair<llvm::StringRef, llvm::StringRef> thinLTOPrefixReplace;
> + std::string rpath;
> + std::vector<VersionDefinition> versionDefinitions;
> + std::vector<llvm::StringRef> auxiliaryList;
> + std::vector<llvm::StringRef> filterList;
> + std::vector<llvm::StringRef> searchPaths;
> + std::vector<llvm::StringRef> symbolOrderingFile;
> + std::vector<llvm::StringRef> undefined;
> + std::vector<SymbolVersion> dynamicList;
> + std::vector<SymbolVersion> versionScriptGlobals;
> + std::vector<SymbolVersion> versionScriptLocals;
> + std::vector<uint8_t> buildIdVector;
> llvm::MapVector<std::pair<const InputSectionBase *, const
> InputSectionBase *>,
> uint64_t>
> - CallGraphProfile;
> - bool AllowMultipleDefinition;
> - bool AllowShlibUndefined;
> - bool AndroidPackDynRelocs;
> - bool ARMHasBlx = false;
> - bool ARMHasMovtMovw = false;
> - bool ARMJ1J2BranchEncoding = false;
> - bool AsNeeded = false;
> - bool Bsymbolic;
> - bool BsymbolicFunctions;
> - bool CallGraphProfileSort;
> - bool CheckSections;
> - bool CompressDebugSections;
> - bool Cref;
> - bool DefineCommon;
> - bool Demangle = true;
> - bool DependentLibraries;
> - bool DisableVerify;
> - bool EhFrameHdr;
> - bool EmitLLVM;
> - bool EmitRelocs;
> - bool EnableNewDtags;
> - bool ExecuteOnly;
> - bool ExportDynamic;
> - bool FixCortexA53Errata843419;
> - bool ForceBTI;
> - bool FormatBinary = false;
> - bool RequireCET;
> - bool GcSections;
> - bool GdbIndex;
> - bool GnuHash = false;
> - bool GnuUnique;
> - bool HasDynamicList = false;
> - bool HasDynSymTab;
> - bool IgnoreDataAddressEquality;
> - bool IgnoreFunctionAddressEquality;
> - bool LTOCSProfileGenerate;
> - bool LTODebugPassManager;
> - bool LTONewPassManager;
> - bool MergeArmExidx;
> - bool MipsN32Abi = false;
> - bool Nmagic;
> - bool NoinhibitExec;
> - bool Nostdlib;
> - bool OFormatBinary;
> - bool Omagic;
> - bool OptRemarksWithHotness;
> - bool PacPlt;
> - bool PicThunk;
> - bool Pie;
> - bool PrintGcSections;
> - bool PrintIcfSections;
> - bool Relocatable;
> - bool RelrPackDynRelocs;
> - bool SaveTemps;
> - bool SingleRoRx;
> - bool Shared;
> - bool Static = false;
> - bool SysvHash = false;
> - bool Target1Rel;
> - bool Trace;
> - bool ThinLTOEmitImportsFiles;
> - bool ThinLTOIndexOnly;
> - bool TocOptimize;
> - bool UndefinedVersion;
> - bool UseAndroidRelrTags = false;
> - bool WarnBackrefs;
> - bool WarnCommon;
> - bool WarnIfuncTextrel;
> - bool WarnMissingEntry;
> - bool WarnSymbolOrdering;
> - bool WriteAddends;
> - bool ZCombreloc;
> - bool ZCopyreloc;
> - bool ZExecstack;
> - bool ZGlobal;
> - bool ZHazardplt;
> - bool ZIfuncNoplt;
> - bool ZInitfirst;
> - bool ZInterpose;
> - bool ZKeepTextSectionPrefix;
> - bool ZNodefaultlib;
> - bool ZNodelete;
> - bool ZNodlopen;
> - bool ZNow;
> - bool ZOrigin;
> - bool ZRelro;
> - bool ZRodynamic;
> - bool ZText;
> - bool ZRetpolineplt;
> - bool ZWxneeded;
> - DiscardPolicy Discard;
> - ICFLevel ICF;
> - OrphanHandlingPolicy OrphanHandling;
> - SortSectionPolicy SortSection;
> - StripPolicy Strip;
> - UnresolvedPolicy UnresolvedSymbols;
> - Target2Policy Target2;
> - ARMVFPArgKind ARMVFPArgs = ARMVFPArgKind::Default;
> - BuildIdKind BuildId = BuildIdKind::None;
> - ELFKind EKind = ELFNoneKind;
> - uint16_t DefaultSymbolVersion = llvm::ELF::VER_NDX_GLOBAL;
> - uint16_t EMachine = llvm::ELF::EM_NONE;
> - llvm::Optional<uint64_t> ImageBase;
> - uint64_t CommonPageSize;
> - uint64_t MaxPageSize;
> - uint64_t MipsGotSize;
> - uint64_t ZStackSize;
> - unsigned LTOPartitions;
> - unsigned LTOO;
> - unsigned Optimize;
> - unsigned ThinLTOJobs;
> - int32_t SplitStackAdjustSize;
> + callGraphProfile;
> + bool allowMultipleDefinition;
> + bool allowShlibUndefined;
> + bool androidPackDynRelocs;
> + bool armHasBlx = false;
> + bool armHasMovtMovw = false;
> + bool armJ1J2BranchEncoding = false;
> + bool asNeeded = false;
> + bool bsymbolic;
> + bool bsymbolicFunctions;
> + bool callGraphProfileSort;
> + bool checkSections;
> + bool compressDebugSections;
> + bool cref;
> + bool defineCommon;
> + bool demangle = true;
> + bool dependentLibraries;
> + bool disableVerify;
> + bool ehFrameHdr;
> + bool emitLLVM;
> + bool emitRelocs;
> + bool enableNewDtags;
> + bool executeOnly;
> + bool exportDynamic;
> + bool fixCortexA53Errata843419;
> + bool forceBTI;
> + bool formatBinary = false;
> + bool requireCET;
> + bool gcSections;
> + bool gdbIndex;
> + bool gnuHash = false;
> + bool gnuUnique;
> + bool hasDynamicList = false;
> + bool hasDynSymTab;
> + bool ignoreDataAddressEquality;
> + bool ignoreFunctionAddressEquality;
> + bool ltoCSProfileGenerate;
> + bool ltoDebugPassManager;
> + bool ltoNewPassManager;
> + bool mergeArmExidx;
> + bool mipsN32Abi = false;
> + bool nmagic;
> + bool noinhibitExec;
> + bool nostdlib;
> + bool oFormatBinary;
> + bool omagic;
> + bool optRemarksWithHotness;
> + bool pacPlt;
> + bool picThunk;
> + bool pie;
> + bool printGcSections;
> + bool printIcfSections;
> + bool relocatable;
> + bool relrPackDynRelocs;
> + bool saveTemps;
> + bool singleRoRx;
> + bool shared;
> + bool isStatic = false;
> + bool sysvHash = false;
> + bool target1Rel;
> + bool trace;
> + bool thinLTOEmitImportsFiles;
> + bool thinLTOIndexOnly;
> + bool tocOptimize;
> + bool undefinedVersion;
> + bool useAndroidRelrTags = false;
> + bool warnBackrefs;
> + bool warnCommon;
> + bool warnIfuncTextrel;
> + bool warnMissingEntry;
> + bool warnSymbolOrdering;
> + bool writeAddends;
> + bool zCombreloc;
> + bool zCopyreloc;
> + bool zExecstack;
> + bool zGlobal;
> + bool zHazardplt;
> + bool zIfuncNoplt;
> + bool zInitfirst;
> + bool zInterpose;
> + bool zKeepTextSectionPrefix;
> + bool zNodefaultlib;
> + bool zNodelete;
> + bool zNodlopen;
> + bool zNow;
> + bool zOrigin;
> + bool zRelro;
> + bool zRodynamic;
> + bool zText;
> + bool zRetpolineplt;
> + bool zWxneeded;
> + DiscardPolicy discard;
> + ICFLevel icf;
> + OrphanHandlingPolicy orphanHandling;
> + SortSectionPolicy sortSection;
> + StripPolicy strip;
> + UnresolvedPolicy unresolvedSymbols;
> + Target2Policy target2;
> + ARMVFPArgKind armVFPArgs = ARMVFPArgKind::Default;
> + BuildIdKind buildId = BuildIdKind::None;
> + ELFKind ekind = ELFNoneKind;
> + uint16_t defaultSymbolVersion = llvm::ELF::VER_NDX_GLOBAL;
> + uint16_t emachine = llvm::ELF::EM_NONE;
> + llvm::Optional<uint64_t> imageBase;
> + uint64_t commonPageSize;
> + uint64_t maxPageSize;
> + uint64_t mipsGotSize;
> + uint64_t zStackSize;
> + unsigned ltoPartitions;
> + unsigned ltoo;
> + unsigned optimize;
> + unsigned thinLTOJobs;
> + int32_t splitStackAdjustSize;
>
> // The following config options do not directly correspond to any
> // particualr command line options.
>
> // True if we need to pass through relocations in input files to the
> // output file. Usually false because we consume relocations.
> - bool CopyRelocs;
> + bool copyRelocs;
>
> // True if the target is ELF64. False if ELF32.
> - bool Is64;
> + bool is64;
>
> // True if the target is little-endian. False if big-endian.
> - bool IsLE;
> + bool isLE;
>
> // endianness::little if IsLE is true. endianness::big otherwise.
> - llvm::support::endianness Endianness;
> + llvm::support::endianness endianness;
>
> // True if the target is the little-endian MIPS64.
> //
> @@ -264,7 +264,7 @@ struct Configuration {
> // name whatever that means. A fun hypothesis is that "EL" is short
> for
> // little-endian written in the little-endian order, but I don't
> know
> // if that's true.)
> - bool IsMips64EL;
> + bool isMips64EL;
>
> // True if we need to set the DF_STATIC_TLS flag to an output file,
> // which works as a hint to the dynamic loader that the file
> contains
> @@ -278,10 +278,10 @@ struct Configuration {
> // Since the flag is updated by multi-threaded code, we use
> std::atomic.
> // (Writing to a variable is not considered thread-safe even if the
> // variable is boolean and we always set the same value from all
> threads.)
> - std::atomic<bool> HasStaticTlsModel{false};
> + std::atomic<bool> hasStaticTlsModel{false};
>
> // Holds set of ELF header flags for the target.
> - uint32_t EFlags = 0;
> + uint32_t eflags = 0;
>
> // The ELF spec defines two types of relocation table entries, RELA
> and
> // REL. RELA is a triplet of (offset, info, addend) while REL is a
> @@ -297,23 +297,23 @@ struct Configuration {
> // Each ABI defines its relocation type. IsRela is true if target
> // uses RELA. As far as we know, all 64-bit ABIs are using RELA. A
> // few 32-bit ABIs are using RELA too.
> - bool IsRela;
> + bool isRela;
>
> // True if we are creating position-independent code.
> - bool Pic;
> + bool isPic;
>
> // 4 for ELF32, 8 for ELF64.
> - int Wordsize;
> + int wordsize;
> };
>
> // The only instance of Configuration struct.
> -extern Configuration *Config;
> +extern Configuration *config;
>
> -static inline void errorOrWarn(const Twine &Msg) {
> - if (!Config->NoinhibitExec)
> - error(Msg);
> +static inline void errorOrWarn(const Twine &msg) {
> + if (!config->noinhibitExec)
> + error(msg);
> else
> - warn(Msg);
> + warn(msg);
> }
> } // namespace elf
> } // namespace lld
>
> Modified: lld/trunk/ELF/DWARF.cpp
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_DWARF.cpp-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=rlGaKu-kFqT9Ka-bD6Qp8oLTFZNtYhNfbqNduXE6aVg&e=
>
> ==============================================================================
> --- lld/trunk/ELF/DWARF.cpp (original)
> +++ lld/trunk/ELF/DWARF.cpp Tue Jul 9 22:00:37 2019
> @@ -25,32 +25,32 @@ using namespace llvm::object;
> using namespace lld;
> using namespace lld::elf;
>
> -template <class ELFT> LLDDwarfObj<ELFT>::LLDDwarfObj(ObjFile<ELFT>
> *Obj) {
> - for (InputSectionBase *Sec : Obj->getSections()) {
> - if (!Sec)
> +template <class ELFT> LLDDwarfObj<ELFT>::LLDDwarfObj(ObjFile<ELFT>
> *obj) {
> + for (InputSectionBase *sec : obj->getSections()) {
> + if (!sec)
> continue;
>
> - if (LLDDWARFSection *M =
> - StringSwitch<LLDDWARFSection *>(Sec->Name)
> - .Case(".debug_addr", &AddrSection)
> - .Case(".debug_gnu_pubnames", &GnuPubNamesSection)
> - .Case(".debug_gnu_pubtypes", &GnuPubTypesSection)
> - .Case(".debug_info", &InfoSection)
> - .Case(".debug_ranges", &RangeSection)
> - .Case(".debug_rnglists", &RngListsSection)
> - .Case(".debug_line", &LineSection)
> + if (LLDDWARFSection *m =
> + StringSwitch<LLDDWARFSection *>(sec->name)
> + .Case(".debug_addr", &addrSection)
> + .Case(".debug_gnu_pubnames", &gnuPubNamesSection)
> + .Case(".debug_gnu_pubtypes", &gnuPubTypesSection)
> + .Case(".debug_info", &infoSection)
> + .Case(".debug_ranges", &rangeSection)
> + .Case(".debug_rnglists", &rngListsSection)
> + .Case(".debug_line", &lineSection)
> .Default(nullptr)) {
> - M->Data = toStringRef(Sec->data());
> - M->Sec = Sec;
> + m->Data = toStringRef(sec->data());
> + m->sec = sec;
> continue;
> }
>
> - if (Sec->Name == ".debug_abbrev")
> - AbbrevSection = toStringRef(Sec->data());
> - else if (Sec->Name == ".debug_str")
> - StrSection = toStringRef(Sec->data());
> - else if (Sec->Name == ".debug_line_str")
> - LineStringSection = toStringRef(Sec->data());
> + if (sec->name == ".debug_abbrev")
> + abbrevSection = toStringRef(sec->data());
> + else if (sec->name == ".debug_str")
> + strSection = toStringRef(sec->data());
> + else if (sec->name == ".debug_line_str")
> + lineStringSection = toStringRef(sec->data());
> }
> }
>
> @@ -58,17 +58,17 @@ namespace {
> template <class RelTy> struct LLDRelocationResolver {
> // In the ELF ABIs, S sepresents the value of the symbol in the
> relocation
> // entry. For Rela, the addend is stored as part of the relocation
> entry.
> - static uint64_t resolve(object::RelocationRef Ref, uint64_t S,
> + static uint64_t resolve(object::RelocationRef ref, uint64_t s,
> uint64_t /* A */) {
> - return S + Ref.getRawDataRefImpl().p;
> + return s + ref.getRawDataRefImpl().p;
> }
> };
>
> template <class ELFT> struct LLDRelocationResolver<Elf_Rel_Impl<ELFT,
> false>> {
> // For Rel, the addend A is supplied by the caller.
> - static uint64_t resolve(object::RelocationRef /*Ref*/, uint64_t S,
> - uint64_t A) {
> - return S + A;
> + static uint64_t resolve(object::RelocationRef /*Ref*/, uint64_t s,
> + uint64_t a) {
> + return s + a;
> }
> };
> } // namespace
> @@ -79,47 +79,47 @@ template <class ELFT> struct LLDRelocati
> template <class ELFT>
> template <class RelTy>
> Optional<RelocAddrEntry>
> -LLDDwarfObj<ELFT>::findAux(const InputSectionBase &Sec, uint64_t Pos,
> - ArrayRef<RelTy> Rels) const {
> - auto It =
> - partition_point(Rels, [=](const RelTy &A) { return A.r_offset <
> Pos; });
> - if (It == Rels.end() || It->r_offset != Pos)
> +LLDDwarfObj<ELFT>::findAux(const InputSectionBase &sec, uint64_t pos,
> + ArrayRef<RelTy> rels) const {
> + auto it =
> + partition_point(rels, [=](const RelTy &a) { return a.r_offset <
> pos; });
> + if (it == rels.end() || it->r_offset != pos)
> return None;
> - const RelTy &Rel = *It;
> + const RelTy &rel = *it;
>
> - const ObjFile<ELFT> *File = Sec.getFile<ELFT>();
> - uint32_t SymIndex = Rel.getSymbol(Config->IsMips64EL);
> - const typename ELFT::Sym &Sym = File->template
> getELFSyms<ELFT>()[SymIndex];
> - uint32_t SecIndex = File->getSectionIndex(Sym);
> + const ObjFile<ELFT> *file = sec.getFile<ELFT>();
> + uint32_t symIndex = rel.getSymbol(config->isMips64EL);
> + const typename ELFT::Sym &sym = file->template
> getELFSyms<ELFT>()[symIndex];
> + uint32_t secIndex = file->getSectionIndex(sym);
>
> // An undefined symbol may be a symbol defined in a discarded
> section. We
> // shall still resolve it. This is important for --gdb-index: the
> end address
> // offset of an entry in .debug_ranges is relocated. If it is not
> resolved,
> // its zero value will terminate the decoding of .debug_ranges
> prematurely.
> - Symbol &S = File->getRelocTargetSym(Rel);
> - uint64_t Val = 0;
> - if (auto *DR = dyn_cast<Defined>(&S)) {
> - Val = DR->Value;
> + Symbol &s = file->getRelocTargetSym(rel);
> + uint64_t val = 0;
> + if (auto *dr = dyn_cast<Defined>(&s)) {
> + val = dr->value;
>
> // FIXME: We should be consistent about always adding the file
> // offset or not.
> - if (DR->Section->Flags & ELF::SHF_ALLOC)
> - Val += cast<InputSection>(DR->Section)->getOffsetInFile();
> + if (dr->section->flags & ELF::SHF_ALLOC)
> + val += cast<InputSection>(dr->section)->getOffsetInFile();
> }
>
> - DataRefImpl D;
> - D.p = getAddend<ELFT>(Rel);
> - return RelocAddrEntry{SecIndex, RelocationRef(D, nullptr),
> - LLDRelocationResolver<RelTy>::resolve, Val};
> + DataRefImpl d;
> + d.p = getAddend<ELFT>(rel);
> + return RelocAddrEntry{secIndex, RelocationRef(d, nullptr),
> + LLDRelocationResolver<RelTy>::resolve, val};
> }
>
> template <class ELFT>
> -Optional<RelocAddrEntry> LLDDwarfObj<ELFT>::find(const
> llvm::DWARFSection &S,
> - uint64_t Pos) const {
> - auto &Sec = static_cast<const LLDDWARFSection &>(S);
> - if (Sec.Sec->AreRelocsRela)
> - return findAux(*Sec.Sec, Pos, Sec.Sec->template relas<ELFT>());
> - return findAux(*Sec.Sec, Pos, Sec.Sec->template rels<ELFT>());
> +Optional<RelocAddrEntry> LLDDwarfObj<ELFT>::find(const
> llvm::DWARFSection &s,
> + uint64_t pos) const {
> + auto &sec = static_cast<const LLDDWARFSection &>(s);
> + if (sec.sec->areRelocsRela)
> + return findAux(*sec.sec, pos, sec.sec->template relas<ELFT>());
> + return findAux(*sec.sec, pos, sec.sec->template rels<ELFT>());
> }
>
> template class elf::LLDDwarfObj<ELF32LE>;
>
> Modified: lld/trunk/ELF/DWARF.h
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_DWARF.h-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=oLth6C4qGjs4FUrQumX_eKd43hYYrhPUAKfBbcddOE8&e=
>
> ==============================================================================
> --- lld/trunk/ELF/DWARF.h (original)
> +++ lld/trunk/ELF/DWARF.h Tue Jul 9 22:00:37 2019
> @@ -20,70 +20,70 @@ namespace elf {
> class InputSection;
>
> struct LLDDWARFSection final : public llvm::DWARFSection {
> - InputSectionBase *Sec = nullptr;
> + InputSectionBase *sec = nullptr;
> };
>
> template <class ELFT> class LLDDwarfObj final : public
> llvm::DWARFObject {
> public:
> - explicit LLDDwarfObj(ObjFile<ELFT> *Obj);
> + explicit LLDDwarfObj(ObjFile<ELFT> *obj);
>
> void forEachInfoSections(
> - llvm::function_ref<void(const llvm::DWARFSection &)> F) const
> override {
> - F(InfoSection);
> + llvm::function_ref<void(const llvm::DWARFSection &)> f) const
> override {
> + f(infoSection);
> }
>
> const llvm::DWARFSection &getRangeSection() const override {
> - return RangeSection;
> + return rangeSection;
> }
>
> const llvm::DWARFSection &getRnglistsSection() const override {
> - return RngListsSection;
> + return rngListsSection;
> }
>
> const llvm::DWARFSection &getLineSection() const override {
> - return LineSection;
> + return lineSection;
> }
>
> const llvm::DWARFSection &getAddrSection() const override {
> - return AddrSection;
> + return addrSection;
> }
>
> const llvm::DWARFSection &getGnuPubNamesSection() const override {
> - return GnuPubNamesSection;
> + return gnuPubNamesSection;
> }
>
> const llvm::DWARFSection &getGnuPubTypesSection() const override {
> - return GnuPubTypesSection;
> + return gnuPubTypesSection;
> }
>
> StringRef getFileName() const override { return ""; }
> - StringRef getAbbrevSection() const override { return AbbrevSection;
> }
> - StringRef getStringSection() const override { return StrSection; }
> - StringRef getLineStringSection() const override { return
> LineStringSection; }
> + StringRef getAbbrevSection() const override { return abbrevSection;
> }
> + StringRef getStringSection() const override { return strSection; }
> + StringRef getLineStringSection() const override { return
> lineStringSection; }
>
> bool isLittleEndian() const override {
> return ELFT::TargetEndianness == llvm::support::little;
> }
>
> - llvm::Optional<llvm::RelocAddrEntry> find(const llvm::DWARFSection
> &Sec,
> - uint64_t Pos) const
> override;
> + llvm::Optional<llvm::RelocAddrEntry> find(const llvm::DWARFSection
> &sec,
> + uint64_t pos) const
> override;
>
> private:
> template <class RelTy>
> - llvm::Optional<llvm::RelocAddrEntry> findAux(const InputSectionBase
> &Sec,
> - uint64_t Pos,
> - ArrayRef<RelTy> Rels)
> const;
> -
> - LLDDWARFSection GnuPubNamesSection;
> - LLDDWARFSection GnuPubTypesSection;
> - LLDDWARFSection InfoSection;
> - LLDDWARFSection RangeSection;
> - LLDDWARFSection RngListsSection;
> - LLDDWARFSection LineSection;
> - LLDDWARFSection AddrSection;
> - StringRef AbbrevSection;
> - StringRef StrSection;
> - StringRef LineStringSection;
> + llvm::Optional<llvm::RelocAddrEntry> findAux(const InputSectionBase
> &sec,
> + uint64_t pos,
> + ArrayRef<RelTy> rels)
> const;
> +
> + LLDDWARFSection gnuPubNamesSection;
> + LLDDWARFSection gnuPubTypesSection;
> + LLDDWARFSection infoSection;
> + LLDDWARFSection rangeSection;
> + LLDDWARFSection rngListsSection;
> + LLDDWARFSection lineSection;
> + LLDDWARFSection addrSection;
> + StringRef abbrevSection;
> + StringRef strSection;
> + StringRef lineStringSection;
> };
>
> } // namespace elf
>
> Modified: lld/trunk/ELF/Driver.cpp
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_Driver.cpp-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=jW0pg-icPO3mlSQf6hex7bu71QIM2yEY0KCyEA9BsjY&e=
>
> ==============================================================================
> --- lld/trunk/ELF/Driver.cpp (original)
> +++ lld/trunk/ELF/Driver.cpp Tue Jul 9 22:00:37 2019
> @@ -68,49 +68,49 @@ using namespace llvm::support;
> using namespace lld;
> using namespace lld::elf;
>
> -Configuration *elf::Config;
> -LinkerDriver *elf::Driver;
> +Configuration *elf::config;
> +LinkerDriver *elf::driver;
>
> -static void setConfigs(opt::InputArgList &Args);
> -static void readConfigs(opt::InputArgList &Args);
> +static void setConfigs(opt::InputArgList &args);
> +static void readConfigs(opt::InputArgList &args);
>
> -bool elf::link(ArrayRef<const char *> Args, bool CanExitEarly,
> - raw_ostream &Error) {
> - errorHandler().LogName = args::getFilenameWithoutExe(Args[0]);
> +bool elf::link(ArrayRef<const char *> args, bool canExitEarly,
> + raw_ostream &error) {
> + errorHandler().LogName = args::getFilenameWithoutExe(args[0]);
> errorHandler().ErrorLimitExceededMsg =
> "too many errors emitted, stopping now (use "
> "-error-limit=0 to see all errors)";
> - errorHandler().ErrorOS = &Error;
> - errorHandler().ExitEarly = CanExitEarly;
> - errorHandler().ColorDiagnostics = Error.has_colors();
> + errorHandler().ErrorOS = &error;
> + errorHandler().ExitEarly = canExitEarly;
> + errorHandler().ColorDiagnostics = error.has_colors();
>
> - InputSections.clear();
> - OutputSections.clear();
> - BinaryFiles.clear();
> - BitcodeFiles.clear();
> - ObjectFiles.clear();
> - SharedFiles.clear();
> + inputSections.clear();
> + outputSections.clear();
> + binaryFiles.clear();
> + bitcodeFiles.clear();
> + objectFiles.clear();
> + sharedFiles.clear();
>
> - Config = make<Configuration>();
> - Driver = make<LinkerDriver>();
> - Script = make<LinkerScript>();
> - Symtab = make<SymbolTable>();
> + config = make<Configuration>();
> + driver = make<LinkerDriver>();
> + script = make<LinkerScript>();
> + symtab = make<SymbolTable>();
>
> - Tar = nullptr;
> - memset(&In, 0, sizeof(In));
> + tar = nullptr;
> + memset(&in, 0, sizeof(in));
>
> - Partitions = {Partition()};
> + partitions = {Partition()};
>
> - SharedFile::VernauxNum = 0;
> + SharedFile::vernauxNum = 0;
>
> - Config->ProgName = Args[0];
> + config->progName = args[0];
>
> - Driver->main(Args);
> + driver->main(args);
>
> // Exit immediately if we don't need to return to the caller.
> // This saves time because the overhead of calling destructors
> // for all globally-allocated objects is not negligible.
> - if (CanExitEarly)
> + if (canExitEarly)
> exitLld(errorCount() ? 1 : 0);
>
> freeArena();
> @@ -118,16 +118,16 @@ bool elf::link(ArrayRef<const char *> Ar
> }
>
> // Parses a linker -m option.
> -static std::tuple<ELFKind, uint16_t, uint8_t>
> parseEmulation(StringRef Emul) {
> - uint8_t OSABI = 0;
> - StringRef S = Emul;
> - if (S.endswith("_fbsd")) {
> - S = S.drop_back(5);
> - OSABI = ELFOSABI_FREEBSD;
> +static std::tuple<ELFKind, uint16_t, uint8_t>
> parseEmulation(StringRef emul) {
> + uint8_t osabi = 0;
> + StringRef s = emul;
> + if (s.endswith("_fbsd")) {
> + s = s.drop_back(5);
> + osabi = ELFOSABI_FREEBSD;
> }
>
> - std::pair<ELFKind, uint16_t> Ret =
> - StringSwitch<std::pair<ELFKind, uint16_t>>(S)
> + std::pair<ELFKind, uint16_t> ret =
> + StringSwitch<std::pair<ELFKind, uint16_t>>(s)
> .Cases("aarch64elf", "aarch64linux", "aarch64_elf64_le_vec",
> {ELF64LEKind, EM_AARCH64})
> .Cases("armelf", "armelf_linux_eabi", {ELF32LEKind, EM_ARM})
> @@ -146,101 +146,101 @@ static std::tuple<ELFKind, uint16_t, uin
> .Case("elf_iamcu", {ELF32LEKind, EM_IAMCU})
> .Default({ELFNoneKind, EM_NONE});
>
> - if (Ret.first == ELFNoneKind)
> - error("unknown emulation: " + Emul);
> - return std::make_tuple(Ret.first, Ret.second, OSABI);
> + if (ret.first == ELFNoneKind)
> + error("unknown emulation: " + emul);
> + return std::make_tuple(ret.first, ret.second, osabi);
> }
>
> // Returns slices of MB by parsing MB as an archive file.
> // Each slice consists of a member file in the archive.
> std::vector<std::pair<MemoryBufferRef, uint64_t>> static
> getArchiveMembers(
> - MemoryBufferRef MB) {
> - std::unique_ptr<Archive> File =
> - CHECK(Archive::create(MB),
> - MB.getBufferIdentifier() + ": failed to parse archive");
> -
> - std::vector<std::pair<MemoryBufferRef, uint64_t>> V;
> - Error Err = Error::success();
> - bool AddToTar = File->isThin() && Tar;
> - for (const ErrorOr<Archive::Child> &COrErr : File->children(Err)) {
> - Archive::Child C =
> - CHECK(COrErr, MB.getBufferIdentifier() +
> + MemoryBufferRef mb) {
> + std::unique_ptr<Archive> file =
> + CHECK(Archive::create(mb),
> + mb.getBufferIdentifier() + ": failed to parse archive");
> +
> + std::vector<std::pair<MemoryBufferRef, uint64_t>> v;
> + Error err = Error::success();
> + bool addToTar = file->isThin() && tar;
> + for (const ErrorOr<Archive::Child> &cOrErr : file->children(err)) {
> + Archive::Child c =
> + CHECK(cOrErr, mb.getBufferIdentifier() +
> ": could not get the child of the archive");
> - MemoryBufferRef MBRef =
> - CHECK(C.getMemoryBufferRef(),
> - MB.getBufferIdentifier() +
> + MemoryBufferRef mbref =
> + CHECK(c.getMemoryBufferRef(),
> + mb.getBufferIdentifier() +
> ": could not get the buffer for a child of the
> archive");
> - if (AddToTar)
> - Tar->append(relativeToRoot(check(C.getFullName())),
> MBRef.getBuffer());
> - V.push_back(std::make_pair(MBRef, C.getChildOffset()));
> - }
> - if (Err)
> - fatal(MB.getBufferIdentifier() + ": Archive::children failed: " +
> - toString(std::move(Err)));
> + if (addToTar)
> + tar->append(relativeToRoot(check(c.getFullName())),
> mbref.getBuffer());
> + v.push_back(std::make_pair(mbref, c.getChildOffset()));
> + }
> + if (err)
> + fatal(mb.getBufferIdentifier() + ": Archive::children failed: " +
> + toString(std::move(err)));
>
> // Take ownership of memory buffers created for members of thin
> archives.
> - for (std::unique_ptr<MemoryBuffer> &MB : File->takeThinBuffers())
> - make<std::unique_ptr<MemoryBuffer>>(std::move(MB));
> + for (std::unique_ptr<MemoryBuffer> &mb : file->takeThinBuffers())
> + make<std::unique_ptr<MemoryBuffer>>(std::move(mb));
>
> - return V;
> + return v;
> }
>
> // Opens a file and create a file object. Path has to be resolved
> already.
> -void LinkerDriver::addFile(StringRef Path, bool WithLOption) {
> +void LinkerDriver::addFile(StringRef path, bool withLOption) {
> using namespace sys::fs;
>
> - Optional<MemoryBufferRef> Buffer = readFile(Path);
> - if (!Buffer.hasValue())
> + Optional<MemoryBufferRef> buffer = readFile(path);
> + if (!buffer.hasValue())
> return;
> - MemoryBufferRef MBRef = *Buffer;
> + MemoryBufferRef mbref = *buffer;
>
> - if (Config->FormatBinary) {
> - Files.push_back(make<BinaryFile>(MBRef));
> + if (config->formatBinary) {
> + files.push_back(make<BinaryFile>(mbref));
> return;
> }
>
> - switch (identify_magic(MBRef.getBuffer())) {
> + switch (identify_magic(mbref.getBuffer())) {
> case file_magic::unknown:
> - readLinkerScript(MBRef);
> + readLinkerScript(mbref);
> return;
> case file_magic::archive: {
> // Handle -whole-archive.
> - if (InWholeArchive) {
> - for (const auto &P : getArchiveMembers(MBRef))
> - Files.push_back(createObjectFile(P.first, Path, P.second));
> + if (inWholeArchive) {
> + for (const auto &p : getArchiveMembers(mbref))
> + files.push_back(createObjectFile(p.first, path, p.second));
> return;
> }
>
> - std::unique_ptr<Archive> File =
> - CHECK(Archive::create(MBRef), Path + ": failed to parse
> archive");
> + std::unique_ptr<Archive> file =
> + CHECK(Archive::create(mbref), path + ": failed to parse
> archive");
>
> // If an archive file has no symbol table, it is likely that a
> user
> // is attempting LTO and using a default ar command that doesn't
> // understand the LLVM bitcode file. It is a pretty common error,
> so
> // we'll handle it as if it had a symbol table.
> - if (!File->isEmpty() && !File->hasSymbolTable()) {
> + if (!file->isEmpty() && !file->hasSymbolTable()) {
> // Check if all members are bitcode files. If not, ignore,
> which is the
> // default action without the LTO hack described above.
> - for (const std::pair<MemoryBufferRef, uint64_t> &P :
> - getArchiveMembers(MBRef))
> - if (identify_magic(P.first.getBuffer()) !=
> file_magic::bitcode) {
> - error(Path + ": archive has no index; run ranlib to add
> one");
> + for (const std::pair<MemoryBufferRef, uint64_t> &p :
> + getArchiveMembers(mbref))
> + if (identify_magic(p.first.getBuffer()) !=
> file_magic::bitcode) {
> + error(path + ": archive has no index; run ranlib to add
> one");
> return;
> }
>
> - for (const std::pair<MemoryBufferRef, uint64_t> &P :
> - getArchiveMembers(MBRef))
> - Files.push_back(make<LazyObjFile>(P.first, Path, P.second));
> + for (const std::pair<MemoryBufferRef, uint64_t> &p :
> + getArchiveMembers(mbref))
> + files.push_back(make<LazyObjFile>(p.first, path, p.second));
> return;
> }
>
> // Handle the regular case.
> - Files.push_back(make<ArchiveFile>(std::move(File)));
> + files.push_back(make<ArchiveFile>(std::move(file)));
> return;
> }
> case file_magic::elf_shared_object:
> - if (Config->Static || Config->Relocatable) {
> - error("attempted static link of dynamic object " + Path);
> + if (config->isStatic || config->relocatable) {
> + error("attempted static link of dynamic object " + path);
> return;
> }
>
> @@ -254,27 +254,27 @@ void LinkerDriver::addFile(StringRef Pat
> // If a file was specified by -lfoo, the directory part is not
> // significant, as a user did not specify it. This behavior is
> // compatible with GNU.
> - Files.push_back(
> - make<SharedFile>(MBRef, WithLOption ? path::filename(Path) :
> Path));
> + files.push_back(
> + make<SharedFile>(mbref, withLOption ? path::filename(path) :
> path));
> return;
> case file_magic::bitcode:
> case file_magic::elf_relocatable:
> - if (InLib)
> - Files.push_back(make<LazyObjFile>(MBRef, "", 0));
> + if (inLib)
> + files.push_back(make<LazyObjFile>(mbref, "", 0));
> else
> - Files.push_back(createObjectFile(MBRef));
> + files.push_back(createObjectFile(mbref));
> break;
> default:
> - error(Path + ": unknown file type");
> + error(path + ": unknown file type");
> }
> }
>
> // Add a given library by searching it from input search paths.
> -void LinkerDriver::addLibrary(StringRef Name) {
> - if (Optional<std::string> Path = searchLibrary(Name))
> - addFile(*Path, /*WithLOption=*/true);
> +void LinkerDriver::addLibrary(StringRef name) {
> + if (Optional<std::string> path = searchLibrary(name))
> + addFile(*path, /*WithLOption=*/true);
> else
> - error("unable to find library -l" + Name);
> + error("unable to find library -l" + name);
> }
>
> // This function is called on startup. We need this for LTO since
> @@ -293,117 +293,117 @@ static void initLLVM() {
> static void checkOptions() {
> // The MIPS ABI as of 2016 does not support the GNU-style symbol
> lookup
> // table which is a relatively new feature.
> - if (Config->EMachine == EM_MIPS && Config->GnuHash)
> + if (config->emachine == EM_MIPS && config->gnuHash)
> error("the .gnu.hash section is not compatible with the MIPS
> target");
>
> - if (Config->FixCortexA53Errata843419 && Config->EMachine !=
> EM_AARCH64)
> + if (config->fixCortexA53Errata843419 && config->emachine !=
> EM_AARCH64)
> error("--fix-cortex-a53-843419 is only supported on AArch64
> targets");
>
> - if (Config->TocOptimize && Config->EMachine != EM_PPC64)
> + if (config->tocOptimize && config->emachine != EM_PPC64)
> error("--toc-optimize is only supported on the PowerPC64 target");
>
> - if (Config->Pie && Config->Shared)
> + if (config->pie && config->shared)
> error("-shared and -pie may not be used together");
>
> - if (!Config->Shared && !Config->FilterList.empty())
> + if (!config->shared && !config->filterList.empty())
> error("-F may not be used without -shared");
>
> - if (!Config->Shared && !Config->AuxiliaryList.empty())
> + if (!config->shared && !config->auxiliaryList.empty())
> error("-f may not be used without -shared");
>
> - if (!Config->Relocatable && !Config->DefineCommon)
> + if (!config->relocatable && !config->defineCommon)
> error("-no-define-common not supported in non relocatable
> output");
>
> - if (Config->ZText && Config->ZIfuncNoplt)
> + if (config->zText && config->zIfuncNoplt)
> error("-z text and -z ifunc-noplt may not be used together");
>
> - if (Config->Relocatable) {
> - if (Config->Shared)
> + if (config->relocatable) {
> + if (config->shared)
> error("-r and -shared may not be used together");
> - if (Config->GcSections)
> + if (config->gcSections)
> error("-r and --gc-sections may not be used together");
> - if (Config->GdbIndex)
> + if (config->gdbIndex)
> error("-r and --gdb-index may not be used together");
> - if (Config->ICF != ICFLevel::None)
> + if (config->icf != ICFLevel::None)
> error("-r and --icf may not be used together");
> - if (Config->Pie)
> + if (config->pie)
> error("-r and -pie may not be used together");
> }
>
> - if (Config->ExecuteOnly) {
> - if (Config->EMachine != EM_AARCH64)
> + if (config->executeOnly) {
> + if (config->emachine != EM_AARCH64)
> error("-execute-only is only supported on AArch64 targets");
>
> - if (Config->SingleRoRx && !Script->HasSectionsCommand)
> + if (config->singleRoRx && !script->hasSectionsCommand)
> error("-execute-only and -no-rosegment cannot be used
> together");
> }
>
> - if (Config->ZRetpolineplt && Config->RequireCET)
> + if (config->zRetpolineplt && config->requireCET)
> error("--require-cet may not be used with -z retpolineplt");
>
> - if (Config->EMachine != EM_AARCH64) {
> - if (Config->PacPlt)
> + if (config->emachine != EM_AARCH64) {
> + if (config->pacPlt)
> error("--pac-plt only supported on AArch64");
> - if (Config->ForceBTI)
> + if (config->forceBTI)
> error("--force-bti only supported on AArch64");
> }
> }
>
> -static const char *getReproduceOption(opt::InputArgList &Args) {
> - if (auto *Arg = Args.getLastArg(OPT_reproduce))
> - return Arg->getValue();
> +static const char *getReproduceOption(opt::InputArgList &args) {
> + if (auto *arg = args.getLastArg(OPT_reproduce))
> + return arg->getValue();
> return getenv("LLD_REPRODUCE");
> }
>
> -static bool hasZOption(opt::InputArgList &Args, StringRef Key) {
> - for (auto *Arg : Args.filtered(OPT_z))
> - if (Key == Arg->getValue())
> +static bool hasZOption(opt::InputArgList &args, StringRef key) {
> + for (auto *arg : args.filtered(OPT_z))
> + if (key == arg->getValue())
> return true;
> return false;
> }
>
> -static bool getZFlag(opt::InputArgList &Args, StringRef K1, StringRef
> K2,
> +static bool getZFlag(opt::InputArgList &args, StringRef k1, StringRef
> k2,
> bool Default) {
> - for (auto *Arg : Args.filtered_reverse(OPT_z)) {
> - if (K1 == Arg->getValue())
> + for (auto *arg : args.filtered_reverse(OPT_z)) {
> + if (k1 == arg->getValue())
> return true;
> - if (K2 == Arg->getValue())
> + if (k2 == arg->getValue())
> return false;
> }
> return Default;
> }
>
> -static bool isKnownZFlag(StringRef S) {
> - return S == "combreloc" || S == "copyreloc" || S == "defs" ||
> - S == "execstack" || S == "global" || S == "hazardplt" ||
> - S == "ifunc-noplt" || S == "initfirst" || S == "interpose" ||
> - S == "keep-text-section-prefix" || S == "lazy" || S ==
> "muldefs" ||
> - S == "nocombreloc" || S == "nocopyreloc" || S ==
> "nodefaultlib" ||
> - S == "nodelete" || S == "nodlopen" || S == "noexecstack" ||
> - S == "nokeep-text-section-prefix" || S == "norelro" || S ==
> "notext" ||
> - S == "now" || S == "origin" || S == "relro" || S ==
> "retpolineplt" ||
> - S == "rodynamic" || S == "text" || S == "wxneeded" ||
> - S.startswith("common-page-size") ||
> S.startswith("max-page-size=") ||
> - S.startswith("stack-size=");
> +static bool isKnownZFlag(StringRef s) {
> + return s == "combreloc" || s == "copyreloc" || s == "defs" ||
> + s == "execstack" || s == "global" || s == "hazardplt" ||
> + s == "ifunc-noplt" || s == "initfirst" || s == "interpose" ||
> + s == "keep-text-section-prefix" || s == "lazy" || s ==
> "muldefs" ||
> + s == "nocombreloc" || s == "nocopyreloc" || s ==
> "nodefaultlib" ||
> + s == "nodelete" || s == "nodlopen" || s == "noexecstack" ||
> + s == "nokeep-text-section-prefix" || s == "norelro" || s ==
> "notext" ||
> + s == "now" || s == "origin" || s == "relro" || s ==
> "retpolineplt" ||
> + s == "rodynamic" || s == "text" || s == "wxneeded" ||
> + s.startswith("common-page-size") ||
> s.startswith("max-page-size=") ||
> + s.startswith("stack-size=");
> }
>
> // Report an error for an unknown -z option.
> -static void checkZOptions(opt::InputArgList &Args) {
> - for (auto *Arg : Args.filtered(OPT_z))
> - if (!isKnownZFlag(Arg->getValue()))
> - error("unknown -z value: " + StringRef(Arg->getValue()));
> +static void checkZOptions(opt::InputArgList &args) {
> + for (auto *arg : args.filtered(OPT_z))
> + if (!isKnownZFlag(arg->getValue()))
> + error("unknown -z value: " + StringRef(arg->getValue()));
> }
>
> -void LinkerDriver::main(ArrayRef<const char *> ArgsArr) {
> - ELFOptTable Parser;
> - opt::InputArgList Args = Parser.parse(ArgsArr.slice(1));
> +void LinkerDriver::main(ArrayRef<const char *> argsArr) {
> + ELFOptTable parser;
> + opt::InputArgList args = parser.parse(argsArr.slice(1));
>
> // Interpret this flag early because error() depends on them.
> - errorHandler().ErrorLimit = args::getInteger(Args, OPT_error_limit,
> 20);
> - checkZOptions(Args);
> + errorHandler().ErrorLimit = args::getInteger(args, OPT_error_limit,
> 20);
> + checkZOptions(args);
>
> // Handle -help
> - if (Args.hasArg(OPT_help)) {
> + if (args.hasArg(OPT_help)) {
> printHelp();
> return;
> }
> @@ -423,39 +423,39 @@ void LinkerDriver::main(ArrayRef<const c
> // lot of "configure" scripts out there that are generated by old
> version
> // of Libtool. We cannot convince every software developer to
> migrate to
> // the latest version and re-generate scripts. So we have this hack.
> - if (Args.hasArg(OPT_v) || Args.hasArg(OPT_version))
> + if (args.hasArg(OPT_v) || args.hasArg(OPT_version))
> message(getLLDVersion() + " (compatible with GNU linkers)");
>
> - if (const char *Path = getReproduceOption(Args)) {
> + if (const char *path = getReproduceOption(args)) {
> // Note that --reproduce is a debug option so you can ignore it
> // if you are trying to understand the whole picture of the code.
> - Expected<std::unique_ptr<TarWriter>> ErrOrWriter =
> - TarWriter::create(Path, path::stem(Path));
> - if (ErrOrWriter) {
> - Tar = std::move(*ErrOrWriter);
> - Tar->append("response.txt", createResponseFile(Args));
> - Tar->append("version.txt", getLLDVersion() + "\n");
> + Expected<std::unique_ptr<TarWriter>> errOrWriter =
> + TarWriter::create(path, path::stem(path));
> + if (errOrWriter) {
> + tar = std::move(*errOrWriter);
> + tar->append("response.txt", createResponseFile(args));
> + tar->append("version.txt", getLLDVersion() + "\n");
> } else {
> - error("--reproduce: " + toString(ErrOrWriter.takeError()));
> + error("--reproduce: " + toString(errOrWriter.takeError()));
> }
> }
>
> - readConfigs(Args);
> + readConfigs(args);
>
> // The behavior of -v or --version is a bit strange, but this is
> // needed for compatibility with GNU linkers.
> - if (Args.hasArg(OPT_v) && !Args.hasArg(OPT_INPUT))
> + if (args.hasArg(OPT_v) && !args.hasArg(OPT_INPUT))
> return;
> - if (Args.hasArg(OPT_version))
> + if (args.hasArg(OPT_version))
> return;
>
> initLLVM();
> - createFiles(Args);
> + createFiles(args);
> if (errorCount())
> return;
>
> inferMachineType();
> - setConfigs(Args);
> + setConfigs(args);
> checkOptions();
> if (errorCount())
> return;
> @@ -463,178 +463,178 @@ void LinkerDriver::main(ArrayRef<const c
> // The Target instance handles target-specific stuff, such as
> applying
> // relocations or writing a PLT section. It also contains
> target-dependent
> // values such as a default image base address.
> - Target = getTarget();
> + target = getTarget();
>
> - switch (Config->EKind) {
> + switch (config->ekind) {
> case ELF32LEKind:
> - link<ELF32LE>(Args);
> + link<ELF32LE>(args);
> return;
> case ELF32BEKind:
> - link<ELF32BE>(Args);
> + link<ELF32BE>(args);
> return;
> case ELF64LEKind:
> - link<ELF64LE>(Args);
> + link<ELF64LE>(args);
> return;
> case ELF64BEKind:
> - link<ELF64BE>(Args);
> + link<ELF64BE>(args);
> return;
> default:
> llvm_unreachable("unknown Config->EKind");
> }
> }
>
> -static std::string getRpath(opt::InputArgList &Args) {
> - std::vector<StringRef> V = args::getStrings(Args, OPT_rpath);
> - return llvm::join(V.begin(), V.end(), ":");
> +static std::string getRpath(opt::InputArgList &args) {
> + std::vector<StringRef> v = args::getStrings(args, OPT_rpath);
> + return llvm::join(v.begin(), v.end(), ":");
> }
>
> // Determines what we should do if there are remaining unresolved
> // symbols after the name resolution.
> -static UnresolvedPolicy getUnresolvedSymbolPolicy(opt::InputArgList
> &Args) {
> - UnresolvedPolicy ErrorOrWarn =
> Args.hasFlag(OPT_error_unresolved_symbols,
> +static UnresolvedPolicy getUnresolvedSymbolPolicy(opt::InputArgList
> &args) {
> + UnresolvedPolicy errorOrWarn =
> args.hasFlag(OPT_error_unresolved_symbols,
>
> OPT_warn_unresolved_symbols, true)
> ? UnresolvedPolicy::ReportError
> : UnresolvedPolicy::Warn;
>
> // Process the last of -unresolved-symbols, -no-undefined or -z
> defs.
> - for (auto *Arg : llvm::reverse(Args)) {
> - switch (Arg->getOption().getID()) {
> + for (auto *arg : llvm::reverse(args)) {
> + switch (arg->getOption().getID()) {
> case OPT_unresolved_symbols: {
> - StringRef S = Arg->getValue();
> - if (S == "ignore-all" || S == "ignore-in-object-files")
> + StringRef s = arg->getValue();
> + if (s == "ignore-all" || s == "ignore-in-object-files")
> return UnresolvedPolicy::Ignore;
> - if (S == "ignore-in-shared-libs" || S == "report-all")
> - return ErrorOrWarn;
> - error("unknown --unresolved-symbols value: " + S);
> + if (s == "ignore-in-shared-libs" || s == "report-all")
> + return errorOrWarn;
> + error("unknown --unresolved-symbols value: " + s);
> continue;
> }
> case OPT_no_undefined:
> - return ErrorOrWarn;
> + return errorOrWarn;
> case OPT_z:
> - if (StringRef(Arg->getValue()) == "defs")
> - return ErrorOrWarn;
> + if (StringRef(arg->getValue()) == "defs")
> + return errorOrWarn;
> continue;
> }
> }
>
> // -shared implies -unresolved-symbols=ignore-all because missing
> // symbols are likely to be resolved at runtime using other DSOs.
> - if (Config->Shared)
> + if (config->shared)
> return UnresolvedPolicy::Ignore;
> - return ErrorOrWarn;
> + return errorOrWarn;
> }
>
> -static Target2Policy getTarget2(opt::InputArgList &Args) {
> - StringRef S = Args.getLastArgValue(OPT_target2, "got-rel");
> - if (S == "rel")
> +static Target2Policy getTarget2(opt::InputArgList &args) {
> + StringRef s = args.getLastArgValue(OPT_target2, "got-rel");
> + if (s == "rel")
> return Target2Policy::Rel;
> - if (S == "abs")
> + if (s == "abs")
> return Target2Policy::Abs;
> - if (S == "got-rel")
> + if (s == "got-rel")
> return Target2Policy::GotRel;
> - error("unknown --target2 option: " + S);
> + error("unknown --target2 option: " + s);
> return Target2Policy::GotRel;
> }
>
> -static bool isOutputFormatBinary(opt::InputArgList &Args) {
> - StringRef S = Args.getLastArgValue(OPT_oformat, "elf");
> - if (S == "binary")
> +static bool isOutputFormatBinary(opt::InputArgList &args) {
> + StringRef s = args.getLastArgValue(OPT_oformat, "elf");
> + if (s == "binary")
> return true;
> - if (!S.startswith("elf"))
> - error("unknown --oformat value: " + S);
> + if (!s.startswith("elf"))
> + error("unknown --oformat value: " + s);
> return false;
> }
>
> -static DiscardPolicy getDiscard(opt::InputArgList &Args) {
> - if (Args.hasArg(OPT_relocatable))
> +static DiscardPolicy getDiscard(opt::InputArgList &args) {
> + if (args.hasArg(OPT_relocatable))
> return DiscardPolicy::None;
>
> - auto *Arg =
> - Args.getLastArg(OPT_discard_all, OPT_discard_locals,
> OPT_discard_none);
> - if (!Arg)
> + auto *arg =
> + args.getLastArg(OPT_discard_all, OPT_discard_locals,
> OPT_discard_none);
> + if (!arg)
> return DiscardPolicy::Default;
> - if (Arg->getOption().getID() == OPT_discard_all)
> + if (arg->getOption().getID() == OPT_discard_all)
> return DiscardPolicy::All;
> - if (Arg->getOption().getID() == OPT_discard_locals)
> + if (arg->getOption().getID() == OPT_discard_locals)
> return DiscardPolicy::Locals;
> return DiscardPolicy::None;
> }
>
> -static StringRef getDynamicLinker(opt::InputArgList &Args) {
> - auto *Arg = Args.getLastArg(OPT_dynamic_linker,
> OPT_no_dynamic_linker);
> - if (!Arg || Arg->getOption().getID() == OPT_no_dynamic_linker)
> +static StringRef getDynamicLinker(opt::InputArgList &args) {
> + auto *arg = args.getLastArg(OPT_dynamic_linker,
> OPT_no_dynamic_linker);
> + if (!arg || arg->getOption().getID() == OPT_no_dynamic_linker)
> return "";
> - return Arg->getValue();
> + return arg->getValue();
> }
>
> -static ICFLevel getICF(opt::InputArgList &Args) {
> - auto *Arg = Args.getLastArg(OPT_icf_none, OPT_icf_safe,
> OPT_icf_all);
> - if (!Arg || Arg->getOption().getID() == OPT_icf_none)
> +static ICFLevel getICF(opt::InputArgList &args) {
> + auto *arg = args.getLastArg(OPT_icf_none, OPT_icf_safe,
> OPT_icf_all);
> + if (!arg || arg->getOption().getID() == OPT_icf_none)
> return ICFLevel::None;
> - if (Arg->getOption().getID() == OPT_icf_safe)
> + if (arg->getOption().getID() == OPT_icf_safe)
> return ICFLevel::Safe;
> return ICFLevel::All;
> }
>
> -static StripPolicy getStrip(opt::InputArgList &Args) {
> - if (Args.hasArg(OPT_relocatable))
> +static StripPolicy getStrip(opt::InputArgList &args) {
> + if (args.hasArg(OPT_relocatable))
> return StripPolicy::None;
>
> - auto *Arg = Args.getLastArg(OPT_strip_all, OPT_strip_debug);
> - if (!Arg)
> + auto *arg = args.getLastArg(OPT_strip_all, OPT_strip_debug);
> + if (!arg)
> return StripPolicy::None;
> - if (Arg->getOption().getID() == OPT_strip_all)
> + if (arg->getOption().getID() == OPT_strip_all)
> return StripPolicy::All;
> return StripPolicy::Debug;
> }
>
> -static uint64_t parseSectionAddress(StringRef S, opt::InputArgList
> &Args,
> - const opt::Arg &Arg) {
> - uint64_t VA = 0;
> - if (S.startswith("0x"))
> - S = S.drop_front(2);
> - if (!to_integer(S, VA, 16))
> - error("invalid argument: " + Arg.getAsString(Args));
> - return VA;
> -}
> -
> -static StringMap<uint64_t> getSectionStartMap(opt::InputArgList
> &Args) {
> - StringMap<uint64_t> Ret;
> - for (auto *Arg : Args.filtered(OPT_section_start)) {
> - StringRef Name;
> - StringRef Addr;
> - std::tie(Name, Addr) = StringRef(Arg->getValue()).split('=');
> - Ret[Name] = parseSectionAddress(Addr, Args, *Arg);
> - }
> -
> - if (auto *Arg = Args.getLastArg(OPT_Ttext))
> - Ret[".text"] = parseSectionAddress(Arg->getValue(), Args, *Arg);
> - if (auto *Arg = Args.getLastArg(OPT_Tdata))
> - Ret[".data"] = parseSectionAddress(Arg->getValue(), Args, *Arg);
> - if (auto *Arg = Args.getLastArg(OPT_Tbss))
> - Ret[".bss"] = parseSectionAddress(Arg->getValue(), Args, *Arg);
> - return Ret;
> -}
> -
> -static SortSectionPolicy getSortSection(opt::InputArgList &Args) {
> - StringRef S = Args.getLastArgValue(OPT_sort_section);
> - if (S == "alignment")
> +static uint64_t parseSectionAddress(StringRef s, opt::InputArgList
> &args,
> + const opt::Arg &arg) {
> + uint64_t va = 0;
> + if (s.startswith("0x"))
> + s = s.drop_front(2);
> + if (!to_integer(s, va, 16))
> + error("invalid argument: " + arg.getAsString(args));
> + return va;
> +}
> +
> +static StringMap<uint64_t> getSectionStartMap(opt::InputArgList
> &args) {
> + StringMap<uint64_t> ret;
> + for (auto *arg : args.filtered(OPT_section_start)) {
> + StringRef name;
> + StringRef addr;
> + std::tie(name, addr) = StringRef(arg->getValue()).split('=');
> + ret[name] = parseSectionAddress(addr, args, *arg);
> + }
> +
> + if (auto *arg = args.getLastArg(OPT_Ttext))
> + ret[".text"] = parseSectionAddress(arg->getValue(), args, *arg);
> + if (auto *arg = args.getLastArg(OPT_Tdata))
> + ret[".data"] = parseSectionAddress(arg->getValue(), args, *arg);
> + if (auto *arg = args.getLastArg(OPT_Tbss))
> + ret[".bss"] = parseSectionAddress(arg->getValue(), args, *arg);
> + return ret;
> +}
> +
> +static SortSectionPolicy getSortSection(opt::InputArgList &args) {
> + StringRef s = args.getLastArgValue(OPT_sort_section);
> + if (s == "alignment")
> return SortSectionPolicy::Alignment;
> - if (S == "name")
> + if (s == "name")
> return SortSectionPolicy::Name;
> - if (!S.empty())
> - error("unknown --sort-section rule: " + S);
> + if (!s.empty())
> + error("unknown --sort-section rule: " + s);
> return SortSectionPolicy::Default;
> }
>
> -static OrphanHandlingPolicy getOrphanHandling(opt::InputArgList
> &Args) {
> - StringRef S = Args.getLastArgValue(OPT_orphan_handling, "place");
> - if (S == "warn")
> +static OrphanHandlingPolicy getOrphanHandling(opt::InputArgList
> &args) {
> + StringRef s = args.getLastArgValue(OPT_orphan_handling, "place");
> + if (s == "warn")
> return OrphanHandlingPolicy::Warn;
> - if (S == "error")
> + if (s == "error")
> return OrphanHandlingPolicy::Error;
> - if (S != "place")
> - error("unknown --orphan-handling mode: " + S);
> + if (s != "place")
> + error("unknown --orphan-handling mode: " + s);
> return OrphanHandlingPolicy::Place;
> }
>
> @@ -642,410 +642,410 @@ static OrphanHandlingPolicy getOrphanHan
> // synonym for "sha1" because all our hash functions including
> // -build-id=sha1 are actually tree hashes for performance reasons.
> static std::pair<BuildIdKind, std::vector<uint8_t>>
> -getBuildId(opt::InputArgList &Args) {
> - auto *Arg = Args.getLastArg(OPT_build_id, OPT_build_id_eq);
> - if (!Arg)
> +getBuildId(opt::InputArgList &args) {
> + auto *arg = args.getLastArg(OPT_build_id, OPT_build_id_eq);
> + if (!arg)
> return {BuildIdKind::None, {}};
>
> - if (Arg->getOption().getID() == OPT_build_id)
> + if (arg->getOption().getID() == OPT_build_id)
> return {BuildIdKind::Fast, {}};
>
> - StringRef S = Arg->getValue();
> - if (S == "fast")
> + StringRef s = arg->getValue();
> + if (s == "fast")
> return {BuildIdKind::Fast, {}};
> - if (S == "md5")
> + if (s == "md5")
> return {BuildIdKind::Md5, {}};
> - if (S == "sha1" || S == "tree")
> + if (s == "sha1" || s == "tree")
> return {BuildIdKind::Sha1, {}};
> - if (S == "uuid")
> + if (s == "uuid")
> return {BuildIdKind::Uuid, {}};
> - if (S.startswith("0x"))
> - return {BuildIdKind::Hexstring, parseHex(S.substr(2))};
> + if (s.startswith("0x"))
> + return {BuildIdKind::Hexstring, parseHex(s.substr(2))};
>
> - if (S != "none")
> - error("unknown --build-id style: " + S);
> + if (s != "none")
> + error("unknown --build-id style: " + s);
> return {BuildIdKind::None, {}};
> }
>
> -static std::pair<bool, bool> getPackDynRelocs(opt::InputArgList
> &Args) {
> - StringRef S = Args.getLastArgValue(OPT_pack_dyn_relocs, "none");
> - if (S == "android")
> +static std::pair<bool, bool> getPackDynRelocs(opt::InputArgList
> &args) {
> + StringRef s = args.getLastArgValue(OPT_pack_dyn_relocs, "none");
> + if (s == "android")
> return {true, false};
> - if (S == "relr")
> + if (s == "relr")
> return {false, true};
> - if (S == "android+relr")
> + if (s == "android+relr")
> return {true, true};
>
> - if (S != "none")
> - error("unknown -pack-dyn-relocs format: " + S);
> + if (s != "none")
> + error("unknown -pack-dyn-relocs format: " + s);
> return {false, false};
> }
>
> -static void readCallGraph(MemoryBufferRef MB) {
> +static void readCallGraph(MemoryBufferRef mb) {
> // Build a map from symbol name to section
> - DenseMap<StringRef, Symbol *> Map;
> - for (InputFile *File : ObjectFiles)
> - for (Symbol *Sym : File->getSymbols())
> - Map[Sym->getName()] = Sym;
> -
> - auto FindSection = [&](StringRef Name) -> InputSectionBase * {
> - Symbol *Sym = Map.lookup(Name);
> - if (!Sym) {
> - if (Config->WarnSymbolOrdering)
> - warn(MB.getBufferIdentifier() + ": no such symbol: " + Name);
> + DenseMap<StringRef, Symbol *> map;
> + for (InputFile *file : objectFiles)
> + for (Symbol *sym : file->getSymbols())
> + map[sym->getName()] = sym;
> +
> + auto findSection = [&](StringRef name) -> InputSectionBase * {
> + Symbol *sym = map.lookup(name);
> + if (!sym) {
> + if (config->warnSymbolOrdering)
> + warn(mb.getBufferIdentifier() + ": no such symbol: " + name);
> return nullptr;
> }
> - maybeWarnUnorderableSymbol(Sym);
> + maybeWarnUnorderableSymbol(sym);
>
> - if (Defined *DR = dyn_cast_or_null<Defined>(Sym))
> - return dyn_cast_or_null<InputSectionBase>(DR->Section);
> + if (Defined *dr = dyn_cast_or_null<Defined>(sym))
> + return dyn_cast_or_null<InputSectionBase>(dr->section);
> return nullptr;
> };
>
> - for (StringRef Line : args::getLines(MB)) {
> - SmallVector<StringRef, 3> Fields;
> - Line.split(Fields, ' ');
> - uint64_t Count;
> + for (StringRef line : args::getLines(mb)) {
> + SmallVector<StringRef, 3> fields;
> + line.split(fields, ' ');
> + uint64_t count;
>
> - if (Fields.size() != 3 || !to_integer(Fields[2], Count)) {
> - error(MB.getBufferIdentifier() + ": parse error");
> + if (fields.size() != 3 || !to_integer(fields[2], count)) {
> + error(mb.getBufferIdentifier() + ": parse error");
> return;
> }
>
> - if (InputSectionBase *From = FindSection(Fields[0]))
> - if (InputSectionBase *To = FindSection(Fields[1]))
> - Config->CallGraphProfile[std::make_pair(From, To)] += Count;
> + if (InputSectionBase *from = findSection(fields[0]))
> + if (InputSectionBase *to = findSection(fields[1]))
> + config->callGraphProfile[std::make_pair(from, to)] += count;
> }
> }
>
> template <class ELFT> static void readCallGraphsFromObjectFiles() {
> - for (auto File : ObjectFiles) {
> - auto *Obj = cast<ObjFile<ELFT>>(File);
> + for (auto file : objectFiles) {
> + auto *obj = cast<ObjFile<ELFT>>(file);
>
> - for (const Elf_CGProfile_Impl<ELFT> &CGPE : Obj->CGProfile) {
> - auto *FromSym =
> dyn_cast<Defined>(&Obj->getSymbol(CGPE.cgp_from));
> - auto *ToSym = dyn_cast<Defined>(&Obj->getSymbol(CGPE.cgp_to));
> - if (!FromSym || !ToSym)
> + for (const Elf_CGProfile_Impl<ELFT> &cgpe : obj->cgProfile) {
> + auto *fromSym =
> dyn_cast<Defined>(&obj->getSymbol(cgpe.cgp_from));
> + auto *toSym = dyn_cast<Defined>(&obj->getSymbol(cgpe.cgp_to));
> + if (!fromSym || !toSym)
> continue;
>
> - auto *From =
> dyn_cast_or_null<InputSectionBase>(FromSym->Section);
> - auto *To = dyn_cast_or_null<InputSectionBase>(ToSym->Section);
> - if (From && To)
> - Config->CallGraphProfile[{From, To}] += CGPE.cgp_weight;
> + auto *from =
> dyn_cast_or_null<InputSectionBase>(fromSym->section);
> + auto *to = dyn_cast_or_null<InputSectionBase>(toSym->section);
> + if (from && to)
> + config->callGraphProfile[{from, to}] += cgpe.cgp_weight;
> }
> }
> }
>
> -static bool getCompressDebugSections(opt::InputArgList &Args) {
> - StringRef S = Args.getLastArgValue(OPT_compress_debug_sections,
> "none");
> - if (S == "none")
> +static bool getCompressDebugSections(opt::InputArgList &args) {
> + StringRef s = args.getLastArgValue(OPT_compress_debug_sections,
> "none");
> + if (s == "none")
> return false;
> - if (S != "zlib")
> - error("unknown --compress-debug-sections value: " + S);
> + if (s != "zlib")
> + error("unknown --compress-debug-sections value: " + s);
> if (!zlib::isAvailable())
> error("--compress-debug-sections: zlib is not available");
> return true;
> }
>
> -static std::pair<StringRef, StringRef>
> getOldNewOptions(opt::InputArgList &Args,
> - unsigned Id) {
> - auto *Arg = Args.getLastArg(Id);
> - if (!Arg)
> +static std::pair<StringRef, StringRef>
> getOldNewOptions(opt::InputArgList &args,
> + unsigned id) {
> + auto *arg = args.getLastArg(id);
> + if (!arg)
> return {"", ""};
>
> - StringRef S = Arg->getValue();
> - std::pair<StringRef, StringRef> Ret = S.split(';');
> - if (Ret.second.empty())
> - error(Arg->getSpelling() + " expects 'old;new' format, but got "
> + S);
> - return Ret;
> + StringRef s = arg->getValue();
> + std::pair<StringRef, StringRef> ret = s.split(';');
> + if (ret.second.empty())
> + error(arg->getSpelling() + " expects 'old;new' format, but got "
> + s);
> + return ret;
> }
>
> // Parse the symbol ordering file and warn for any duplicate entries.
> -static std::vector<StringRef> getSymbolOrderingFile(MemoryBufferRef
> MB) {
> - SetVector<StringRef> Names;
> - for (StringRef S : args::getLines(MB))
> - if (!Names.insert(S) && Config->WarnSymbolOrdering)
> - warn(MB.getBufferIdentifier() + ": duplicate ordered symbol: "
> + S);
> +static std::vector<StringRef> getSymbolOrderingFile(MemoryBufferRef
> mb) {
> + SetVector<StringRef> names;
> + for (StringRef s : args::getLines(mb))
> + if (!names.insert(s) && config->warnSymbolOrdering)
> + warn(mb.getBufferIdentifier() + ": duplicate ordered symbol: "
> + s);
>
> - return Names.takeVector();
> + return names.takeVector();
> }
>
> -static void parseClangOption(StringRef Opt, const Twine &Msg) {
> - std::string Err;
> - raw_string_ostream OS(Err);
> +static void parseClangOption(StringRef opt, const Twine &msg) {
> + std::string err;
> + raw_string_ostream os(err);
>
> - const char *Argv[] = {Config->ProgName.data(), Opt.data()};
> - if (cl::ParseCommandLineOptions(2, Argv, "", &OS))
> + const char *argv[] = {config->progName.data(), opt.data()};
> + if (cl::ParseCommandLineOptions(2, argv, "", &os))
> return;
> - OS.flush();
> - error(Msg + ": " + StringRef(Err).trim());
> + os.flush();
> + error(msg + ": " + StringRef(err).trim());
> }
>
> // Initializes Config members by the command line options.
> -static void readConfigs(opt::InputArgList &Args) {
> - errorHandler().Verbose = Args.hasArg(OPT_verbose);
> +static void readConfigs(opt::InputArgList &args) {
> + errorHandler().Verbose = args.hasArg(OPT_verbose);
> errorHandler().FatalWarnings =
> - Args.hasFlag(OPT_fatal_warnings, OPT_no_fatal_warnings, false);
> - ThreadsEnabled = Args.hasFlag(OPT_threads, OPT_no_threads, true);
> + args.hasFlag(OPT_fatal_warnings, OPT_no_fatal_warnings, false);
> + ThreadsEnabled = args.hasFlag(OPT_threads, OPT_no_threads, true);
>
> - Config->AllowMultipleDefinition =
> - Args.hasFlag(OPT_allow_multiple_definition,
> + config->allowMultipleDefinition =
> + args.hasFlag(OPT_allow_multiple_definition,
> OPT_no_allow_multiple_definition, false) ||
> - hasZOption(Args, "muldefs");
> - Config->AllowShlibUndefined =
> - Args.hasFlag(OPT_allow_shlib_undefined,
> OPT_no_allow_shlib_undefined,
> - Args.hasArg(OPT_shared));
> - Config->AuxiliaryList = args::getStrings(Args, OPT_auxiliary);
> - Config->Bsymbolic = Args.hasArg(OPT_Bsymbolic);
> - Config->BsymbolicFunctions = Args.hasArg(OPT_Bsymbolic_functions);
> - Config->CheckSections =
> - Args.hasFlag(OPT_check_sections, OPT_no_check_sections, true);
> - Config->Chroot = Args.getLastArgValue(OPT_chroot);
> - Config->CompressDebugSections = getCompressDebugSections(Args);
> - Config->Cref = Args.hasFlag(OPT_cref, OPT_no_cref, false);
> - Config->DefineCommon = Args.hasFlag(OPT_define_common,
> OPT_no_define_common,
> - !Args.hasArg(OPT_relocatable));
> - Config->Demangle = Args.hasFlag(OPT_demangle, OPT_no_demangle,
> true);
> - Config->DependentLibraries = Args.hasFlag(OPT_dependent_libraries,
> OPT_no_dependent_libraries, true);
> - Config->DisableVerify = Args.hasArg(OPT_disable_verify);
> - Config->Discard = getDiscard(Args);
> - Config->DwoDir = Args.getLastArgValue(OPT_plugin_opt_dwo_dir_eq);
> - Config->DynamicLinker = getDynamicLinker(Args);
> - Config->EhFrameHdr =
> - Args.hasFlag(OPT_eh_frame_hdr, OPT_no_eh_frame_hdr, false);
> - Config->EmitLLVM = Args.hasArg(OPT_plugin_opt_emit_llvm, false);
> - Config->EmitRelocs = Args.hasArg(OPT_emit_relocs);
> - Config->CallGraphProfileSort = Args.hasFlag(
> + hasZOption(args, "muldefs");
> + config->allowShlibUndefined =
> + args.hasFlag(OPT_allow_shlib_undefined,
> OPT_no_allow_shlib_undefined,
> + args.hasArg(OPT_shared));
> + config->auxiliaryList = args::getStrings(args, OPT_auxiliary);
> + config->bsymbolic = args.hasArg(OPT_Bsymbolic);
> + config->bsymbolicFunctions = args.hasArg(OPT_Bsymbolic_functions);
> + config->checkSections =
> + args.hasFlag(OPT_check_sections, OPT_no_check_sections, true);
> + config->chroot = args.getLastArgValue(OPT_chroot);
> + config->compressDebugSections = getCompressDebugSections(args);
> + config->cref = args.hasFlag(OPT_cref, OPT_no_cref, false);
> + config->defineCommon = args.hasFlag(OPT_define_common,
> OPT_no_define_common,
> + !args.hasArg(OPT_relocatable));
> + config->demangle = args.hasFlag(OPT_demangle, OPT_no_demangle,
> true);
> + config->dependentLibraries = args.hasFlag(OPT_dependent_libraries,
> OPT_no_dependent_libraries, true);
> + config->disableVerify = args.hasArg(OPT_disable_verify);
> + config->discard = getDiscard(args);
> + config->dwoDir = args.getLastArgValue(OPT_plugin_opt_dwo_dir_eq);
> + config->dynamicLinker = getDynamicLinker(args);
> + config->ehFrameHdr =
> + args.hasFlag(OPT_eh_frame_hdr, OPT_no_eh_frame_hdr, false);
> + config->emitLLVM = args.hasArg(OPT_plugin_opt_emit_llvm, false);
> + config->emitRelocs = args.hasArg(OPT_emit_relocs);
> + config->callGraphProfileSort = args.hasFlag(
> OPT_call_graph_profile_sort, OPT_no_call_graph_profile_sort,
> true);
> - Config->EnableNewDtags =
> - Args.hasFlag(OPT_enable_new_dtags, OPT_disable_new_dtags, true);
> - Config->Entry = Args.getLastArgValue(OPT_entry);
> - Config->ExecuteOnly =
> - Args.hasFlag(OPT_execute_only, OPT_no_execute_only, false);
> - Config->ExportDynamic =
> - Args.hasFlag(OPT_export_dynamic, OPT_no_export_dynamic, false);
> - Config->FilterList = args::getStrings(Args, OPT_filter);
> - Config->Fini = Args.getLastArgValue(OPT_fini, "_fini");
> - Config->FixCortexA53Errata843419 =
> Args.hasArg(OPT_fix_cortex_a53_843419);
> - Config->ForceBTI = Args.hasArg(OPT_force_bti);
> - Config->RequireCET = Args.hasArg(OPT_require_cet);
> - Config->GcSections = Args.hasFlag(OPT_gc_sections,
> OPT_no_gc_sections, false);
> - Config->GnuUnique = Args.hasFlag(OPT_gnu_unique, OPT_no_gnu_unique,
> true);
> - Config->GdbIndex = Args.hasFlag(OPT_gdb_index, OPT_no_gdb_index,
> false);
> - Config->ICF = getICF(Args);
> - Config->IgnoreDataAddressEquality =
> - Args.hasArg(OPT_ignore_data_address_equality);
> - Config->IgnoreFunctionAddressEquality =
> - Args.hasArg(OPT_ignore_function_address_equality);
> - Config->Init = Args.getLastArgValue(OPT_init, "_init");
> - Config->LTOAAPipeline = Args.getLastArgValue(OPT_lto_aa_pipeline);
> - Config->LTOCSProfileGenerate =
> Args.hasArg(OPT_lto_cs_profile_generate);
> - Config->LTOCSProfileFile =
> Args.getLastArgValue(OPT_lto_cs_profile_file);
> - Config->LTODebugPassManager =
> Args.hasArg(OPT_lto_debug_pass_manager);
> - Config->LTONewPassManager = Args.hasArg(OPT_lto_new_pass_manager);
> - Config->LTONewPmPasses = Args.getLastArgValue(OPT_lto_newpm_passes);
> - Config->LTOO = args::getInteger(Args, OPT_lto_O, 2);
> - Config->LTOObjPath =
> Args.getLastArgValue(OPT_plugin_opt_obj_path_eq);
> - Config->LTOPartitions = args::getInteger(Args, OPT_lto_partitions,
> 1);
> - Config->LTOSampleProfile =
> Args.getLastArgValue(OPT_lto_sample_profile);
> - Config->MapFile = Args.getLastArgValue(OPT_Map);
> - Config->MipsGotSize = args::getInteger(Args, OPT_mips_got_size,
> 0xfff0);
> - Config->MergeArmExidx =
> - Args.hasFlag(OPT_merge_exidx_entries,
> OPT_no_merge_exidx_entries, true);
> - Config->Nmagic = Args.hasFlag(OPT_nmagic, OPT_no_nmagic, false);
> - Config->NoinhibitExec = Args.hasArg(OPT_noinhibit_exec);
> - Config->Nostdlib = Args.hasArg(OPT_nostdlib);
> - Config->OFormatBinary = isOutputFormatBinary(Args);
> - Config->Omagic = Args.hasFlag(OPT_omagic, OPT_no_omagic, false);
> - Config->OptRemarksFilename =
> Args.getLastArgValue(OPT_opt_remarks_filename);
> - Config->OptRemarksPasses =
> Args.getLastArgValue(OPT_opt_remarks_passes);
> - Config->OptRemarksWithHotness =
> Args.hasArg(OPT_opt_remarks_with_hotness);
> - Config->OptRemarksFormat =
> Args.getLastArgValue(OPT_opt_remarks_format);
> - Config->Optimize = args::getInteger(Args, OPT_O, 1);
> - Config->OrphanHandling = getOrphanHandling(Args);
> - Config->OutputFile = Args.getLastArgValue(OPT_o);
> - Config->PacPlt = Args.hasArg(OPT_pac_plt);
> - Config->Pie = Args.hasFlag(OPT_pie, OPT_no_pie, false);
> - Config->PrintIcfSections =
> - Args.hasFlag(OPT_print_icf_sections, OPT_no_print_icf_sections,
> false);
> - Config->PrintGcSections =
> - Args.hasFlag(OPT_print_gc_sections, OPT_no_print_gc_sections,
> false);
> - Config->PrintSymbolOrder =
> - Args.getLastArgValue(OPT_print_symbol_order);
> - Config->Rpath = getRpath(Args);
> - Config->Relocatable = Args.hasArg(OPT_relocatable);
> - Config->SaveTemps = Args.hasArg(OPT_save_temps);
> - Config->SearchPaths = args::getStrings(Args, OPT_library_path);
> - Config->SectionStartMap = getSectionStartMap(Args);
> - Config->Shared = Args.hasArg(OPT_shared);
> - Config->SingleRoRx = Args.hasArg(OPT_no_rosegment);
> - Config->SoName = Args.getLastArgValue(OPT_soname);
> - Config->SortSection = getSortSection(Args);
> - Config->SplitStackAdjustSize = args::getInteger(Args,
> OPT_split_stack_adjust_size, 16384);
> - Config->Strip = getStrip(Args);
> - Config->Sysroot = Args.getLastArgValue(OPT_sysroot);
> - Config->Target1Rel = Args.hasFlag(OPT_target1_rel, OPT_target1_abs,
> false);
> - Config->Target2 = getTarget2(Args);
> - Config->ThinLTOCacheDir =
> Args.getLastArgValue(OPT_thinlto_cache_dir);
> - Config->ThinLTOCachePolicy = CHECK(
> -
> parseCachePruningPolicy(Args.getLastArgValue(OPT_thinlto_cache_policy)),
> + config->enableNewDtags =
> + args.hasFlag(OPT_enable_new_dtags, OPT_disable_new_dtags, true);
> + config->entry = args.getLastArgValue(OPT_entry);
> + config->executeOnly =
> + args.hasFlag(OPT_execute_only, OPT_no_execute_only, false);
> + config->exportDynamic =
> + args.hasFlag(OPT_export_dynamic, OPT_no_export_dynamic, false);
> + config->filterList = args::getStrings(args, OPT_filter);
> + config->fini = args.getLastArgValue(OPT_fini, "_fini");
> + config->fixCortexA53Errata843419 =
> args.hasArg(OPT_fix_cortex_a53_843419);
> + config->forceBTI = args.hasArg(OPT_force_bti);
> + config->requireCET = args.hasArg(OPT_require_cet);
> + config->gcSections = args.hasFlag(OPT_gc_sections,
> OPT_no_gc_sections, false);
> + config->gnuUnique = args.hasFlag(OPT_gnu_unique, OPT_no_gnu_unique,
> true);
> + config->gdbIndex = args.hasFlag(OPT_gdb_index, OPT_no_gdb_index,
> false);
> + config->icf = getICF(args);
> + config->ignoreDataAddressEquality =
> + args.hasArg(OPT_ignore_data_address_equality);
> + config->ignoreFunctionAddressEquality =
> + args.hasArg(OPT_ignore_function_address_equality);
> + config->init = args.getLastArgValue(OPT_init, "_init");
> + config->ltoAAPipeline = args.getLastArgValue(OPT_lto_aa_pipeline);
> + config->ltoCSProfileGenerate =
> args.hasArg(OPT_lto_cs_profile_generate);
> + config->ltoCSProfileFile =
> args.getLastArgValue(OPT_lto_cs_profile_file);
> + config->ltoDebugPassManager =
> args.hasArg(OPT_lto_debug_pass_manager);
> + config->ltoNewPassManager = args.hasArg(OPT_lto_new_pass_manager);
> + config->ltoNewPmPasses = args.getLastArgValue(OPT_lto_newpm_passes);
> + config->ltoo = args::getInteger(args, OPT_lto_O, 2);
> + config->ltoObjPath =
> args.getLastArgValue(OPT_plugin_opt_obj_path_eq);
> + config->ltoPartitions = args::getInteger(args, OPT_lto_partitions,
> 1);
> + config->ltoSampleProfile =
> args.getLastArgValue(OPT_lto_sample_profile);
> + config->mapFile = args.getLastArgValue(OPT_Map);
> + config->mipsGotSize = args::getInteger(args, OPT_mips_got_size,
> 0xfff0);
> + config->mergeArmExidx =
> + args.hasFlag(OPT_merge_exidx_entries,
> OPT_no_merge_exidx_entries, true);
> + config->nmagic = args.hasFlag(OPT_nmagic, OPT_no_nmagic, false);
> + config->noinhibitExec = args.hasArg(OPT_noinhibit_exec);
> + config->nostdlib = args.hasArg(OPT_nostdlib);
> + config->oFormatBinary = isOutputFormatBinary(args);
> + config->omagic = args.hasFlag(OPT_omagic, OPT_no_omagic, false);
> + config->optRemarksFilename =
> args.getLastArgValue(OPT_opt_remarks_filename);
> + config->optRemarksPasses =
> args.getLastArgValue(OPT_opt_remarks_passes);
> + config->optRemarksWithHotness =
> args.hasArg(OPT_opt_remarks_with_hotness);
> + config->optRemarksFormat =
> args.getLastArgValue(OPT_opt_remarks_format);
> + config->optimize = args::getInteger(args, OPT_O, 1);
> + config->orphanHandling = getOrphanHandling(args);
> + config->outputFile = args.getLastArgValue(OPT_o);
> + config->pacPlt = args.hasArg(OPT_pac_plt);
> + config->pie = args.hasFlag(OPT_pie, OPT_no_pie, false);
> + config->printIcfSections =
> + args.hasFlag(OPT_print_icf_sections, OPT_no_print_icf_sections,
> false);
> + config->printGcSections =
> + args.hasFlag(OPT_print_gc_sections, OPT_no_print_gc_sections,
> false);
> + config->printSymbolOrder =
> + args.getLastArgValue(OPT_print_symbol_order);
> + config->rpath = getRpath(args);
> + config->relocatable = args.hasArg(OPT_relocatable);
> + config->saveTemps = args.hasArg(OPT_save_temps);
> + config->searchPaths = args::getStrings(args, OPT_library_path);
> + config->sectionStartMap = getSectionStartMap(args);
> + config->shared = args.hasArg(OPT_shared);
> + config->singleRoRx = args.hasArg(OPT_no_rosegment);
> + config->soName = args.getLastArgValue(OPT_soname);
> + config->sortSection = getSortSection(args);
> + config->splitStackAdjustSize = args::getInteger(args,
> OPT_split_stack_adjust_size, 16384);
> + config->strip = getStrip(args);
> + config->sysroot = args.getLastArgValue(OPT_sysroot);
> + config->target1Rel = args.hasFlag(OPT_target1_rel, OPT_target1_abs,
> false);
> + config->target2 = getTarget2(args);
> + config->thinLTOCacheDir =
> args.getLastArgValue(OPT_thinlto_cache_dir);
> + config->thinLTOCachePolicy = CHECK(
> +
> parseCachePruningPolicy(args.getLastArgValue(OPT_thinlto_cache_policy)),
> "--thinlto-cache-policy: invalid cache policy");
> - Config->ThinLTOEmitImportsFiles =
> - Args.hasArg(OPT_plugin_opt_thinlto_emit_imports_files);
> - Config->ThinLTOIndexOnly =
> Args.hasArg(OPT_plugin_opt_thinlto_index_only) ||
> -
> Args.hasArg(OPT_plugin_opt_thinlto_index_only_eq);
> - Config->ThinLTOIndexOnlyArg =
> - Args.getLastArgValue(OPT_plugin_opt_thinlto_index_only_eq);
> - Config->ThinLTOJobs = args::getInteger(Args, OPT_thinlto_jobs, -1u);
> - Config->ThinLTOObjectSuffixReplace =
> - getOldNewOptions(Args,
> OPT_plugin_opt_thinlto_object_suffix_replace_eq);
> - Config->ThinLTOPrefixReplace =
> - getOldNewOptions(Args,
> OPT_plugin_opt_thinlto_prefix_replace_eq);
> - Config->Trace = Args.hasArg(OPT_trace);
> - Config->Undefined = args::getStrings(Args, OPT_undefined);
> - Config->UndefinedVersion =
> - Args.hasFlag(OPT_undefined_version, OPT_no_undefined_version,
> true);
> - Config->UseAndroidRelrTags = Args.hasFlag(
> + config->thinLTOEmitImportsFiles =
> + args.hasArg(OPT_plugin_opt_thinlto_emit_imports_files);
> + config->thinLTOIndexOnly =
> args.hasArg(OPT_plugin_opt_thinlto_index_only) ||
> +
> args.hasArg(OPT_plugin_opt_thinlto_index_only_eq);
> + config->thinLTOIndexOnlyArg =
> + args.getLastArgValue(OPT_plugin_opt_thinlto_index_only_eq);
> + config->thinLTOJobs = args::getInteger(args, OPT_thinlto_jobs, -1u);
> + config->thinLTOObjectSuffixReplace =
> + getOldNewOptions(args,
> OPT_plugin_opt_thinlto_object_suffix_replace_eq);
> + config->thinLTOPrefixReplace =
> + getOldNewOptions(args,
> OPT_plugin_opt_thinlto_prefix_replace_eq);
> + config->trace = args.hasArg(OPT_trace);
> + config->undefined = args::getStrings(args, OPT_undefined);
> + config->undefinedVersion =
> + args.hasFlag(OPT_undefined_version, OPT_no_undefined_version,
> true);
> + config->useAndroidRelrTags = args.hasFlag(
> OPT_use_android_relr_tags, OPT_no_use_android_relr_tags, false);
> - Config->UnresolvedSymbols = getUnresolvedSymbolPolicy(Args);
> - Config->WarnBackrefs =
> - Args.hasFlag(OPT_warn_backrefs, OPT_no_warn_backrefs, false);
> - Config->WarnCommon = Args.hasFlag(OPT_warn_common,
> OPT_no_warn_common, false);
> - Config->WarnIfuncTextrel =
> - Args.hasFlag(OPT_warn_ifunc_textrel, OPT_no_warn_ifunc_textrel,
> false);
> - Config->WarnSymbolOrdering =
> - Args.hasFlag(OPT_warn_symbol_ordering,
> OPT_no_warn_symbol_ordering, true);
> - Config->ZCombreloc = getZFlag(Args, "combreloc", "nocombreloc",
> true);
> - Config->ZCopyreloc = getZFlag(Args, "copyreloc", "nocopyreloc",
> true);
> - Config->ZExecstack = getZFlag(Args, "execstack", "noexecstack",
> false);
> - Config->ZGlobal = hasZOption(Args, "global");
> - Config->ZHazardplt = hasZOption(Args, "hazardplt");
> - Config->ZIfuncNoplt = hasZOption(Args, "ifunc-noplt");
> - Config->ZInitfirst = hasZOption(Args, "initfirst");
> - Config->ZInterpose = hasZOption(Args, "interpose");
> - Config->ZKeepTextSectionPrefix = getZFlag(
> - Args, "keep-text-section-prefix", "nokeep-text-section-prefix",
> false);
> - Config->ZNodefaultlib = hasZOption(Args, "nodefaultlib");
> - Config->ZNodelete = hasZOption(Args, "nodelete");
> - Config->ZNodlopen = hasZOption(Args, "nodlopen");
> - Config->ZNow = getZFlag(Args, "now", "lazy", false);
> - Config->ZOrigin = hasZOption(Args, "origin");
> - Config->ZRelro = getZFlag(Args, "relro", "norelro", true);
> - Config->ZRetpolineplt = hasZOption(Args, "retpolineplt");
> - Config->ZRodynamic = hasZOption(Args, "rodynamic");
> - Config->ZStackSize = args::getZOptionValue(Args, OPT_z,
> "stack-size", 0);
> - Config->ZText = getZFlag(Args, "text", "notext", true);
> - Config->ZWxneeded = hasZOption(Args, "wxneeded");
> + config->unresolvedSymbols = getUnresolvedSymbolPolicy(args);
> + config->warnBackrefs =
> + args.hasFlag(OPT_warn_backrefs, OPT_no_warn_backrefs, false);
> + config->warnCommon = args.hasFlag(OPT_warn_common,
> OPT_no_warn_common, false);
> + config->warnIfuncTextrel =
> + args.hasFlag(OPT_warn_ifunc_textrel, OPT_no_warn_ifunc_textrel,
> false);
> + config->warnSymbolOrdering =
> + args.hasFlag(OPT_warn_symbol_ordering,
> OPT_no_warn_symbol_ordering, true);
> + config->zCombreloc = getZFlag(args, "combreloc", "nocombreloc",
> true);
> + config->zCopyreloc = getZFlag(args, "copyreloc", "nocopyreloc",
> true);
> + config->zExecstack = getZFlag(args, "execstack", "noexecstack",
> false);
> + config->zGlobal = hasZOption(args, "global");
> + config->zHazardplt = hasZOption(args, "hazardplt");
> + config->zIfuncNoplt = hasZOption(args, "ifunc-noplt");
> + config->zInitfirst = hasZOption(args, "initfirst");
> + config->zInterpose = hasZOption(args, "interpose");
> + config->zKeepTextSectionPrefix = getZFlag(
> + args, "keep-text-section-prefix", "nokeep-text-section-prefix",
> false);
> + config->zNodefaultlib = hasZOption(args, "nodefaultlib");
> + config->zNodelete = hasZOption(args, "nodelete");
> + config->zNodlopen = hasZOption(args, "nodlopen");
> + config->zNow = getZFlag(args, "now", "lazy", false);
> + config->zOrigin = hasZOption(args, "origin");
> + config->zRelro = getZFlag(args, "relro", "norelro", true);
> + config->zRetpolineplt = hasZOption(args, "retpolineplt");
> + config->zRodynamic = hasZOption(args, "rodynamic");
> + config->zStackSize = args::getZOptionValue(args, OPT_z,
> "stack-size", 0);
> + config->zText = getZFlag(args, "text", "notext", true);
> + config->zWxneeded = hasZOption(args, "wxneeded");
>
> // Parse LTO options.
> - if (auto *Arg = Args.getLastArg(OPT_plugin_opt_mcpu_eq))
> - parseClangOption(Saver.save("-mcpu=" +
> StringRef(Arg->getValue())),
> - Arg->getSpelling());
> + if (auto *arg = args.getLastArg(OPT_plugin_opt_mcpu_eq))
> + parseClangOption(Saver.save("-mcpu=" +
> StringRef(arg->getValue())),
> + arg->getSpelling());
>
> - for (auto *Arg : Args.filtered(OPT_plugin_opt))
> - parseClangOption(Arg->getValue(), Arg->getSpelling());
> + for (auto *arg : args.filtered(OPT_plugin_opt))
> + parseClangOption(arg->getValue(), arg->getSpelling());
>
> // Parse -mllvm options.
> - for (auto *Arg : Args.filtered(OPT_mllvm))
> - parseClangOption(Arg->getValue(), Arg->getSpelling());
> + for (auto *arg : args.filtered(OPT_mllvm))
> + parseClangOption(arg->getValue(), arg->getSpelling());
>
> - if (Config->LTOO > 3)
> - error("invalid optimization level for LTO: " +
> Twine(Config->LTOO));
> - if (Config->LTOPartitions == 0)
> + if (config->ltoo > 3)
> + error("invalid optimization level for LTO: " +
> Twine(config->ltoo));
> + if (config->ltoPartitions == 0)
> error("--lto-partitions: number of threads must be > 0");
> - if (Config->ThinLTOJobs == 0)
> + if (config->thinLTOJobs == 0)
> error("--thinlto-jobs: number of threads must be > 0");
>
> - if (Config->SplitStackAdjustSize < 0)
> + if (config->splitStackAdjustSize < 0)
> error("--split-stack-adjust-size: size must be >= 0");
>
> // Parse ELF{32,64}{LE,BE} and CPU type.
> - if (auto *Arg = Args.getLastArg(OPT_m)) {
> - StringRef S = Arg->getValue();
> - std::tie(Config->EKind, Config->EMachine, Config->OSABI) =
> - parseEmulation(S);
> - Config->MipsN32Abi = (S == "elf32btsmipn32" || S ==
> "elf32ltsmipn32");
> - Config->Emulation = S;
> + if (auto *arg = args.getLastArg(OPT_m)) {
> + StringRef s = arg->getValue();
> + std::tie(config->ekind, config->emachine, config->osabi) =
> + parseEmulation(s);
> + config->mipsN32Abi = (s == "elf32btsmipn32" || s ==
> "elf32ltsmipn32");
> + config->emulation = s;
> }
>
> // Parse -hash-style={sysv,gnu,both}.
> - if (auto *Arg = Args.getLastArg(OPT_hash_style)) {
> - StringRef S = Arg->getValue();
> - if (S == "sysv")
> - Config->SysvHash = true;
> - else if (S == "gnu")
> - Config->GnuHash = true;
> - else if (S == "both")
> - Config->SysvHash = Config->GnuHash = true;
> + if (auto *arg = args.getLastArg(OPT_hash_style)) {
> + StringRef s = arg->getValue();
> + if (s == "sysv")
> + config->sysvHash = true;
> + else if (s == "gnu")
> + config->gnuHash = true;
> + else if (s == "both")
> + config->sysvHash = config->gnuHash = true;
> else
> - error("unknown -hash-style: " + S);
> + error("unknown -hash-style: " + s);
> }
>
> - if (Args.hasArg(OPT_print_map))
> - Config->MapFile = "-";
> + if (args.hasArg(OPT_print_map))
> + config->mapFile = "-";
>
> // Page alignment can be disabled by the -n (--nmagic) and -N
> (--omagic).
> // As PT_GNU_RELRO relies on Paging, do not create it when we have
> disabled
> // it.
> - if (Config->Nmagic || Config->Omagic)
> - Config->ZRelro = false;
> + if (config->nmagic || config->omagic)
> + config->zRelro = false;
>
> - std::tie(Config->BuildId, Config->BuildIdVector) = getBuildId(Args);
> + std::tie(config->buildId, config->buildIdVector) = getBuildId(args);
>
> - std::tie(Config->AndroidPackDynRelocs, Config->RelrPackDynRelocs) =
> - getPackDynRelocs(Args);
> + std::tie(config->androidPackDynRelocs, config->relrPackDynRelocs) =
> + getPackDynRelocs(args);
>
> - if (auto *Arg = Args.getLastArg(OPT_symbol_ordering_file)){
> - if (Args.hasArg(OPT_call_graph_ordering_file))
> + if (auto *arg = args.getLastArg(OPT_symbol_ordering_file)){
> + if (args.hasArg(OPT_call_graph_ordering_file))
> error("--symbol-ordering-file and --call-graph-order-file "
> "may not be used together");
> - if (Optional<MemoryBufferRef> Buffer = readFile(Arg->getValue())){
> - Config->SymbolOrderingFile = getSymbolOrderingFile(*Buffer);
> + if (Optional<MemoryBufferRef> buffer = readFile(arg->getValue())){
> + config->symbolOrderingFile = getSymbolOrderingFile(*buffer);
> // Also need to disable CallGraphProfileSort to prevent
> // LLD order symbols with CGProfile
> - Config->CallGraphProfileSort = false;
> + config->callGraphProfileSort = false;
> }
> }
>
> // If --retain-symbol-file is used, we'll keep only the symbols
> listed in
> // the file and discard all others.
> - if (auto *Arg = Args.getLastArg(OPT_retain_symbols_file)) {
> - Config->DefaultSymbolVersion = VER_NDX_LOCAL;
> - if (Optional<MemoryBufferRef> Buffer = readFile(Arg->getValue()))
> - for (StringRef S : args::getLines(*Buffer))
> - Config->VersionScriptGlobals.push_back(
> - {S, /*IsExternCpp*/ false, /*HasWildcard*/ false});
> + if (auto *arg = args.getLastArg(OPT_retain_symbols_file)) {
> + config->defaultSymbolVersion = VER_NDX_LOCAL;
> + if (Optional<MemoryBufferRef> buffer = readFile(arg->getValue()))
> + for (StringRef s : args::getLines(*buffer))
> + config->versionScriptGlobals.push_back(
> + {s, /*IsExternCpp*/ false, /*HasWildcard*/ false});
> }
>
> - bool HasExportDynamic =
> - Args.hasFlag(OPT_export_dynamic, OPT_no_export_dynamic, false);
> + bool hasExportDynamic =
> + args.hasFlag(OPT_export_dynamic, OPT_no_export_dynamic, false);
>
> // Parses -dynamic-list and -export-dynamic-symbol. They make some
> // symbols private. Note that -export-dynamic takes precedence over
> them
> // as it says all symbols should be exported.
> - if (!HasExportDynamic) {
> - for (auto *Arg : Args.filtered(OPT_dynamic_list))
> - if (Optional<MemoryBufferRef> Buffer =
> readFile(Arg->getValue()))
> - readDynamicList(*Buffer);
> -
> - for (auto *Arg : Args.filtered(OPT_export_dynamic_symbol))
> - Config->DynamicList.push_back(
> - {Arg->getValue(), /*IsExternCpp*/ false, /*HasWildcard*/
> false});
> + if (!hasExportDynamic) {
> + for (auto *arg : args.filtered(OPT_dynamic_list))
> + if (Optional<MemoryBufferRef> buffer =
> readFile(arg->getValue()))
> + readDynamicList(*buffer);
> +
> + for (auto *arg : args.filtered(OPT_export_dynamic_symbol))
> + config->dynamicList.push_back(
> + {arg->getValue(), /*IsExternCpp*/ false, /*HasWildcard*/
> false});
> }
>
> // If --export-dynamic-symbol=foo is given and symbol foo is
> defined in
> // an object file in an archive file, that object file should be
> pulled
> // out and linked. (It doesn't have to behave like that from
> technical
> // point of view, but this is needed for compatibility with GNU.)
> - for (auto *Arg : Args.filtered(OPT_export_dynamic_symbol))
> - Config->Undefined.push_back(Arg->getValue());
> + for (auto *arg : args.filtered(OPT_export_dynamic_symbol))
> + config->undefined.push_back(arg->getValue());
>
> - for (auto *Arg : Args.filtered(OPT_version_script))
> - if (Optional<std::string> Path = searchScript(Arg->getValue())) {
> - if (Optional<MemoryBufferRef> Buffer = readFile(*Path))
> - readVersionScript(*Buffer);
> + for (auto *arg : args.filtered(OPT_version_script))
> + if (Optional<std::string> path = searchScript(arg->getValue())) {
> + if (Optional<MemoryBufferRef> buffer = readFile(*path))
> + readVersionScript(*buffer);
> } else {
> - error(Twine("cannot find version script ") + Arg->getValue());
> + error(Twine("cannot find version script ") + arg->getValue());
> }
> }
>
> @@ -1053,18 +1053,18 @@ static void readConfigs(opt::InputArgLis
> // command line options, but computed based on other Config values.
> // This function initialize such members. See Config.h for the details
> // of these values.
> -static void setConfigs(opt::InputArgList &Args) {
> - ELFKind K = Config->EKind;
> - uint16_t M = Config->EMachine;
> -
> - Config->CopyRelocs = (Config->Relocatable || Config->EmitRelocs);
> - Config->Is64 = (K == ELF64LEKind || K == ELF64BEKind);
> - Config->IsLE = (K == ELF32LEKind || K == ELF64LEKind);
> - Config->Endianness = Config->IsLE ? endianness::little :
> endianness::big;
> - Config->IsMips64EL = (K == ELF64LEKind && M == EM_MIPS);
> - Config->Pic = Config->Pie || Config->Shared;
> - Config->PicThunk = Args.hasArg(OPT_pic_veneer, Config->Pic);
> - Config->Wordsize = Config->Is64 ? 8 : 4;
> +static void setConfigs(opt::InputArgList &args) {
> + ELFKind k = config->ekind;
> + uint16_t m = config->emachine;
> +
> + config->copyRelocs = (config->relocatable || config->emitRelocs);
> + config->is64 = (k == ELF64LEKind || k == ELF64BEKind);
> + config->isLE = (k == ELF32LEKind || k == ELF64LEKind);
> + config->endianness = config->isLE ? endianness::little :
> endianness::big;
> + config->isMips64EL = (k == ELF64LEKind && m == EM_MIPS);
> + config->isPic = config->pie || config->shared;
> + config->picThunk = args.hasArg(OPT_pic_veneer, config->isPic);
> + config->wordsize = config->is64 ? 8 : 4;
>
> // ELF defines two different ways to store relocation addends as
> shown below:
> //
> @@ -1079,150 +1079,150 @@ static void setConfigs(opt::InputArgList
> // You cannot choose which one, Rel or Rela, you want to use.
> Instead each
> // ABI defines which one you need to use. The following expression
> expresses
> // that.
> - Config->IsRela = M == EM_AARCH64 || M == EM_AMDGPU || M ==
> EM_HEXAGON ||
> - M == EM_PPC || M == EM_PPC64 || M == EM_RISCV ||
> - M == EM_X86_64;
> + config->isRela = m == EM_AARCH64 || m == EM_AMDGPU || m ==
> EM_HEXAGON ||
> + m == EM_PPC || m == EM_PPC64 || m == EM_RISCV ||
> + m == EM_X86_64;
>
> // If the output uses REL relocations we must store the dynamic
> relocation
> // addends to the output sections. We also store addends for RELA
> relocations
> // if --apply-dynamic-relocs is used.
> // We default to not writing the addends when using RELA
> relocations since
> // any standard conforming tool can find it in r_addend.
> - Config->WriteAddends = Args.hasFlag(OPT_apply_dynamic_relocs,
> + config->writeAddends = args.hasFlag(OPT_apply_dynamic_relocs,
> OPT_no_apply_dynamic_relocs,
> false) ||
> - !Config->IsRela;
> + !config->isRela;
>
> - Config->TocOptimize =
> - Args.hasFlag(OPT_toc_optimize, OPT_no_toc_optimize, M ==
> EM_PPC64);
> + config->tocOptimize =
> + args.hasFlag(OPT_toc_optimize, OPT_no_toc_optimize, m ==
> EM_PPC64);
> }
>
> // Returns a value of "-format" option.
> -static bool isFormatBinary(StringRef S) {
> - if (S == "binary")
> +static bool isFormatBinary(StringRef s) {
> + if (s == "binary")
> return true;
> - if (S == "elf" || S == "default")
> + if (s == "elf" || s == "default")
> return false;
> - error("unknown -format value: " + S +
> + error("unknown -format value: " + s +
> " (supported formats: elf, default, binary)");
> return false;
> }
>
> -void LinkerDriver::createFiles(opt::InputArgList &Args) {
> +void LinkerDriver::createFiles(opt::InputArgList &args) {
> // For --{push,pop}-state.
> - std::vector<std::tuple<bool, bool, bool>> Stack;
> + std::vector<std::tuple<bool, bool, bool>> stack;
>
> // Iterate over argv to process input files and positional
> arguments.
> - for (auto *Arg : Args) {
> - switch (Arg->getOption().getID()) {
> + for (auto *arg : args) {
> + switch (arg->getOption().getID()) {
> case OPT_library:
> - addLibrary(Arg->getValue());
> + addLibrary(arg->getValue());
> break;
> case OPT_INPUT:
> - addFile(Arg->getValue(), /*WithLOption=*/false);
> + addFile(arg->getValue(), /*WithLOption=*/false);
> break;
> case OPT_defsym: {
> - StringRef From;
> - StringRef To;
> - std::tie(From, To) = StringRef(Arg->getValue()).split('=');
> - if (From.empty() || To.empty())
> - error("-defsym: syntax error: " + StringRef(Arg->getValue()));
> + StringRef from;
> + StringRef to;
> + std::tie(from, to) = StringRef(arg->getValue()).split('=');
> + if (from.empty() || to.empty())
> + error("-defsym: syntax error: " + StringRef(arg->getValue()));
> else
> - readDefsym(From, MemoryBufferRef(To, "-defsym"));
> + readDefsym(from, MemoryBufferRef(to, "-defsym"));
> break;
> }
> case OPT_script:
> - if (Optional<std::string> Path = searchScript(Arg->getValue()))
> {
> - if (Optional<MemoryBufferRef> MB = readFile(*Path))
> - readLinkerScript(*MB);
> + if (Optional<std::string> path = searchScript(arg->getValue()))
> {
> + if (Optional<MemoryBufferRef> mb = readFile(*path))
> + readLinkerScript(*mb);
> break;
> }
> - error(Twine("cannot find linker script ") + Arg->getValue());
> + error(Twine("cannot find linker script ") + arg->getValue());
> break;
> case OPT_as_needed:
> - Config->AsNeeded = true;
> + config->asNeeded = true;
> break;
> case OPT_format:
> - Config->FormatBinary = isFormatBinary(Arg->getValue());
> + config->formatBinary = isFormatBinary(arg->getValue());
> break;
> case OPT_no_as_needed:
> - Config->AsNeeded = false;
> + config->asNeeded = false;
> break;
> case OPT_Bstatic:
> case OPT_omagic:
> case OPT_nmagic:
> - Config->Static = true;
> + config->isStatic = true;
> break;
> case OPT_Bdynamic:
> - Config->Static = false;
> + config->isStatic = false;
> break;
> case OPT_whole_archive:
> - InWholeArchive = true;
> + inWholeArchive = true;
> break;
> case OPT_no_whole_archive:
> - InWholeArchive = false;
> + inWholeArchive = false;
> break;
> case OPT_just_symbols:
> - if (Optional<MemoryBufferRef> MB = readFile(Arg->getValue())) {
> - Files.push_back(createObjectFile(*MB));
> - Files.back()->JustSymbols = true;
> + if (Optional<MemoryBufferRef> mb = readFile(arg->getValue())) {
> + files.push_back(createObjectFile(*mb));
> + files.back()->justSymbols = true;
> }
> break;
> case OPT_start_group:
> - if (InputFile::IsInGroup)
> + if (InputFile::isInGroup)
> error("nested --start-group");
> - InputFile::IsInGroup = true;
> + InputFile::isInGroup = true;
> break;
> case OPT_end_group:
> - if (!InputFile::IsInGroup)
> + if (!InputFile::isInGroup)
> error("stray --end-group");
> - InputFile::IsInGroup = false;
> - ++InputFile::NextGroupId;
> + InputFile::isInGroup = false;
> + ++InputFile::nextGroupId;
> break;
> case OPT_start_lib:
> - if (InLib)
> + if (inLib)
> error("nested --start-lib");
> - if (InputFile::IsInGroup)
> + if (InputFile::isInGroup)
> error("may not nest --start-lib in --start-group");
> - InLib = true;
> - InputFile::IsInGroup = true;
> + inLib = true;
> + InputFile::isInGroup = true;
> break;
> case OPT_end_lib:
> - if (!InLib)
> + if (!inLib)
> error("stray --end-lib");
> - InLib = false;
> - InputFile::IsInGroup = false;
> - ++InputFile::NextGroupId;
> + inLib = false;
> + InputFile::isInGroup = false;
> + ++InputFile::nextGroupId;
> break;
> case OPT_push_state:
> - Stack.emplace_back(Config->AsNeeded, Config->Static,
> InWholeArchive);
> + stack.emplace_back(config->asNeeded, config->isStatic,
> inWholeArchive);
> break;
> case OPT_pop_state:
> - if (Stack.empty()) {
> + if (stack.empty()) {
> error("unbalanced --push-state/--pop-state");
> break;
> }
> - std::tie(Config->AsNeeded, Config->Static, InWholeArchive) =
> Stack.back();
> - Stack.pop_back();
> + std::tie(config->asNeeded, config->isStatic, inWholeArchive) =
> stack.back();
> + stack.pop_back();
> break;
> }
> }
>
> - if (Files.empty() && errorCount() == 0)
> + if (files.empty() && errorCount() == 0)
> error("no input files");
> }
>
> // If -m <machine_type> was not given, infer it from object files.
> void LinkerDriver::inferMachineType() {
> - if (Config->EKind != ELFNoneKind)
> + if (config->ekind != ELFNoneKind)
> return;
>
> - for (InputFile *F : Files) {
> - if (F->EKind == ELFNoneKind)
> + for (InputFile *f : files) {
> + if (f->ekind == ELFNoneKind)
> continue;
> - Config->EKind = F->EKind;
> - Config->EMachine = F->EMachine;
> - Config->OSABI = F->OSABI;
> - Config->MipsN32Abi = Config->EMachine == EM_MIPS &&
> isMipsN32Abi(F);
> + config->ekind = f->ekind;
> + config->emachine = f->emachine;
> + config->osabi = f->osabi;
> + config->mipsN32Abi = config->emachine == EM_MIPS &&
> isMipsN32Abi(f);
> return;
> }
> error("target emulation unknown: -m or at least one .o file
> required");
> @@ -1230,72 +1230,72 @@ void LinkerDriver::inferMachineType() {
>
> // Parse -z max-page-size=<value>. The default value is defined by
> // each target.
> -static uint64_t getMaxPageSize(opt::InputArgList &Args) {
> - uint64_t Val = args::getZOptionValue(Args, OPT_z, "max-page-size",
> - Target->DefaultMaxPageSize);
> - if (!isPowerOf2_64(Val))
> +static uint64_t getMaxPageSize(opt::InputArgList &args) {
> + uint64_t val = args::getZOptionValue(args, OPT_z, "max-page-size",
> + target->defaultMaxPageSize);
> + if (!isPowerOf2_64(val))
> error("max-page-size: value isn't a power of 2");
> - if (Config->Nmagic || Config->Omagic) {
> - if (Val != Target->DefaultMaxPageSize)
> + if (config->nmagic || config->omagic) {
> + if (val != target->defaultMaxPageSize)
> warn("-z max-page-size set, but paging disabled by omagic or
> nmagic");
> return 1;
> }
> - return Val;
> + return val;
> }
>
> // Parse -z common-page-size=<value>. The default value is defined by
> // each target.
> -static uint64_t getCommonPageSize(opt::InputArgList &Args) {
> - uint64_t Val = args::getZOptionValue(Args, OPT_z,
> "common-page-size",
> - Target->DefaultCommonPageSize);
> - if (!isPowerOf2_64(Val))
> +static uint64_t getCommonPageSize(opt::InputArgList &args) {
> + uint64_t val = args::getZOptionValue(args, OPT_z,
> "common-page-size",
> + target->defaultCommonPageSize);
> + if (!isPowerOf2_64(val))
> error("common-page-size: value isn't a power of 2");
> - if (Config->Nmagic || Config->Omagic) {
> - if (Val != Target->DefaultCommonPageSize)
> + if (config->nmagic || config->omagic) {
> + if (val != target->defaultCommonPageSize)
> warn("-z common-page-size set, but paging disabled by omagic or
> nmagic");
> return 1;
> }
> // CommonPageSize can't be larger than MaxPageSize.
> - if (Val > Config->MaxPageSize)
> - Val = Config->MaxPageSize;
> - return Val;
> + if (val > config->maxPageSize)
> + val = config->maxPageSize;
> + return val;
> }
>
> // Parses -image-base option.
> -static Optional<uint64_t> getImageBase(opt::InputArgList &Args) {
> +static Optional<uint64_t> getImageBase(opt::InputArgList &args) {
> // Because we are using "Config->MaxPageSize" here, this function
> has to be
> // called after the variable is initialized.
> - auto *Arg = Args.getLastArg(OPT_image_base);
> - if (!Arg)
> + auto *arg = args.getLastArg(OPT_image_base);
> + if (!arg)
> return None;
>
> - StringRef S = Arg->getValue();
> - uint64_t V;
> - if (!to_integer(S, V)) {
> - error("-image-base: number expected, but got " + S);
> + StringRef s = arg->getValue();
> + uint64_t v;
> + if (!to_integer(s, v)) {
> + error("-image-base: number expected, but got " + s);
> return 0;
> }
> - if ((V % Config->MaxPageSize) != 0)
> - warn("-image-base: address isn't multiple of page size: " + S);
> - return V;
> + if ((v % config->maxPageSize) != 0)
> + warn("-image-base: address isn't multiple of page size: " + s);
> + return v;
> }
>
> // Parses `--exclude-libs=lib,lib,...`.
> // The library names may be delimited by commas or colons.
> -static DenseSet<StringRef> getExcludeLibs(opt::InputArgList &Args) {
> - DenseSet<StringRef> Ret;
> - for (auto *Arg : Args.filtered(OPT_exclude_libs)) {
> - StringRef S = Arg->getValue();
> +static DenseSet<StringRef> getExcludeLibs(opt::InputArgList &args) {
> + DenseSet<StringRef> ret;
> + for (auto *arg : args.filtered(OPT_exclude_libs)) {
> + StringRef s = arg->getValue();
> for (;;) {
> - size_t Pos = S.find_first_of(",:");
> - if (Pos == StringRef::npos)
> + size_t pos = s.find_first_of(",:");
> + if (pos == StringRef::npos)
> break;
> - Ret.insert(S.substr(0, Pos));
> - S = S.substr(Pos + 1);
> + ret.insert(s.substr(0, pos));
> + s = s.substr(pos + 1);
> }
> - Ret.insert(S);
> + ret.insert(s);
> }
> - return Ret;
> + return ret;
> }
>
> // Handles the -exclude-libs option. If a static library file is
> specified
> @@ -1304,71 +1304,71 @@ static DenseSet<StringRef> getExcludeLib
> // A special library name "ALL" means all archive files.
> //
> // This is not a popular option, but some programs such as bionic
> libc use it.
> -static void excludeLibs(opt::InputArgList &Args) {
> - DenseSet<StringRef> Libs = getExcludeLibs(Args);
> - bool All = Libs.count("ALL");
> -
> - auto Visit = [&](InputFile *File) {
> - if (!File->ArchiveName.empty())
> - if (All || Libs.count(path::filename(File->ArchiveName)))
> - for (Symbol *Sym : File->getSymbols())
> - if (!Sym->isLocal() && Sym->File == File)
> - Sym->VersionId = VER_NDX_LOCAL;
> +static void excludeLibs(opt::InputArgList &args) {
> + DenseSet<StringRef> libs = getExcludeLibs(args);
> + bool all = libs.count("ALL");
> +
> + auto visit = [&](InputFile *file) {
> + if (!file->archiveName.empty())
> + if (all || libs.count(path::filename(file->archiveName)))
> + for (Symbol *sym : file->getSymbols())
> + if (!sym->isLocal() && sym->file == file)
> + sym->versionId = VER_NDX_LOCAL;
> };
>
> - for (InputFile *File : ObjectFiles)
> - Visit(File);
> + for (InputFile *file : objectFiles)
> + visit(file);
>
> - for (BitcodeFile *File : BitcodeFiles)
> - Visit(File);
> + for (BitcodeFile *file : bitcodeFiles)
> + visit(file);
> }
>
> // Force Sym to be entered in the output. Used for -u or equivalent.
> -static void handleUndefined(Symbol *Sym) {
> +static void handleUndefined(Symbol *sym) {
> // Since a symbol may not be used inside the program, LTO may
> // eliminate it. Mark the symbol as "used" to prevent it.
> - Sym->IsUsedInRegularObj = true;
> + sym->isUsedInRegularObj = true;
>
> - if (Sym->isLazy())
> - Sym->fetch();
> + if (sym->isLazy())
> + sym->fetch();
> }
>
> // As an extention to GNU linkers, lld supports a variant of `-u`
> // which accepts wildcard patterns. All symbols that match a given
> // pattern are handled as if they were given by `-u`.
> -static void handleUndefinedGlob(StringRef Arg) {
> - Expected<GlobPattern> Pat = GlobPattern::create(Arg);
> - if (!Pat) {
> - error("--undefined-glob: " + toString(Pat.takeError()));
> +static void handleUndefinedGlob(StringRef arg) {
> + Expected<GlobPattern> pat = GlobPattern::create(arg);
> + if (!pat) {
> + error("--undefined-glob: " + toString(pat.takeError()));
> return;
> }
>
> - std::vector<Symbol *> Syms;
> - Symtab->forEachSymbol([&](Symbol *Sym) {
> + std::vector<Symbol *> syms;
> + symtab->forEachSymbol([&](Symbol *sym) {
> // Calling Sym->fetch() from here is not safe because it may
> // add new symbols to the symbol table, invalidating the
> // current iterator. So we just keep a note.
> - if (Pat->match(Sym->getName()))
> - Syms.push_back(Sym);
> + if (pat->match(sym->getName()))
> + syms.push_back(sym);
> });
>
> - for (Symbol *Sym : Syms)
> - handleUndefined(Sym);
> + for (Symbol *sym : syms)
> + handleUndefined(sym);
> }
>
> -static void handleLibcall(StringRef Name) {
> - Symbol *Sym = Symtab->find(Name);
> - if (!Sym || !Sym->isLazy())
> +static void handleLibcall(StringRef name) {
> + Symbol *sym = symtab->find(name);
> + if (!sym || !sym->isLazy())
> return;
>
> - MemoryBufferRef MB;
> - if (auto *LO = dyn_cast<LazyObject>(Sym))
> - MB = LO->File->MB;
> + MemoryBufferRef mb;
> + if (auto *lo = dyn_cast<LazyObject>(sym))
> + mb = lo->file->mb;
> else
> - MB = cast<LazyArchive>(Sym)->getMemberBuffer();
> + mb = cast<LazyArchive>(sym)->getMemberBuffer();
>
> - if (isBitcode(MB))
> - Sym->fetch();
> + if (isBitcode(mb))
> + sym->fetch();
> }
>
> // Replaces common symbols with defined symbols reside in .bss
> sections.
> @@ -1376,17 +1376,17 @@ static void handleLibcall(StringRef Name
> // result, the passes after the symbol resolution won't see any
> // symbols of type CommonSymbol.
> static void replaceCommonSymbols() {
> - Symtab->forEachSymbol([](Symbol *Sym) {
> - auto *S = dyn_cast<CommonSymbol>(Sym);
> - if (!S)
> + symtab->forEachSymbol([](Symbol *sym) {
> + auto *s = dyn_cast<CommonSymbol>(sym);
> + if (!s)
> return;
>
> - auto *Bss = make<BssSection>("COMMON", S->Size, S->Alignment);
> - Bss->File = S->File;
> - Bss->markDead();
> - InputSections.push_back(Bss);
> - S->replace(Defined{S->File, S->getName(), S->Binding, S->StOther,
> S->Type,
> - /*Value=*/0, S->Size, Bss});
> + auto *bss = make<BssSection>("COMMON", s->size, s->alignment);
> + bss->file = s->file;
> + bss->markDead();
> + inputSections.push_back(bss);
> + s->replace(Defined{s->file, s->getName(), s->binding, s->stOther,
> s->type,
> + /*Value=*/0, s->size, bss});
> });
> }
>
> @@ -1395,78 +1395,78 @@ static void replaceCommonSymbols() {
> // created from the DSO. Otherwise, they become dangling references
> // that point to a non-existent DSO.
> static void demoteSharedSymbols() {
> - Symtab->forEachSymbol([](Symbol *Sym) {
> - auto *S = dyn_cast<SharedSymbol>(Sym);
> - if (!S || S->getFile().IsNeeded)
> + symtab->forEachSymbol([](Symbol *sym) {
> + auto *s = dyn_cast<SharedSymbol>(sym);
> + if (!s || s->getFile().isNeeded)
> return;
>
> - bool Used = S->Used;
> - S->replace(Undefined{nullptr, S->getName(), STB_WEAK, S->StOther,
> S->Type});
> - S->Used = Used;
> + bool used = s->used;
> + s->replace(Undefined{nullptr, s->getName(), STB_WEAK, s->stOther,
> s->type});
> + s->used = used;
> });
> }
>
> // The section referred to by S is considered address-significant.
> Set the
> // KeepUnique flag on the section if appropriate.
> -static void markAddrsig(Symbol *S) {
> - if (auto *D = dyn_cast_or_null<Defined>(S))
> - if (D->Section)
> +static void markAddrsig(Symbol *s) {
> + if (auto *d = dyn_cast_or_null<Defined>(s))
> + if (d->section)
> // We don't need to keep text sections unique under --icf=all
> even if they
> // are address-significant.
> - if (Config->ICF == ICFLevel::Safe || !(D->Section->Flags &
> SHF_EXECINSTR))
> - D->Section->KeepUnique = true;
> + if (config->icf == ICFLevel::Safe || !(d->section->flags &
> SHF_EXECINSTR))
> + d->section->keepUnique = true;
> }
>
> // Record sections that define symbols mentioned in --keep-unique
> <symbol>
> // and symbols referred to by address-significance tables. These
> sections are
> // ineligible for ICF.
> template <class ELFT>
> -static void findKeepUniqueSections(opt::InputArgList &Args) {
> - for (auto *Arg : Args.filtered(OPT_keep_unique)) {
> - StringRef Name = Arg->getValue();
> - auto *D = dyn_cast_or_null<Defined>(Symtab->find(Name));
> - if (!D || !D->Section) {
> - warn("could not find symbol " + Name + " to keep unique");
> +static void findKeepUniqueSections(opt::InputArgList &args) {
> + for (auto *arg : args.filtered(OPT_keep_unique)) {
> + StringRef name = arg->getValue();
> + auto *d = dyn_cast_or_null<Defined>(symtab->find(name));
> + if (!d || !d->section) {
> + warn("could not find symbol " + name + " to keep unique");
> continue;
> }
> - D->Section->KeepUnique = true;
> + d->section->keepUnique = true;
> }
>
> // --icf=all --ignore-data-address-equality means that we can ignore
> // the dynsym and address-significance tables entirely.
> - if (Config->ICF == ICFLevel::All &&
> Config->IgnoreDataAddressEquality)
> + if (config->icf == ICFLevel::All &&
> config->ignoreDataAddressEquality)
> return;
>
> // Symbols in the dynsym could be address-significant in other
> executables
> // or DSOs, so we conservatively mark them as address-significant.
> - Symtab->forEachSymbol([&](Symbol *Sym) {
> - if (Sym->includeInDynsym())
> - markAddrsig(Sym);
> + symtab->forEachSymbol([&](Symbol *sym) {
> + if (sym->includeInDynsym())
> + markAddrsig(sym);
> });
>
> // Visit the address-significance table in each object file and
> mark each
> // referenced symbol as address-significant.
> - for (InputFile *F : ObjectFiles) {
> - auto *Obj = cast<ObjFile<ELFT>>(F);
> - ArrayRef<Symbol *> Syms = Obj->getSymbols();
> - if (Obj->AddrsigSec) {
> - ArrayRef<uint8_t> Contents =
> - check(Obj->getObj().getSectionContents(Obj->AddrsigSec));
> - const uint8_t *Cur = Contents.begin();
> - while (Cur != Contents.end()) {
> - unsigned Size;
> - const char *Err;
> - uint64_t SymIndex = decodeULEB128(Cur, &Size, Contents.end(),
> &Err);
> - if (Err)
> - fatal(toString(F) + ": could not decode addrsig section: "
> + Err);
> - markAddrsig(Syms[SymIndex]);
> - Cur += Size;
> + for (InputFile *f : objectFiles) {
> + auto *obj = cast<ObjFile<ELFT>>(f);
> + ArrayRef<Symbol *> syms = obj->getSymbols();
> + if (obj->addrsigSec) {
> + ArrayRef<uint8_t> contents =
> + check(obj->getObj().getSectionContents(obj->addrsigSec));
> + const uint8_t *cur = contents.begin();
> + while (cur != contents.end()) {
> + unsigned size;
> + const char *err;
> + uint64_t symIndex = decodeULEB128(cur, &size, contents.end(),
> &err);
> + if (err)
> + fatal(toString(f) + ": could not decode addrsig section: "
> + err);
> + markAddrsig(syms[symIndex]);
> + cur += size;
> }
> } else {
> // If an object file does not have an address-significance
> table,
> // conservatively mark all of its symbols as
> address-significant.
> - for (Symbol *S : Syms)
> - markAddrsig(S);
> + for (Symbol *s : syms)
> + markAddrsig(s);
> }
> }
> }
> @@ -1475,20 +1475,20 @@ static void findKeepUniqueSections(opt::
> // are used to control which partition a symbol is allocated to. See
> //
> https://urldefense.proofpoint.com/v2/url?u=https-3A__lld.llvm.org_Partitions.html&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=xehk92--dowqd4Is0R_S0eI2s9rLRkmcxAQgihwuQW8&e=
> for more details on partitions.
> template <typename ELFT>
> -static void readSymbolPartitionSection(InputSectionBase *S) {
> +static void readSymbolPartitionSection(InputSectionBase *s) {
> // Read the relocation that refers to the partition's entry point
> symbol.
> - Symbol *Sym;
> - if (S->AreRelocsRela)
> - Sym = &S->getFile<ELFT>()->getRelocTargetSym(S->template
> relas<ELFT>()[0]);
> + Symbol *sym;
> + if (s->areRelocsRela)
> + sym = &s->getFile<ELFT>()->getRelocTargetSym(s->template
> relas<ELFT>()[0]);
> else
> - Sym = &S->getFile<ELFT>()->getRelocTargetSym(S->template
> rels<ELFT>()[0]);
> - if (!isa<Defined>(Sym) || !Sym->includeInDynsym())
> + sym = &s->getFile<ELFT>()->getRelocTargetSym(s->template
> rels<ELFT>()[0]);
> + if (!isa<Defined>(sym) || !sym->includeInDynsym())
> return;
>
> - StringRef PartName = reinterpret_cast<const char
> *>(S->data().data());
> - for (Partition &Part : Partitions) {
> - if (Part.Name == PartName) {
> - Sym->Partition = Part.getNumber();
> + StringRef partName = reinterpret_cast<const char
> *>(s->data().data());
> + for (Partition &part : partitions) {
> + if (part.name == partName) {
> + sym->partition = part.getNumber();
> return;
> }
> }
> @@ -1496,33 +1496,33 @@ static void readSymbolPartitionSection(I
> // Forbid partitions from being used on incompatible targets, and
> forbid them
> // from being used together with various linker features that
> assume a single
> // set of output sections.
> - if (Script->HasSectionsCommand)
> - error(toString(S->File) +
> + if (script->hasSectionsCommand)
> + error(toString(s->file) +
> ": partitions cannot be used with the SECTIONS command");
> - if (Script->hasPhdrsCommands())
> - error(toString(S->File) +
> + if (script->hasPhdrsCommands())
> + error(toString(s->file) +
> ": partitions cannot be used with the PHDRS command");
> - if (!Config->SectionStartMap.empty())
> - error(toString(S->File) + ": partitions cannot be used with "
> + if (!config->sectionStartMap.empty())
> + error(toString(s->file) + ": partitions cannot be used with "
> "--section-start, -Ttext, -Tdata or
> -Tbss");
> - if (Config->EMachine == EM_MIPS)
> - error(toString(S->File) + ": partitions cannot be used on this
> target");
> + if (config->emachine == EM_MIPS)
> + error(toString(s->file) + ": partitions cannot be used on this
> target");
>
> // Impose a limit of no more than 254 partitions. This limit comes
> from the
> // sizes of the Partition fields in InputSectionBase and Symbol, as
> well as
> // the amount of space devoted to the partition number in RankFlags.
> - if (Partitions.size() == 254)
> + if (partitions.size() == 254)
> fatal("may not have more than 254 partitions");
>
> - Partitions.emplace_back();
> - Partition &NewPart = Partitions.back();
> - NewPart.Name = PartName;
> - Sym->Partition = NewPart.getNumber();
> + partitions.emplace_back();
> + Partition &newPart = partitions.back();
> + newPart.name = partName;
> + sym->partition = newPart.getNumber();
> }
>
> -static Symbol *addUndefined(StringRef Name) {
> - return Symtab->addSymbol(
> - Undefined{nullptr, Name, STB_GLOBAL, STV_DEFAULT, 0});
> +static Symbol *addUndefined(StringRef name) {
> + return symtab->addSymbol(
> + Undefined{nullptr, name, STB_GLOBAL, STV_DEFAULT, 0});
> }
>
> // This function is where all the optimizations of link-time
> @@ -1534,16 +1534,16 @@ static Symbol *addUndefined(StringRef Na
> // the compiler at once, it can do a whole-program optimization.
> template <class ELFT> void LinkerDriver::compileBitcodeFiles() {
> // Compile bitcode files and replace bitcode symbols.
> - LTO.reset(new BitcodeCompiler);
> - for (BitcodeFile *File : BitcodeFiles)
> - LTO->add(*File);
> -
> - for (InputFile *File : LTO->compile()) {
> - auto *Obj = cast<ObjFile<ELFT>>(File);
> - Obj->parse(/*IgnoreComdats=*/true);
> - for (Symbol *Sym : Obj->getGlobalSymbols())
> - Sym->parseSymbolVersion();
> - ObjectFiles.push_back(File);
> + lto.reset(new BitcodeCompiler);
> + for (BitcodeFile *file : bitcodeFiles)
> + lto->add(*file);
> +
> + for (InputFile *file : lto->compile()) {
> + auto *obj = cast<ObjFile<ELFT>>(file);
> + obj->parse(/*IgnoreComdats=*/true);
> + for (Symbol *sym : obj->getGlobalSymbols())
> + sym->parseSymbolVersion();
> + objectFiles.push_back(file);
> }
> }
>
> @@ -1556,9 +1556,9 @@ template <class ELFT> void LinkerDriver:
> //
> // This data structure is instantiated for each -wrap option.
> struct WrappedSymbol {
> - Symbol *Sym;
> - Symbol *Real;
> - Symbol *Wrap;
> + Symbol *sym;
> + Symbol *real;
> + Symbol *wrap;
> };
>
> // Handles -wrap option.
> @@ -1566,33 +1566,33 @@ struct WrappedSymbol {
> // This function instantiates wrapper symbols. At this point, they
> seem
> // like they are not being used at all, so we explicitly set some
> flags so
> // that LTO won't eliminate them.
> -static std::vector<WrappedSymbol> addWrappedSymbols(opt::InputArgList
> &Args) {
> - std::vector<WrappedSymbol> V;
> - DenseSet<StringRef> Seen;
> -
> - for (auto *Arg : Args.filtered(OPT_wrap)) {
> - StringRef Name = Arg->getValue();
> - if (!Seen.insert(Name).second)
> +static std::vector<WrappedSymbol> addWrappedSymbols(opt::InputArgList
> &args) {
> + std::vector<WrappedSymbol> v;
> + DenseSet<StringRef> seen;
> +
> + for (auto *arg : args.filtered(OPT_wrap)) {
> + StringRef name = arg->getValue();
> + if (!seen.insert(name).second)
> continue;
>
> - Symbol *Sym = Symtab->find(Name);
> - if (!Sym)
> + Symbol *sym = symtab->find(name);
> + if (!sym)
> continue;
>
> - Symbol *Real = addUndefined(Saver.save("__real_" + Name));
> - Symbol *Wrap = addUndefined(Saver.save("__wrap_" + Name));
> - V.push_back({Sym, Real, Wrap});
> + Symbol *real = addUndefined(Saver.save("__real_" + name));
> + Symbol *wrap = addUndefined(Saver.save("__wrap_" + name));
> + v.push_back({sym, real, wrap});
>
> // We want to tell LTO not to inline symbols to be overwritten
> // because LTO doesn't know the final symbol contents after
> renaming.
> - Real->CanInline = false;
> - Sym->CanInline = false;
> + real->canInline = false;
> + sym->canInline = false;
>
> // Tell LTO not to eliminate these symbols.
> - Sym->IsUsedInRegularObj = true;
> - Wrap->IsUsedInRegularObj = true;
> + sym->isUsedInRegularObj = true;
> + wrap->isUsedInRegularObj = true;
> }
> - return V;
> + return v;
> }
>
> // Do renaming for -wrap by updating pointers to symbols.
> @@ -1600,24 +1600,24 @@ static std::vector<WrappedSymbol> addWra
> // When this function is executed, only InputFiles and symbol table
> // contain pointers to symbol objects. We visit them to replace
> pointers,
> // so that wrapped symbols are swapped as instructed by the command
> line.
> -static void wrapSymbols(ArrayRef<WrappedSymbol> Wrapped) {
> - DenseMap<Symbol *, Symbol *> Map;
> - for (const WrappedSymbol &W : Wrapped) {
> - Map[W.Sym] = W.Wrap;
> - Map[W.Real] = W.Sym;
> +static void wrapSymbols(ArrayRef<WrappedSymbol> wrapped) {
> + DenseMap<Symbol *, Symbol *> map;
> + for (const WrappedSymbol &w : wrapped) {
> + map[w.sym] = w.wrap;
> + map[w.real] = w.sym;
> }
>
> // Update pointers in input files.
> - parallelForEach(ObjectFiles, [&](InputFile *File) {
> - MutableArrayRef<Symbol *> Syms = File->getMutableSymbols();
> - for (size_t I = 0, E = Syms.size(); I != E; ++I)
> - if (Symbol *S = Map.lookup(Syms[I]))
> - Syms[I] = S;
> + parallelForEach(objectFiles, [&](InputFile *file) {
> + MutableArrayRef<Symbol *> syms = file->getMutableSymbols();
> + for (size_t i = 0, e = syms.size(); i != e; ++i)
> + if (Symbol *s = map.lookup(syms[i]))
> + syms[i] = s;
> });
>
> // Update pointers in the symbol table.
> - for (const WrappedSymbol &W : Wrapped)
> - Symtab->wrap(W.Sym, W.Real, W.Wrap);
> + for (const WrappedSymbol &w : wrapped)
> + symtab->wrap(w.sym, w.real, w.wrap);
> }
>
> // To enable CET (x86's hardware-assited control flow enforcement),
> each
> @@ -1633,30 +1633,30 @@ static void wrapSymbols(ArrayRef<Wrapped
> // Note that the CET-aware PLT is not implemented yet. We do error
> // check only.
> template <class ELFT> static uint32_t getAndFeatures() {
> - if (Config->EMachine != EM_386 && Config->EMachine != EM_X86_64 &&
> - Config->EMachine != EM_AARCH64)
> + if (config->emachine != EM_386 && config->emachine != EM_X86_64 &&
> + config->emachine != EM_AARCH64)
> return 0;
>
> - uint32_t Ret = -1;
> - for (InputFile *F : ObjectFiles) {
> - uint32_t Features = cast<ObjFile<ELFT>>(F)->AndFeatures;
> - if (Config->ForceBTI && !(Features &
> GNU_PROPERTY_AARCH64_FEATURE_1_BTI)) {
> - warn(toString(F) + ": --force-bti: file does not have BTI
> property");
> - Features |= GNU_PROPERTY_AARCH64_FEATURE_1_BTI;
> - } else if (!Features && Config->RequireCET)
> - error(toString(F) + ": --require-cet: file is not compatible
> with CET");
> - Ret &= Features;
> + uint32_t ret = -1;
> + for (InputFile *f : objectFiles) {
> + uint32_t features = cast<ObjFile<ELFT>>(f)->andFeatures;
> + if (config->forceBTI && !(features &
> GNU_PROPERTY_AARCH64_FEATURE_1_BTI)) {
> + warn(toString(f) + ": --force-bti: file does not have BTI
> property");
> + features |= GNU_PROPERTY_AARCH64_FEATURE_1_BTI;
> + } else if (!features && config->requireCET)
> + error(toString(f) + ": --require-cet: file is not compatible
> with CET");
> + ret &= features;
> }
>
> // Force enable pointer authentication Plt, we don't warn in this
> case as
> // this does not require support in the object for correctness.
> - if (Config->PacPlt)
> - Ret |= GNU_PROPERTY_AARCH64_FEATURE_1_PAC;
> + if (config->pacPlt)
> + ret |= GNU_PROPERTY_AARCH64_FEATURE_1_PAC;
>
> - return Ret;
> + return ret;
> }
>
> -static const char *LibcallRoutineNames[] = {
> +static const char *libcallRoutineNames[] = {
> #define HANDLE_LIBCALL(code, name) name,
> #include "llvm/IR/RuntimeLibcalls.def"
> #undef HANDLE_LIBCALL
> @@ -1664,48 +1664,48 @@ static const char *LibcallRoutineNames[]
>
> // Do actual linking. Note that when this function is called,
> // all linker scripts have already been parsed.
> -template <class ELFT> void LinkerDriver::link(opt::InputArgList
> &Args) {
> +template <class ELFT> void LinkerDriver::link(opt::InputArgList
> &args) {
> // If a -hash-style option was not given, set to a default value,
> // which varies depending on the target.
> - if (!Args.hasArg(OPT_hash_style)) {
> - if (Config->EMachine == EM_MIPS)
> - Config->SysvHash = true;
> + if (!args.hasArg(OPT_hash_style)) {
> + if (config->emachine == EM_MIPS)
> + config->sysvHash = true;
> else
> - Config->SysvHash = Config->GnuHash = true;
> + config->sysvHash = config->gnuHash = true;
> }
>
> // Default output filename is "a.out" by the Unix tradition.
> - if (Config->OutputFile.empty())
> - Config->OutputFile = "a.out";
> + if (config->outputFile.empty())
> + config->outputFile = "a.out";
>
> // Fail early if the output file or map file is not writable. If a
> user has a
> // long link, e.g. due to a large LTO link, they do not wish to run
> it and
> // find that it failed because there was a mistake in their
> command-line.
> - if (auto E = tryCreateFile(Config->OutputFile))
> - error("cannot open output file " + Config->OutputFile + ": " +
> E.message());
> - if (auto E = tryCreateFile(Config->MapFile))
> - error("cannot open map file " + Config->MapFile + ": " +
> E.message());
> + if (auto e = tryCreateFile(config->outputFile))
> + error("cannot open output file " + config->outputFile + ": " +
> e.message());
> + if (auto e = tryCreateFile(config->mapFile))
> + error("cannot open map file " + config->mapFile + ": " +
> e.message());
> if (errorCount())
> return;
>
> // Use default entry point name if no name was given via the command
> // line nor linker scripts. For some reason, MIPS entry point name
> is
> // different from others.
> - Config->WarnMissingEntry =
> - (!Config->Entry.empty() || (!Config->Shared &&
> !Config->Relocatable));
> - if (Config->Entry.empty() && !Config->Relocatable)
> - Config->Entry = (Config->EMachine == EM_MIPS) ? "__start" :
> "_start";
> + config->warnMissingEntry =
> + (!config->entry.empty() || (!config->shared &&
> !config->relocatable));
> + if (config->entry.empty() && !config->relocatable)
> + config->entry = (config->emachine == EM_MIPS) ? "__start" :
> "_start";
>
> // Handle --trace-symbol.
> - for (auto *Arg : Args.filtered(OPT_trace_symbol))
> - Symtab->insert(Arg->getValue())->Traced = true;
> + for (auto *arg : args.filtered(OPT_trace_symbol))
> + symtab->insert(arg->getValue())->traced = true;
>
> // Add all files to the symbol table. This will add almost all
> // symbols that we need to the symbol table. This process might
> // add files to the link, via autolinking, these files are always
> // appended to the Files vector.
> - for (size_t I = 0; I < Files.size(); ++I)
> - parseFile(Files[I]);
> + for (size_t i = 0; i < files.size(); ++i)
> + parseFile(files[i]);
>
> // Now that we have every file, we can decide if we will need a
> // dynamic symbol table.
> @@ -1713,26 +1713,26 @@ template <class ELFT> void LinkerDriver:
> // producing a shared library.
> // We also need one if any shared libraries are used and for pie
> executables
> // (probably because the dynamic linker needs it).
> - Config->HasDynSymTab =
> - !SharedFiles.empty() || Config->Pic || Config->ExportDynamic;
> + config->hasDynSymTab =
> + !sharedFiles.empty() || config->isPic || config->exportDynamic;
>
> // Some symbols (such as __ehdr_start) are defined lazily only when
> there
> // are undefined symbols for them, so we add these to trigger that
> logic.
> - for (StringRef Name : Script->ReferencedSymbols)
> - addUndefined(Name);
> + for (StringRef name : script->referencedSymbols)
> + addUndefined(name);
>
> // Handle the `--undefined <sym>` options.
> - for (StringRef Arg : Config->Undefined)
> - if (Symbol *Sym = Symtab->find(Arg))
> - handleUndefined(Sym);
> + for (StringRef arg : config->undefined)
> + if (Symbol *sym = symtab->find(arg))
> + handleUndefined(sym);
>
> // If an entry symbol is in a static archive, pull out that file
> now.
> - if (Symbol *Sym = Symtab->find(Config->Entry))
> - handleUndefined(Sym);
> + if (Symbol *sym = symtab->find(config->entry))
> + handleUndefined(sym);
>
> // Handle the `--undefined-glob <pattern>` options.
> - for (StringRef Pat : args::getStrings(Args, OPT_undefined_glob))
> - handleUndefinedGlob(Pat);
> + for (StringRef pat : args::getStrings(args, OPT_undefined_glob))
> + handleUndefinedGlob(pat);
>
> // If any of our inputs are bitcode files, the LTO code generator
> may create
> // references to certain library functions that might not be
> explicit in the
> @@ -1751,9 +1751,9 @@ template <class ELFT> void LinkerDriver:
> // to, i.e. if the symbol's definition is in bitcode. Any other
> required
> // libcall symbols will be added to the link after LTO when we add
> the LTO
> // object file to the link.
> - if (!BitcodeFiles.empty())
> - for (const char *S : LibcallRoutineNames)
> - handleLibcall(S);
> + if (!bitcodeFiles.empty())
> + for (const char *s : libcallRoutineNames)
> + handleLibcall(s);
>
> // Return if there were name resolution errors.
> if (errorCount())
> @@ -1761,27 +1761,27 @@ template <class ELFT> void LinkerDriver:
>
> // Now when we read all script files, we want to finalize order of
> linker
> // script commands, which can be not yet final because of INSERT
> commands.
> - Script->processInsertCommands();
> + script->processInsertCommands();
>
> // We want to declare linker script's symbols early,
> // so that we can version them.
> // They also might be exported if referenced by DSOs.
> - Script->declareSymbols();
> + script->declareSymbols();
>
> // Handle the -exclude-libs option.
> - if (Args.hasArg(OPT_exclude_libs))
> - excludeLibs(Args);
> + if (args.hasArg(OPT_exclude_libs))
> + excludeLibs(args);
>
> // Create ElfHeader early. We need a dummy section in
> // addReservedSymbols to mark the created symbols as not absolute.
> - Out::ElfHeader = make<OutputSection>("", 0, SHF_ALLOC);
> - Out::ElfHeader->Size = sizeof(typename ELFT::Ehdr);
> + Out::elfHeader = make<OutputSection>("", 0, SHF_ALLOC);
> + Out::elfHeader->size = sizeof(typename ELFT::Ehdr);
>
> // Create wrapped symbols for -wrap option.
> - std::vector<WrappedSymbol> Wrapped = addWrappedSymbols(Args);
> + std::vector<WrappedSymbol> wrapped = addWrappedSymbols(args);
>
> // We need to create some reserved symbols such as _end. Create
> them.
> - if (!Config->Relocatable)
> + if (!config->relocatable)
> addReservedSymbols();
>
> // Apply version scripts.
> @@ -1789,8 +1789,8 @@ template <class ELFT> void LinkerDriver:
> // For a relocatable output, version scripts don't make sense, and
> // parsing a symbol version string (e.g. dropping "@ver1" from a
> symbol
> // name "foo at ver1") rather do harm, so we don't call this if -r is
> given.
> - if (!Config->Relocatable)
> - Symtab->scanVersionScript();
> + if (!config->relocatable)
> + symtab->scanVersionScript();
>
> // Do link-time optimization if given files are LLVM bitcode files.
> // This compiles bitcode files into real object files.
> @@ -1804,83 +1804,83 @@ template <class ELFT> void LinkerDriver:
> // If -thinlto-index-only is given, we should create only "index
> // files" and not object files. Index file creation is already done
> // in addCombinedLTOObject, so we are done if that's the case.
> - if (Config->ThinLTOIndexOnly)
> + if (config->thinLTOIndexOnly)
> return;
>
> // Likewise, --plugin-opt=emit-llvm is an option to make LTO create
> // an output file in bitcode and exit, so that you can just get a
> // combined bitcode file.
> - if (Config->EmitLLVM)
> + if (config->emitLLVM)
> return;
>
> // Apply symbol renames for -wrap.
> - if (!Wrapped.empty())
> - wrapSymbols(Wrapped);
> + if (!wrapped.empty())
> + wrapSymbols(wrapped);
>
> // Now that we have a complete list of input files.
> // Beyond this point, no new files are added.
> // Aggregate all input sections into one place.
> - for (InputFile *F : ObjectFiles)
> - for (InputSectionBase *S : F->getSections())
> - if (S && S != &InputSection::Discarded)
> - InputSections.push_back(S);
> - for (BinaryFile *F : BinaryFiles)
> - for (InputSectionBase *S : F->getSections())
> - InputSections.push_back(cast<InputSection>(S));
> -
> - llvm::erase_if(InputSections, [](InputSectionBase *S) {
> - if (S->Type == SHT_LLVM_SYMPART) {
> - readSymbolPartitionSection<ELFT>(S);
> + for (InputFile *f : objectFiles)
> + for (InputSectionBase *s : f->getSections())
> + if (s && s != &InputSection::discarded)
> + inputSections.push_back(s);
> + for (BinaryFile *f : binaryFiles)
> + for (InputSectionBase *s : f->getSections())
> + inputSections.push_back(cast<InputSection>(s));
> +
> + llvm::erase_if(inputSections, [](InputSectionBase *s) {
> + if (s->type == SHT_LLVM_SYMPART) {
> + readSymbolPartitionSection<ELFT>(s);
> return true;
> }
>
> // We do not want to emit debug sections if --strip-all
> // or -strip-debug are given.
> - return Config->Strip != StripPolicy::None &&
> - (S->Name.startswith(".debug") ||
> S->Name.startswith(".zdebug"));
> + return config->strip != StripPolicy::None &&
> + (s->name.startswith(".debug") ||
> s->name.startswith(".zdebug"));
> });
>
> // Now that the number of partitions is fixed, save a pointer to
> the main
> // partition.
> - Main = &Partitions[0];
> + mainPart = &partitions[0];
>
> // Read .note.gnu.property sections from input object files which
> // contain a hint to tweak linker's and loader's behaviors.
> - Config->AndFeatures = getAndFeatures<ELFT>();
> + config->andFeatures = getAndFeatures<ELFT>();
>
> // The Target instance handles target-specific stuff, such as
> applying
> // relocations or writing a PLT section. It also contains
> target-dependent
> // values such as a default image base address.
> - Target = getTarget();
> + target = getTarget();
>
> - Config->EFlags = Target->calcEFlags();
> + config->eflags = target->calcEFlags();
> // MaxPageSize (sometimes called abi page size) is the maximum page
> size that
> // the output can be run on. For example if the OS can use 4k or
> 64k page
> // sizes then MaxPageSize must be 64 for the output to be useable
> on both.
> // All important alignment decisions must use this value.
> - Config->MaxPageSize = getMaxPageSize(Args);
> + config->maxPageSize = getMaxPageSize(args);
> // CommonPageSize is the most common page size that the output will
> be run on.
> // For example if an OS can use 4k or 64k page sizes and 4k is more
> common
> // than 64k then CommonPageSize is set to 4k. CommonPageSize can be
> used for
> // optimizations such as DATA_SEGMENT_ALIGN in linker scripts.
> LLD's use of it
> // is limited to writing trap instructions on the last executable
> segment.
> - Config->CommonPageSize = getCommonPageSize(Args);
> + config->commonPageSize = getCommonPageSize(args);
>
> - Config->ImageBase = getImageBase(Args);
> + config->imageBase = getImageBase(args);
>
> - if (Config->EMachine == EM_ARM) {
> + if (config->emachine == EM_ARM) {
> // FIXME: These warnings can be removed when lld only uses these
> features
> // when the input objects have been compiled with an architecture
> that
> // supports them.
> - if (Config->ARMHasBlx == false)
> + if (config->armHasBlx == false)
> warn("lld uses blx instruction, no object with architecture
> supporting "
> "feature detected");
> }
>
> // This adds a .comment section containing a version string. We
> have to add it
> // before mergeSections because the .comment section is a mergeable
> section.
> - if (!Config->Relocatable)
> - InputSections.push_back(createCommentSection());
> + if (!config->relocatable)
> + inputSections.push_back(createCommentSection());
>
> // Replace common symbols with regular symbols.
> replaceCommonSymbols();
> @@ -1891,16 +1891,16 @@ template <class ELFT> void LinkerDriver:
> markLive<ELFT>();
> demoteSharedSymbols();
> mergeSections();
> - if (Config->ICF != ICFLevel::None) {
> - findKeepUniqueSections<ELFT>(Args);
> + if (config->icf != ICFLevel::None) {
> + findKeepUniqueSections<ELFT>(args);
> doIcf<ELFT>();
> }
>
> // Read the callgraph now that we know what was gced or icfed
> - if (Config->CallGraphProfileSort) {
> - if (auto *Arg = Args.getLastArg(OPT_call_graph_ordering_file))
> - if (Optional<MemoryBufferRef> Buffer =
> readFile(Arg->getValue()))
> - readCallGraph(*Buffer);
> + if (config->callGraphProfileSort) {
> + if (auto *arg = args.getLastArg(OPT_call_graph_ordering_file))
> + if (Optional<MemoryBufferRef> buffer =
> readFile(arg->getValue()))
> + readCallGraph(*buffer);
> readCallGraphsFromObjectFiles<ELFT>();
> }
>
>
> Modified: lld/trunk/ELF/Driver.h
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_Driver.h-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=RXrjISEjbookXEDBy-41jCLzxsvs6zHub7bqtTnT4T4&e=
>
> ==============================================================================
> --- lld/trunk/ELF/Driver.h (original)
> +++ lld/trunk/ELF/Driver.h Tue Jul 9 22:00:37 2019
> @@ -22,37 +22,37 @@
> namespace lld {
> namespace elf {
>
> -extern class LinkerDriver *Driver;
> +extern class LinkerDriver *driver;
>
> class LinkerDriver {
> public:
> - void main(ArrayRef<const char *> Args);
> - void addFile(StringRef Path, bool WithLOption);
> - void addLibrary(StringRef Name);
> + void main(ArrayRef<const char *> args);
> + void addFile(StringRef path, bool withLOption);
> + void addLibrary(StringRef name);
>
> private:
> - void createFiles(llvm::opt::InputArgList &Args);
> + void createFiles(llvm::opt::InputArgList &args);
> void inferMachineType();
> - template <class ELFT> void link(llvm::opt::InputArgList &Args);
> + template <class ELFT> void link(llvm::opt::InputArgList &args);
> template <class ELFT> void compileBitcodeFiles();
>
> // True if we are in --whole-archive and --no-whole-archive.
> - bool InWholeArchive = false;
> + bool inWholeArchive = false;
>
> // True if we are in --start-lib and --end-lib.
> - bool InLib = false;
> + bool inLib = false;
>
> // For LTO.
> - std::unique_ptr<BitcodeCompiler> LTO;
> + std::unique_ptr<BitcodeCompiler> lto;
>
> - std::vector<InputFile *> Files;
> + std::vector<InputFile *> files;
> };
>
> // Parses command line options.
> class ELFOptTable : public llvm::opt::OptTable {
> public:
> ELFOptTable();
> - llvm::opt::InputArgList parse(ArrayRef<const char *> Argv);
> + llvm::opt::InputArgList parse(ArrayRef<const char *> argv);
> };
>
> // Create enum with OPT_xxx values for each option in Options.td
> @@ -64,12 +64,12 @@ enum {
> };
>
> void printHelp();
> -std::string createResponseFile(const llvm::opt::InputArgList &Args);
> +std::string createResponseFile(const llvm::opt::InputArgList &args);
>
> -llvm::Optional<std::string> findFromSearchPaths(StringRef Path);
> -llvm::Optional<std::string> searchScript(StringRef Path);
> -llvm::Optional<std::string> searchLibraryBaseName(StringRef Path);
> -llvm::Optional<std::string> searchLibrary(StringRef Path);
> +llvm::Optional<std::string> findFromSearchPaths(StringRef path);
> +llvm::Optional<std::string> searchScript(StringRef path);
> +llvm::Optional<std::string> searchLibraryBaseName(StringRef path);
> +llvm::Optional<std::string> searchLibrary(StringRef path);
>
> } // namespace elf
> } // namespace lld
>
> Modified: lld/trunk/ELF/DriverUtils.cpp
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_DriverUtils.cpp-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=K6kanVOY89mNNSdtO10a0wHsh5m5K33hBtDNKIYMC-M&e=
>
> ==============================================================================
> --- lld/trunk/ELF/DriverUtils.cpp (original)
> +++ lld/trunk/ELF/DriverUtils.cpp Tue Jul 9 22:00:37 2019
> @@ -41,7 +41,7 @@ using namespace lld::elf;
> #undef PREFIX
>
> // Create table mapping all options defined in Options.td
> -static const opt::OptTable::Info OptInfo[] = {
> +static const opt::OptTable::Info optInfo[] = {
> #define OPTION(X1, X2, ID, KIND, GROUP, ALIAS, X7, X8, X9, X10, X11,
> X12) \
> {X1, X2, X10, X11, OPT_##ID,
> opt::Option::KIND##Class, \
> X9, X8, OPT_##GROUP, OPT_##ALIAS, X7, X12},
> @@ -49,36 +49,36 @@ static const opt::OptTable::Info OptInfo
> #undef OPTION
> };
>
> -ELFOptTable::ELFOptTable() : OptTable(OptInfo) {}
> +ELFOptTable::ELFOptTable() : OptTable(optInfo) {}
>
> // Set color diagnostics according to
> -color-diagnostics={auto,always,never}
> // or -no-color-diagnostics flags.
> -static void handleColorDiagnostics(opt::InputArgList &Args) {
> - auto *Arg = Args.getLastArg(OPT_color_diagnostics,
> OPT_color_diagnostics_eq,
> +static void handleColorDiagnostics(opt::InputArgList &args) {
> + auto *arg = args.getLastArg(OPT_color_diagnostics,
> OPT_color_diagnostics_eq,
> OPT_no_color_diagnostics);
> - if (!Arg)
> + if (!arg)
> return;
> - if (Arg->getOption().getID() == OPT_color_diagnostics) {
> + if (arg->getOption().getID() == OPT_color_diagnostics) {
> errorHandler().ColorDiagnostics = true;
> - } else if (Arg->getOption().getID() == OPT_no_color_diagnostics) {
> + } else if (arg->getOption().getID() == OPT_no_color_diagnostics) {
> errorHandler().ColorDiagnostics = false;
> } else {
> - StringRef S = Arg->getValue();
> - if (S == "always")
> + StringRef s = arg->getValue();
> + if (s == "always")
> errorHandler().ColorDiagnostics = true;
> - else if (S == "never")
> + else if (s == "never")
> errorHandler().ColorDiagnostics = false;
> - else if (S != "auto")
> - error("unknown option: --color-diagnostics=" + S);
> + else if (s != "auto")
> + error("unknown option: --color-diagnostics=" + s);
> }
> }
>
> -static cl::TokenizerCallback getQuotingStyle(opt::InputArgList &Args)
> {
> - if (auto *Arg = Args.getLastArg(OPT_rsp_quoting)) {
> - StringRef S = Arg->getValue();
> - if (S != "windows" && S != "posix")
> - error("invalid response file quoting: " + S);
> - if (S == "windows")
> +static cl::TokenizerCallback getQuotingStyle(opt::InputArgList &args)
> {
> + if (auto *arg = args.getLastArg(OPT_rsp_quoting)) {
> + StringRef s = arg->getValue();
> + if (s != "windows" && s != "posix")
> + error("invalid response file quoting: " + s);
> + if (s == "windows")
> return cl::TokenizeWindowsCommandLine;
> return cl::TokenizeGNUCommandLine;
> }
> @@ -96,56 +96,56 @@ static cl::TokenizerCallback getQuotingS
> // `--plugin-opt <foo>` is converted to `--plugin-opt=<foo>`. This is
> a
> // bit hacky, but looks like it is still better than handling
> --plugin-opt
> // options by hand.
> -static void concatLTOPluginOptions(SmallVectorImpl<const char *>
> &Args) {
> - SmallVector<const char *, 256> V;
> - for (size_t I = 0, E = Args.size(); I != E; ++I) {
> - StringRef S = Args[I];
> - if ((S == "-plugin-opt" || S == "--plugin-opt") && I + 1 != E) {
> - V.push_back(Saver.save(S + "=" + Args[I + 1]).data());
> - ++I;
> +static void concatLTOPluginOptions(SmallVectorImpl<const char *>
> &args) {
> + SmallVector<const char *, 256> v;
> + for (size_t i = 0, e = args.size(); i != e; ++i) {
> + StringRef s = args[i];
> + if ((s == "-plugin-opt" || s == "--plugin-opt") && i + 1 != e) {
> + v.push_back(Saver.save(s + "=" + args[i + 1]).data());
> + ++i;
> } else {
> - V.push_back(Args[I]);
> + v.push_back(args[i]);
> }
> }
> - Args = std::move(V);
> + args = std::move(v);
> }
>
> // Parses a given list of options.
> -opt::InputArgList ELFOptTable::parse(ArrayRef<const char *> Argv) {
> +opt::InputArgList ELFOptTable::parse(ArrayRef<const char *> argv) {
> // Make InputArgList from string vectors.
> - unsigned MissingIndex;
> - unsigned MissingCount;
> - SmallVector<const char *, 256> Vec(Argv.data(), Argv.data() +
> Argv.size());
> + unsigned missingIndex;
> + unsigned missingCount;
> + SmallVector<const char *, 256> vec(argv.data(), argv.data() +
> argv.size());
>
> // We need to get the quoting style for response files before
> parsing all
> // options so we parse here before and ignore all the options but
> // --rsp-quoting.
> - opt::InputArgList Args = this->ParseArgs(Vec, MissingIndex,
> MissingCount);
> + opt::InputArgList args = this->ParseArgs(vec, missingIndex,
> missingCount);
>
> // Expand response files (arguments in the form of @<filename>)
> // and then parse the argument again.
> - cl::ExpandResponseFiles(Saver, getQuotingStyle(Args), Vec);
> - concatLTOPluginOptions(Vec);
> - Args = this->ParseArgs(Vec, MissingIndex, MissingCount);
> -
> - handleColorDiagnostics(Args);
> - if (MissingCount)
> - error(Twine(Args.getArgString(MissingIndex)) + ": missing
> argument");
> -
> - for (auto *Arg : Args.filtered(OPT_UNKNOWN)) {
> - std::string Nearest;
> - if (findNearest(Arg->getAsString(Args), Nearest) > 1)
> - error("unknown argument '" + Arg->getAsString(Args) + "'");
> + cl::ExpandResponseFiles(Saver, getQuotingStyle(args), vec);
> + concatLTOPluginOptions(vec);
> + args = this->ParseArgs(vec, missingIndex, missingCount);
> +
> + handleColorDiagnostics(args);
> + if (missingCount)
> + error(Twine(args.getArgString(missingIndex)) + ": missing
> argument");
> +
> + for (auto *arg : args.filtered(OPT_UNKNOWN)) {
> + std::string nearest;
> + if (findNearest(arg->getAsString(args), nearest) > 1)
> + error("unknown argument '" + arg->getAsString(args) + "'");
> else
> - error("unknown argument '" + Arg->getAsString(Args) +
> - "', did you mean '" + Nearest + "'");
> + error("unknown argument '" + arg->getAsString(args) +
> + "', did you mean '" + nearest + "'");
> }
> - return Args;
> + return args;
> }
>
> void elf::printHelp() {
> ELFOptTable().PrintHelp(
> - outs(), (Config->ProgName + " [options]
> file...").str().c_str(), "lld",
> + outs(), (config->progName + " [options]
> file...").str().c_str(), "lld",
> false /*ShowHidden*/, true /*ShowAllAliases*/);
> outs() << "\n";
>
> @@ -154,36 +154,36 @@ void elf::printHelp() {
> // in a message for the -help option. If it doesn't match, the
> scripts
> // assume that the linker doesn't support very basic features such
> as
> // shared libraries. Therefore, we need to print out at least "elf".
> - outs() << Config->ProgName << ": supported targets: elf\n";
> + outs() << config->progName << ": supported targets: elf\n";
> }
>
> -static std::string rewritePath(StringRef S) {
> - if (fs::exists(S))
> - return relativeToRoot(S);
> - return S;
> +static std::string rewritePath(StringRef s) {
> + if (fs::exists(s))
> + return relativeToRoot(s);
> + return s;
> }
>
> // Reconstructs command line arguments so that so that you can re-run
> // the same command with the same inputs. This is for --reproduce.
> -std::string elf::createResponseFile(const opt::InputArgList &Args) {
> - SmallString<0> Data;
> - raw_svector_ostream OS(Data);
> - OS << "--chroot .\n";
> +std::string elf::createResponseFile(const opt::InputArgList &args) {
> + SmallString<0> data;
> + raw_svector_ostream os(data);
> + os << "--chroot .\n";
>
> // Copy the command line to the output while rewriting paths.
> - for (auto *Arg : Args) {
> - switch (Arg->getOption().getID()) {
> + for (auto *arg : args) {
> + switch (arg->getOption().getID()) {
> case OPT_reproduce:
> break;
> case OPT_INPUT:
> - OS << quote(rewritePath(Arg->getValue())) << "\n";
> + os << quote(rewritePath(arg->getValue())) << "\n";
> break;
> case OPT_o:
> // If -o path contains directories, "lld @response.txt" will
> likely
> // fail because the archive we are creating doesn't contain
> empty
> // directories for the output path (-o doesn't create
> directories).
> // Strip directories to prevent the issue.
> - OS << "-o " << quote(sys::path::filename(Arg->getValue())) <<
> "\n";
> + os << "-o " << quote(sys::path::filename(arg->getValue())) <<
> "\n";
> break;
> case OPT_dynamic_list:
> case OPT_library_path:
> @@ -192,62 +192,62 @@ std::string elf::createResponseFile(cons
> case OPT_symbol_ordering_file:
> case OPT_sysroot:
> case OPT_version_script:
> - OS << Arg->getSpelling() << " " <<
> quote(rewritePath(Arg->getValue()))
> + os << arg->getSpelling() << " " <<
> quote(rewritePath(arg->getValue()))
> << "\n";
> break;
> default:
> - OS << toString(*Arg) << "\n";
> + os << toString(*arg) << "\n";
> }
> }
> - return Data.str();
> + return data.str();
> }
>
> // Find a file by concatenating given paths. If a resulting path
> // starts with "=", the character is replaced with a --sysroot value.
> -static Optional<std::string> findFile(StringRef Path1, const Twine
> &Path2) {
> - SmallString<128> S;
> - if (Path1.startswith("="))
> - path::append(S, Config->Sysroot, Path1.substr(1), Path2);
> +static Optional<std::string> findFile(StringRef path1, const Twine
> &path2) {
> + SmallString<128> s;
> + if (path1.startswith("="))
> + path::append(s, config->sysroot, path1.substr(1), path2);
> else
> - path::append(S, Path1, Path2);
> + path::append(s, path1, path2);
>
> - if (fs::exists(S))
> - return S.str().str();
> + if (fs::exists(s))
> + return s.str().str();
> return None;
> }
>
> -Optional<std::string> elf::findFromSearchPaths(StringRef Path) {
> - for (StringRef Dir : Config->SearchPaths)
> - if (Optional<std::string> S = findFile(Dir, Path))
> - return S;
> +Optional<std::string> elf::findFromSearchPaths(StringRef path) {
> + for (StringRef dir : config->searchPaths)
> + if (Optional<std::string> s = findFile(dir, path))
> + return s;
> return None;
> }
>
> // This is for -l<basename>. We'll look for lib<basename>.so or
> lib<basename>.a from
> // search paths.
> -Optional<std::string> elf::searchLibraryBaseName(StringRef Name) {
> - for (StringRef Dir : Config->SearchPaths) {
> - if (!Config->Static)
> - if (Optional<std::string> S = findFile(Dir, "lib" + Name +
> ".so"))
> - return S;
> - if (Optional<std::string> S = findFile(Dir, "lib" + Name + ".a"))
> - return S;
> +Optional<std::string> elf::searchLibraryBaseName(StringRef name) {
> + for (StringRef dir : config->searchPaths) {
> + if (!config->isStatic)
> + if (Optional<std::string> s = findFile(dir, "lib" + name +
> ".so"))
> + return s;
> + if (Optional<std::string> s = findFile(dir, "lib" + name + ".a"))
> + return s;
> }
> return None;
> }
>
> // This is for -l<namespec>.
> -Optional<std::string> elf::searchLibrary(StringRef Name) {
> - if (Name.startswith(":"))
> - return findFromSearchPaths(Name.substr(1));
> - return searchLibraryBaseName (Name);
> +Optional<std::string> elf::searchLibrary(StringRef name) {
> + if (name.startswith(":"))
> + return findFromSearchPaths(name.substr(1));
> + return searchLibraryBaseName (name);
> }
>
> // If a linker/version script doesn't exist in the current directory,
> we also
> // look for the script in the '-L' search paths. This matches the
> behaviour of
> // '-T', --version-script=, and linker script INPUT() command in
> ld.bfd.
> -Optional<std::string> elf::searchScript(StringRef Name) {
> - if (fs::exists(Name))
> - return Name.str();
> - return findFromSearchPaths(Name);
> +Optional<std::string> elf::searchScript(StringRef name) {
> + if (fs::exists(name))
> + return name.str();
> + return findFromSearchPaths(name);
> }
>
> Modified: lld/trunk/ELF/EhFrame.cpp
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_EhFrame.cpp-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=tu1Izf7mytTMTFPsGwmIk_IewcMS9WESLFOMMDaYtmM&e=
>
> ==============================================================================
> --- lld/trunk/ELF/EhFrame.cpp (original)
> +++ lld/trunk/ELF/EhFrame.cpp Tue Jul 9 22:00:37 2019
> @@ -36,72 +36,72 @@ using namespace lld::elf;
> namespace {
> class EhReader {
> public:
> - EhReader(InputSectionBase *S, ArrayRef<uint8_t> D) : IS(S), D(D) {}
> + EhReader(InputSectionBase *s, ArrayRef<uint8_t> d) : isec(s), d(d)
> {}
> size_t readEhRecordSize();
> uint8_t getFdeEncoding();
>
> private:
> - template <class P> void failOn(const P *Loc, const Twine &Msg) {
> - fatal("corrupted .eh_frame: " + Msg + "\n>>> defined in " +
> - IS->getObjMsg((const uint8_t *)Loc - IS->data().data()));
> + template <class P> void failOn(const P *loc, const Twine &msg) {
> + fatal("corrupted .eh_frame: " + msg + "\n>>> defined in " +
> + isec->getObjMsg((const uint8_t *)loc -
> isec->data().data()));
> }
>
> uint8_t readByte();
> - void skipBytes(size_t Count);
> + void skipBytes(size_t count);
> StringRef readString();
> void skipLeb128();
> void skipAugP();
>
> - InputSectionBase *IS;
> - ArrayRef<uint8_t> D;
> + InputSectionBase *isec;
> + ArrayRef<uint8_t> d;
> };
> }
>
> -size_t elf::readEhRecordSize(InputSectionBase *S, size_t Off) {
> - return EhReader(S, S->data().slice(Off)).readEhRecordSize();
> +size_t elf::readEhRecordSize(InputSectionBase *s, size_t off) {
> + return EhReader(s, s->data().slice(off)).readEhRecordSize();
> }
>
> // .eh_frame section is a sequence of records. Each record starts with
> // a 4 byte length field. This function reads the length.
> size_t EhReader::readEhRecordSize() {
> - if (D.size() < 4)
> - failOn(D.data(), "CIE/FDE too small");
> + if (d.size() < 4)
> + failOn(d.data(), "CIE/FDE too small");
>
> // First 4 bytes of CIE/FDE is the size of the record.
> // If it is 0xFFFFFFFF, the next 8 bytes contain the size instead,
> // but we do not support that format yet.
> - uint64_t V = read32(D.data());
> - if (V == UINT32_MAX)
> - failOn(D.data(), "CIE/FDE too large");
> - uint64_t Size = V + 4;
> - if (Size > D.size())
> - failOn(D.data(), "CIE/FDE ends past the end of the section");
> - return Size;
> + uint64_t v = read32(d.data());
> + if (v == UINT32_MAX)
> + failOn(d.data(), "CIE/FDE too large");
> + uint64_t size = v + 4;
> + if (size > d.size())
> + failOn(d.data(), "CIE/FDE ends past the end of the section");
> + return size;
> }
>
> // Read a byte and advance D by one byte.
> uint8_t EhReader::readByte() {
> - if (D.empty())
> - failOn(D.data(), "unexpected end of CIE");
> - uint8_t B = D.front();
> - D = D.slice(1);
> - return B;
> + if (d.empty())
> + failOn(d.data(), "unexpected end of CIE");
> + uint8_t b = d.front();
> + d = d.slice(1);
> + return b;
> }
>
> -void EhReader::skipBytes(size_t Count) {
> - if (D.size() < Count)
> - failOn(D.data(), "CIE is too small");
> - D = D.slice(Count);
> +void EhReader::skipBytes(size_t count) {
> + if (d.size() < count)
> + failOn(d.data(), "CIE is too small");
> + d = d.slice(count);
> }
>
> // Read a null-terminated string.
> StringRef EhReader::readString() {
> - const uint8_t *End = llvm::find(D, '\0');
> - if (End == D.end())
> - failOn(D.data(), "corrupted CIE (failed to read string)");
> - StringRef S = toStringRef(D.slice(0, End - D.begin()));
> - D = D.slice(S.size() + 1);
> - return S;
> + const uint8_t *end = llvm::find(d, '\0');
> + if (end == d.end())
> + failOn(d.data(), "corrupted CIE (failed to read string)");
> + StringRef s = toStringRef(d.slice(0, end - d.begin()));
> + d = d.slice(s.size() + 1);
> + return s;
> }
>
> // Skip an integer encoded in the LEB128 format.
> @@ -109,21 +109,21 @@ StringRef EhReader::readString() {
> // But we need to be at least able to skip it so that we can read
> // the field that follows a LEB128 number.
> void EhReader::skipLeb128() {
> - const uint8_t *ErrPos = D.data();
> - while (!D.empty()) {
> - uint8_t Val = D.front();
> - D = D.slice(1);
> - if ((Val & 0x80) == 0)
> + const uint8_t *errPos = d.data();
> + while (!d.empty()) {
> + uint8_t val = d.front();
> + d = d.slice(1);
> + if ((val & 0x80) == 0)
> return;
> }
> - failOn(ErrPos, "corrupted CIE (failed to read LEB128)");
> + failOn(errPos, "corrupted CIE (failed to read LEB128)");
> }
>
> -static size_t getAugPSize(unsigned Enc) {
> - switch (Enc & 0x0f) {
> +static size_t getAugPSize(unsigned enc) {
> + switch (enc & 0x0f) {
> case DW_EH_PE_absptr:
> case DW_EH_PE_signed:
> - return Config->Wordsize;
> + return config->wordsize;
> case DW_EH_PE_udata2:
> case DW_EH_PE_sdata2:
> return 2;
> @@ -138,29 +138,29 @@ static size_t getAugPSize(unsigned Enc)
> }
>
> void EhReader::skipAugP() {
> - uint8_t Enc = readByte();
> - if ((Enc & 0xf0) == DW_EH_PE_aligned)
> - failOn(D.data() - 1, "DW_EH_PE_aligned encoding is not
> supported");
> - size_t Size = getAugPSize(Enc);
> - if (Size == 0)
> - failOn(D.data() - 1, "unknown FDE encoding");
> - if (Size >= D.size())
> - failOn(D.data() - 1, "corrupted CIE");
> - D = D.slice(Size);
> + uint8_t enc = readByte();
> + if ((enc & 0xf0) == DW_EH_PE_aligned)
> + failOn(d.data() - 1, "DW_EH_PE_aligned encoding is not
> supported");
> + size_t size = getAugPSize(enc);
> + if (size == 0)
> + failOn(d.data() - 1, "unknown FDE encoding");
> + if (size >= d.size())
> + failOn(d.data() - 1, "corrupted CIE");
> + d = d.slice(size);
> }
>
> -uint8_t elf::getFdeEncoding(EhSectionPiece *P) {
> - return EhReader(P->Sec, P->data()).getFdeEncoding();
> +uint8_t elf::getFdeEncoding(EhSectionPiece *p) {
> + return EhReader(p->sec, p->data()).getFdeEncoding();
> }
>
> uint8_t EhReader::getFdeEncoding() {
> skipBytes(8);
> - int Version = readByte();
> - if (Version != 1 && Version != 3)
> - failOn(D.data() - 1,
> - "FDE version 1 or 3 expected, but got " + Twine(Version));
> + int version = readByte();
> + if (version != 1 && version != 3)
> + failOn(d.data() - 1,
> + "FDE version 1 or 3 expected, but got " + Twine(version));
>
> - StringRef Aug = readString();
> + StringRef aug = readString();
>
> // Skip code and data alignment factors.
> skipLeb128();
> @@ -168,7 +168,7 @@ uint8_t EhReader::getFdeEncoding() {
>
> // Skip the return address register. In CIE version 1 this is a
> single
> // byte. In CIE version 3 this is an unsigned LEB128.
> - if (Version == 1)
> + if (version == 1)
> readByte();
> else
> skipLeb128();
> @@ -176,22 +176,22 @@ uint8_t EhReader::getFdeEncoding() {
> // We only care about an 'R' value, but other records may precede
> an 'R'
> // record. Unfortunately records are not in TLV (type-length-value)
> format,
> // so we need to teach the linker how to skip records for each type.
> - for (char C : Aug) {
> - if (C == 'R')
> + for (char c : aug) {
> + if (c == 'R')
> return readByte();
> - if (C == 'z') {
> + if (c == 'z') {
> skipLeb128();
> continue;
> }
> - if (C == 'P') {
> + if (c == 'P') {
> skipAugP();
> continue;
> }
> - if (C == 'L') {
> + if (c == 'L') {
> readByte();
> continue;
> }
> - failOn(Aug.data(), "unknown .eh_frame augmentation string: " +
> Aug);
> + failOn(aug.data(), "unknown .eh_frame augmentation string: " +
> aug);
> }
> return DW_EH_PE_absptr;
> }
>
> Modified: lld/trunk/ELF/EhFrame.h
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_EhFrame.h-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=ikA4Ib5mN9J3VxvOLj2BhBgFcyFS7xJ7vkH6F5UsrNk&e=
>
> ==============================================================================
> --- lld/trunk/ELF/EhFrame.h (original)
> +++ lld/trunk/ELF/EhFrame.h Tue Jul 9 22:00:37 2019
> @@ -16,8 +16,8 @@ namespace elf {
> class InputSectionBase;
> struct EhSectionPiece;
>
> -size_t readEhRecordSize(InputSectionBase *S, size_t Off);
> -uint8_t getFdeEncoding(EhSectionPiece *P);
> +size_t readEhRecordSize(InputSectionBase *s, size_t off);
> +uint8_t getFdeEncoding(EhSectionPiece *p);
> } // namespace elf
> } // namespace lld
>
>
> Modified: lld/trunk/ELF/ICF.cpp
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_ICF.cpp-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=VdBTn61QFQBmmrVKz1lRruHyOGT-WqnBYOUr6Yr9vMY&e=
>
> ==============================================================================
> --- lld/trunk/ELF/ICF.cpp (original)
> +++ lld/trunk/ELF/ICF.cpp Tue Jul 9 22:00:37 2019
> @@ -98,33 +98,33 @@ public:
> void run();
>
> private:
> - void segregate(size_t Begin, size_t End, bool Constant);
> + void segregate(size_t begin, size_t end, bool constant);
>
> template <class RelTy>
> - bool constantEq(const InputSection *A, ArrayRef<RelTy> RelsA,
> - const InputSection *B, ArrayRef<RelTy> RelsB);
> + bool constantEq(const InputSection *a, ArrayRef<RelTy> relsA,
> + const InputSection *b, ArrayRef<RelTy> relsB);
>
> template <class RelTy>
> - bool variableEq(const InputSection *A, ArrayRef<RelTy> RelsA,
> - const InputSection *B, ArrayRef<RelTy> RelsB);
> + bool variableEq(const InputSection *a, ArrayRef<RelTy> relsA,
> + const InputSection *b, ArrayRef<RelTy> relsB);
>
> - bool equalsConstant(const InputSection *A, const InputSection *B);
> - bool equalsVariable(const InputSection *A, const InputSection *B);
> + bool equalsConstant(const InputSection *a, const InputSection *b);
> + bool equalsVariable(const InputSection *a, const InputSection *b);
>
> - size_t findBoundary(size_t Begin, size_t End);
> + size_t findBoundary(size_t begin, size_t end);
>
> - void forEachClassRange(size_t Begin, size_t End,
> - llvm::function_ref<void(size_t, size_t)> Fn);
> + void forEachClassRange(size_t begin, size_t end,
> + llvm::function_ref<void(size_t, size_t)> fn);
>
> - void forEachClass(llvm::function_ref<void(size_t, size_t)> Fn);
> + void forEachClass(llvm::function_ref<void(size_t, size_t)> fn);
>
> - std::vector<InputSection *> Sections;
> + std::vector<InputSection *> sections;
>
> // We repeat the main loop while `Repeat` is true.
> - std::atomic<bool> Repeat;
> + std::atomic<bool> repeat;
>
> // The main loop counter.
> - int Cnt = 0;
> + int cnt = 0;
>
> // We have two locations for equivalence classes. On the first
> iteration
> // of the main loop, Class[0] has a valid value, and Class[1]
> contains
> @@ -150,42 +150,42 @@ private:
> // because we can safely read the next class without worrying about
> race
> // conditions. Using the same location makes this algorithm converge
> // faster because it uses results of the same iteration earlier.
> - int Current = 0;
> - int Next = 0;
> + int current = 0;
> + int next = 0;
> };
> }
>
> // Returns true if section S is subject of ICF.
> -static bool isEligible(InputSection *S) {
> - if (!S->isLive() || S->KeepUnique || !(S->Flags & SHF_ALLOC))
> +static bool isEligible(InputSection *s) {
> + if (!s->isLive() || s->keepUnique || !(s->flags & SHF_ALLOC))
> return false;
>
> // Don't merge writable sections. .data.rel.ro sections are marked
> as writable
> // but are semantically read-only.
> - if ((S->Flags & SHF_WRITE) && S->Name != ".data.rel.ro" &&
> - !S->Name.startswith(".data.rel.ro."))
> + if ((s->flags & SHF_WRITE) && s->name != ".data.rel.ro" &&
> + !s->name.startswith(".data.rel.ro."))
> return false;
>
> // SHF_LINK_ORDER sections are ICF'd as a unit with their dependent
> sections,
> // so we don't consider them for ICF individually.
> - if (S->Flags & SHF_LINK_ORDER)
> + if (s->flags & SHF_LINK_ORDER)
> return false;
>
> // Don't merge synthetic sections as their Data member is not valid
> and empty.
> // The Data member needs to be valid for ICF as it is used by ICF
> to determine
> // the equality of section contents.
> - if (isa<SyntheticSection>(S))
> + if (isa<SyntheticSection>(s))
> return false;
>
> // .init and .fini contains instructions that must be executed to
> initialize
> // and finalize the process. They cannot and should not be merged.
> - if (S->Name == ".init" || S->Name == ".fini")
> + if (s->name == ".init" || s->name == ".fini")
> return false;
>
> // A user program may enumerate sections named with a C identifier
> using
> // __start_* and __stop_* symbols. We cannot ICF any such sections
> because
> // that could change program semantics.
> - if (isValidCIdentifier(S->Name))
> + if (isValidCIdentifier(s->name))
> return false;
>
> return true;
> @@ -193,7 +193,7 @@ static bool isEligible(InputSection *S)
>
> // Split an equivalence class into smaller classes.
> template <class ELFT>
> -void ICF<ELFT>::segregate(size_t Begin, size_t End, bool Constant) {
> +void ICF<ELFT>::segregate(size_t begin, size_t end, bool constant) {
> // This loop rearranges sections in [Begin, End) so that all
> sections
> // that are equal in terms of equals{Constant,Variable} are
> contiguous
> // in [Begin, End).
> @@ -202,93 +202,93 @@ void ICF<ELFT>::segregate(size_t Begin,
> // issue in practice because the number of the distinct sections in
> // each range is usually very small.
>
> - while (Begin < End) {
> + while (begin < end) {
> // Divide [Begin, End) into two. Let Mid be the start index of the
> // second group.
> - auto Bound =
> - std::stable_partition(Sections.begin() + Begin + 1,
> - Sections.begin() + End,
> [&](InputSection *S) {
> - if (Constant)
> - return
> equalsConstant(Sections[Begin], S);
> - return
> equalsVariable(Sections[Begin], S);
> + auto bound =
> + std::stable_partition(sections.begin() + begin + 1,
> + sections.begin() + end,
> [&](InputSection *s) {
> + if (constant)
> + return
> equalsConstant(sections[begin], s);
> + return
> equalsVariable(sections[begin], s);
> });
> - size_t Mid = Bound - Sections.begin();
> + size_t mid = bound - sections.begin();
>
> // Now we split [Begin, End) into [Begin, Mid) and [Mid, End) by
> // updating the sections in [Begin, Mid). We use Mid as an
> equivalence
> // class ID because every group ends with a unique index.
> - for (size_t I = Begin; I < Mid; ++I)
> - Sections[I]->Class[Next] = Mid;
> + for (size_t i = begin; i < mid; ++i)
> + sections[i]->eqClass[next] = mid;
>
> // If we created a group, we need to iterate the main loop again.
> - if (Mid != End)
> - Repeat = true;
> + if (mid != end)
> + repeat = true;
>
> - Begin = Mid;
> + begin = mid;
> }
> }
>
> // Compare two lists of relocations.
> template <class ELFT>
> template <class RelTy>
> -bool ICF<ELFT>::constantEq(const InputSection *SecA, ArrayRef<RelTy>
> RA,
> - const InputSection *SecB, ArrayRef<RelTy>
> RB) {
> - for (size_t I = 0; I < RA.size(); ++I) {
> - if (RA[I].r_offset != RB[I].r_offset ||
> - RA[I].getType(Config->IsMips64EL) !=
> RB[I].getType(Config->IsMips64EL))
> +bool ICF<ELFT>::constantEq(const InputSection *secA, ArrayRef<RelTy>
> ra,
> + const InputSection *secB, ArrayRef<RelTy>
> rb) {
> + for (size_t i = 0; i < ra.size(); ++i) {
> + if (ra[i].r_offset != rb[i].r_offset ||
> + ra[i].getType(config->isMips64EL) !=
> rb[i].getType(config->isMips64EL))
> return false;
>
> - uint64_t AddA = getAddend<ELFT>(RA[I]);
> - uint64_t AddB = getAddend<ELFT>(RB[I]);
> -
> - Symbol &SA = SecA->template
> getFile<ELFT>()->getRelocTargetSym(RA[I]);
> - Symbol &SB = SecB->template
> getFile<ELFT>()->getRelocTargetSym(RB[I]);
> - if (&SA == &SB) {
> - if (AddA == AddB)
> + uint64_t addA = getAddend<ELFT>(ra[i]);
> + uint64_t addB = getAddend<ELFT>(rb[i]);
> +
> + Symbol &sa = secA->template
> getFile<ELFT>()->getRelocTargetSym(ra[i]);
> + Symbol &sb = secB->template
> getFile<ELFT>()->getRelocTargetSym(rb[i]);
> + if (&sa == &sb) {
> + if (addA == addB)
> continue;
> return false;
> }
>
> - auto *DA = dyn_cast<Defined>(&SA);
> - auto *DB = dyn_cast<Defined>(&SB);
> + auto *da = dyn_cast<Defined>(&sa);
> + auto *db = dyn_cast<Defined>(&sb);
>
> // Placeholder symbols generated by linker scripts look the same
> now but
> // may have different values later.
> - if (!DA || !DB || DA->ScriptDefined || DB->ScriptDefined)
> + if (!da || !db || da->scriptDefined || db->scriptDefined)
> return false;
>
> // Relocations referring to absolute symbols are constant-equal
> if their
> // values are equal.
> - if (!DA->Section && !DB->Section && DA->Value + AddA == DB->Value
> + AddB)
> + if (!da->section && !db->section && da->value + addA == db->value
> + addB)
> continue;
> - if (!DA->Section || !DB->Section)
> + if (!da->section || !db->section)
> return false;
>
> - if (DA->Section->kind() != DB->Section->kind())
> + if (da->section->kind() != db->section->kind())
> return false;
>
> // Relocations referring to InputSections are constant-equal if
> their
> // section offsets are equal.
> - if (isa<InputSection>(DA->Section)) {
> - if (DA->Value + AddA == DB->Value + AddB)
> + if (isa<InputSection>(da->section)) {
> + if (da->value + addA == db->value + addB)
> continue;
> return false;
> }
>
> // Relocations referring to MergeInputSections are constant-equal
> if their
> // offsets in the output section are equal.
> - auto *X = dyn_cast<MergeInputSection>(DA->Section);
> - if (!X)
> + auto *x = dyn_cast<MergeInputSection>(da->section);
> + if (!x)
> return false;
> - auto *Y = cast<MergeInputSection>(DB->Section);
> - if (X->getParent() != Y->getParent())
> + auto *y = cast<MergeInputSection>(db->section);
> + if (x->getParent() != y->getParent())
> return false;
>
> - uint64_t OffsetA =
> - SA.isSection() ? X->getOffset(AddA) : X->getOffset(DA->Value)
> + AddA;
> - uint64_t OffsetB =
> - SB.isSection() ? Y->getOffset(AddB) : Y->getOffset(DB->Value)
> + AddB;
> - if (OffsetA != OffsetB)
> + uint64_t offsetA =
> + sa.isSection() ? x->getOffset(addA) : x->getOffset(da->value)
> + addA;
> + uint64_t offsetB =
> + sb.isSection() ? y->getOffset(addB) : y->getOffset(db->value)
> + addB;
> + if (offsetA != offsetB)
> return false;
> }
>
> @@ -298,57 +298,57 @@ bool ICF<ELFT>::constantEq(const InputSe
> // Compare "non-moving" part of two InputSections, namely everything
> // except relocation targets.
> template <class ELFT>
> -bool ICF<ELFT>::equalsConstant(const InputSection *A, const
> InputSection *B) {
> - if (A->NumRelocations != B->NumRelocations || A->Flags != B->Flags
> ||
> - A->getSize() != B->getSize() || A->data() != B->data())
> +bool ICF<ELFT>::equalsConstant(const InputSection *a, const
> InputSection *b) {
> + if (a->numRelocations != b->numRelocations || a->flags != b->flags
> ||
> + a->getSize() != b->getSize() || a->data() != b->data())
> return false;
>
> // If two sections have different output sections, we cannot merge
> them.
> // FIXME: This doesn't do the right thing in the case where there
> is a linker
> // script. We probably need to move output section assignment
> before ICF to
> // get the correct behaviour here.
> - if (getOutputSectionName(A) != getOutputSectionName(B))
> + if (getOutputSectionName(a) != getOutputSectionName(b))
> return false;
>
> - if (A->AreRelocsRela)
> - return constantEq(A, A->template relas<ELFT>(), B,
> - B->template relas<ELFT>());
> - return constantEq(A, A->template rels<ELFT>(), B, B->template
> rels<ELFT>());
> + if (a->areRelocsRela)
> + return constantEq(a, a->template relas<ELFT>(), b,
> + b->template relas<ELFT>());
> + return constantEq(a, a->template rels<ELFT>(), b, b->template
> rels<ELFT>());
> }
>
> // Compare two lists of relocations. Returns true if all pairs of
> // relocations point to the same section in terms of ICF.
> template <class ELFT>
> template <class RelTy>
> -bool ICF<ELFT>::variableEq(const InputSection *SecA, ArrayRef<RelTy>
> RA,
> - const InputSection *SecB, ArrayRef<RelTy>
> RB) {
> - assert(RA.size() == RB.size());
> +bool ICF<ELFT>::variableEq(const InputSection *secA, ArrayRef<RelTy>
> ra,
> + const InputSection *secB, ArrayRef<RelTy>
> rb) {
> + assert(ra.size() == rb.size());
>
> - for (size_t I = 0; I < RA.size(); ++I) {
> + for (size_t i = 0; i < ra.size(); ++i) {
> // The two sections must be identical.
> - Symbol &SA = SecA->template
> getFile<ELFT>()->getRelocTargetSym(RA[I]);
> - Symbol &SB = SecB->template
> getFile<ELFT>()->getRelocTargetSym(RB[I]);
> - if (&SA == &SB)
> + Symbol &sa = secA->template
> getFile<ELFT>()->getRelocTargetSym(ra[i]);
> + Symbol &sb = secB->template
> getFile<ELFT>()->getRelocTargetSym(rb[i]);
> + if (&sa == &sb)
> continue;
>
> - auto *DA = cast<Defined>(&SA);
> - auto *DB = cast<Defined>(&SB);
> + auto *da = cast<Defined>(&sa);
> + auto *db = cast<Defined>(&sb);
>
> // We already dealt with absolute and non-InputSection symbols in
> // constantEq, and for InputSections we have already checked
> everything
> // except the equivalence class.
> - if (!DA->Section)
> + if (!da->section)
> continue;
> - auto *X = dyn_cast<InputSection>(DA->Section);
> - if (!X)
> + auto *x = dyn_cast<InputSection>(da->section);
> + if (!x)
> continue;
> - auto *Y = cast<InputSection>(DB->Section);
> + auto *y = cast<InputSection>(db->section);
>
> // Ineligible sections are in the special equivalence class 0.
> // They can never be the same in terms of the equivalence class.
> - if (X->Class[Current] == 0)
> + if (x->eqClass[current] == 0)
> return false;
> - if (X->Class[Current] != Y->Class[Current])
> + if (x->eqClass[current] != y->eqClass[current])
> return false;
> };
>
> @@ -357,19 +357,19 @@ bool ICF<ELFT>::variableEq(const InputSe
>
> // Compare "moving" part of two InputSections, namely relocation
> targets.
> template <class ELFT>
> -bool ICF<ELFT>::equalsVariable(const InputSection *A, const
> InputSection *B) {
> - if (A->AreRelocsRela)
> - return variableEq(A, A->template relas<ELFT>(), B,
> - B->template relas<ELFT>());
> - return variableEq(A, A->template rels<ELFT>(), B, B->template
> rels<ELFT>());
> +bool ICF<ELFT>::equalsVariable(const InputSection *a, const
> InputSection *b) {
> + if (a->areRelocsRela)
> + return variableEq(a, a->template relas<ELFT>(), b,
> + b->template relas<ELFT>());
> + return variableEq(a, a->template rels<ELFT>(), b, b->template
> rels<ELFT>());
> }
>
> -template <class ELFT> size_t ICF<ELFT>::findBoundary(size_t Begin,
> size_t End) {
> - uint32_t Class = Sections[Begin]->Class[Current];
> - for (size_t I = Begin + 1; I < End; ++I)
> - if (Class != Sections[I]->Class[Current])
> - return I;
> - return End;
> +template <class ELFT> size_t ICF<ELFT>::findBoundary(size_t begin,
> size_t end) {
> + uint32_t eqClass = sections[begin]->eqClass[current];
> + for (size_t i = begin + 1; i < end; ++i)
> + if (eqClass != sections[i]->eqClass[current])
> + return i;
> + return end;
> }
>
> // Sections in the same equivalence class are contiguous in Sections
> @@ -378,125 +378,125 @@ template <class ELFT> size_t ICF<ELFT>::
> //
> // This function calls Fn on every group within [Begin, End).
> template <class ELFT>
> -void ICF<ELFT>::forEachClassRange(size_t Begin, size_t End,
> - llvm::function_ref<void(size_t,
> size_t)> Fn) {
> - while (Begin < End) {
> - size_t Mid = findBoundary(Begin, End);
> - Fn(Begin, Mid);
> - Begin = Mid;
> +void ICF<ELFT>::forEachClassRange(size_t begin, size_t end,
> + llvm::function_ref<void(size_t,
> size_t)> fn) {
> + while (begin < end) {
> + size_t mid = findBoundary(begin, end);
> + fn(begin, mid);
> + begin = mid;
> }
> }
>
> // Call Fn on each equivalence class.
> template <class ELFT>
> -void ICF<ELFT>::forEachClass(llvm::function_ref<void(size_t, size_t)>
> Fn) {
> +void ICF<ELFT>::forEachClass(llvm::function_ref<void(size_t, size_t)>
> fn) {
> // If threading is disabled or the number of sections are
> // too small to use threading, call Fn sequentially.
> - if (!ThreadsEnabled || Sections.size() < 1024) {
> - forEachClassRange(0, Sections.size(), Fn);
> - ++Cnt;
> + if (!ThreadsEnabled || sections.size() < 1024) {
> + forEachClassRange(0, sections.size(), fn);
> + ++cnt;
> return;
> }
>
> - Current = Cnt % 2;
> - Next = (Cnt + 1) % 2;
> + current = cnt % 2;
> + next = (cnt + 1) % 2;
>
> // Shard into non-overlapping intervals, and call Fn in parallel.
> // The sharding must be completed before any calls to Fn are made
> // so that Fn can modify the Chunks in its shard without causing
> data
> // races.
> - const size_t NumShards = 256;
> - size_t Step = Sections.size() / NumShards;
> - size_t Boundaries[NumShards + 1];
> - Boundaries[0] = 0;
> - Boundaries[NumShards] = Sections.size();
> + const size_t numShards = 256;
> + size_t step = sections.size() / numShards;
> + size_t boundaries[numShards + 1];
> + boundaries[0] = 0;
> + boundaries[numShards] = sections.size();
>
> - parallelForEachN(1, NumShards, [&](size_t I) {
> - Boundaries[I] = findBoundary((I - 1) * Step, Sections.size());
> + parallelForEachN(1, numShards, [&](size_t i) {
> + boundaries[i] = findBoundary((i - 1) * step, sections.size());
> });
>
> - parallelForEachN(1, NumShards + 1, [&](size_t I) {
> - if (Boundaries[I - 1] < Boundaries[I])
> - forEachClassRange(Boundaries[I - 1], Boundaries[I], Fn);
> + parallelForEachN(1, numShards + 1, [&](size_t i) {
> + if (boundaries[i - 1] < boundaries[i])
> + forEachClassRange(boundaries[i - 1], boundaries[i], fn);
> });
> - ++Cnt;
> + ++cnt;
> }
>
> // Combine the hashes of the sections referenced by the given section
> into its
> // hash.
> template <class ELFT, class RelTy>
> -static void combineRelocHashes(unsigned Cnt, InputSection *IS,
> - ArrayRef<RelTy> Rels) {
> - uint32_t Hash = IS->Class[Cnt % 2];
> - for (RelTy Rel : Rels) {
> - Symbol &S = IS->template getFile<ELFT>()->getRelocTargetSym(Rel);
> - if (auto *D = dyn_cast<Defined>(&S))
> - if (auto *RelSec = dyn_cast_or_null<InputSection>(D->Section))
> - Hash += RelSec->Class[Cnt % 2];
> +static void combineRelocHashes(unsigned cnt, InputSection *isec,
> + ArrayRef<RelTy> rels) {
> + uint32_t hash = isec->eqClass[cnt % 2];
> + for (RelTy rel : rels) {
> + Symbol &s = isec->template
> getFile<ELFT>()->getRelocTargetSym(rel);
> + if (auto *d = dyn_cast<Defined>(&s))
> + if (auto *relSec = dyn_cast_or_null<InputSection>(d->section))
> + hash += relSec->eqClass[cnt % 2];
> }
> // Set MSB to 1 to avoid collisions with non-hash IDs.
> - IS->Class[(Cnt + 1) % 2] = Hash | (1U << 31);
> + isec->eqClass[(cnt + 1) % 2] = hash | (1U << 31);
> }
>
> -static void print(const Twine &S) {
> - if (Config->PrintIcfSections)
> - message(S);
> +static void print(const Twine &s) {
> + if (config->printIcfSections)
> + message(s);
> }
>
> // The main function of ICF.
> template <class ELFT> void ICF<ELFT>::run() {
> // Collect sections to merge.
> - for (InputSectionBase *Sec : InputSections)
> - if (auto *S = dyn_cast<InputSection>(Sec))
> - if (isEligible(S))
> - Sections.push_back(S);
> + for (InputSectionBase *sec : inputSections)
> + if (auto *s = dyn_cast<InputSection>(sec))
> + if (isEligible(s))
> + sections.push_back(s);
>
> // Initially, we use hash values to partition sections.
> - parallelForEach(Sections, [&](InputSection *S) {
> - S->Class[0] = xxHash64(S->data());
> + parallelForEach(sections, [&](InputSection *s) {
> + s->eqClass[0] = xxHash64(s->data());
> });
>
> - for (unsigned Cnt = 0; Cnt != 2; ++Cnt) {
> - parallelForEach(Sections, [&](InputSection *S) {
> - if (S->AreRelocsRela)
> - combineRelocHashes<ELFT>(Cnt, S, S->template relas<ELFT>());
> + for (unsigned cnt = 0; cnt != 2; ++cnt) {
> + parallelForEach(sections, [&](InputSection *s) {
> + if (s->areRelocsRela)
> + combineRelocHashes<ELFT>(cnt, s, s->template relas<ELFT>());
> else
> - combineRelocHashes<ELFT>(Cnt, S, S->template rels<ELFT>());
> + combineRelocHashes<ELFT>(cnt, s, s->template rels<ELFT>());
> });
> }
>
> // From now on, sections in Sections vector are ordered so that
> sections
> // in the same equivalence class are consecutive in the vector.
> - llvm::stable_sort(Sections, [](const InputSection *A, const
> InputSection *B) {
> - return A->Class[0] < B->Class[0];
> + llvm::stable_sort(sections, [](const InputSection *a, const
> InputSection *b) {
> + return a->eqClass[0] < b->eqClass[0];
> });
>
> // Compare static contents and assign unique IDs for each static
> content.
> - forEachClass([&](size_t Begin, size_t End) { segregate(Begin, End,
> true); });
> + forEachClass([&](size_t begin, size_t end) { segregate(begin, end,
> true); });
>
> // Split groups by comparing relocations until convergence is
> obtained.
> do {
> - Repeat = false;
> + repeat = false;
> forEachClass(
> - [&](size_t Begin, size_t End) { segregate(Begin, End, false);
> });
> - } while (Repeat);
> + [&](size_t begin, size_t end) { segregate(begin, end, false);
> });
> + } while (repeat);
>
> - log("ICF needed " + Twine(Cnt) + " iterations");
> + log("ICF needed " + Twine(cnt) + " iterations");
>
> // Merge sections by the equivalence class.
> - forEachClassRange(0, Sections.size(), [&](size_t Begin, size_t End)
> {
> - if (End - Begin == 1)
> + forEachClassRange(0, sections.size(), [&](size_t begin, size_t end)
> {
> + if (end - begin == 1)
> return;
> - print("selected section " + toString(Sections[Begin]));
> - for (size_t I = Begin + 1; I < End; ++I) {
> - print(" removing identical section " + toString(Sections[I]));
> - Sections[Begin]->replace(Sections[I]);
> + print("selected section " + toString(sections[begin]));
> + for (size_t i = begin + 1; i < end; ++i) {
> + print(" removing identical section " + toString(sections[i]));
> + sections[begin]->replace(sections[i]);
>
> // At this point we know sections merged are fully identical
> and hence
> // we want to remove duplicate implicit dependencies such as
> link order
> // and relocation sections.
> - for (InputSection *IS : Sections[I]->DependentSections)
> - IS->markDead();
> + for (InputSection *isec : sections[i]->dependentSections)
> + isec->markDead();
> }
> });
> }
>
> Modified: lld/trunk/ELF/InputFiles.cpp
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_InputFiles.cpp-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=GJ5xqpJkWibOMk0BSiEfVapSpT45DiE3cFQ9Day_oHk&e=
>
> ==============================================================================
> --- lld/trunk/ELF/InputFiles.cpp (original)
> +++ lld/trunk/ELF/InputFiles.cpp Tue Jul 9 22:00:37 2019
> @@ -40,167 +40,167 @@ using namespace llvm::support::endian;
> using namespace lld;
> using namespace lld::elf;
>
> -bool InputFile::IsInGroup;
> -uint32_t InputFile::NextGroupId;
> -std::vector<BinaryFile *> elf::BinaryFiles;
> -std::vector<BitcodeFile *> elf::BitcodeFiles;
> -std::vector<LazyObjFile *> elf::LazyObjFiles;
> -std::vector<InputFile *> elf::ObjectFiles;
> -std::vector<SharedFile *> elf::SharedFiles;
> -
> -std::unique_ptr<TarWriter> elf::Tar;
> -
> -static ELFKind getELFKind(MemoryBufferRef MB, StringRef ArchiveName) {
> - unsigned char Size;
> - unsigned char Endian;
> - std::tie(Size, Endian) = getElfArchType(MB.getBuffer());
> -
> - auto Report = [&](StringRef Msg) {
> - StringRef Filename = MB.getBufferIdentifier();
> - if (ArchiveName.empty())
> - fatal(Filename + ": " + Msg);
> +bool InputFile::isInGroup;
> +uint32_t InputFile::nextGroupId;
> +std::vector<BinaryFile *> elf::binaryFiles;
> +std::vector<BitcodeFile *> elf::bitcodeFiles;
> +std::vector<LazyObjFile *> elf::lazyObjFiles;
> +std::vector<InputFile *> elf::objectFiles;
> +std::vector<SharedFile *> elf::sharedFiles;
> +
> +std::unique_ptr<TarWriter> elf::tar;
> +
> +static ELFKind getELFKind(MemoryBufferRef mb, StringRef archiveName) {
> + unsigned char size;
> + unsigned char endian;
> + std::tie(size, endian) = getElfArchType(mb.getBuffer());
> +
> + auto report = [&](StringRef msg) {
> + StringRef filename = mb.getBufferIdentifier();
> + if (archiveName.empty())
> + fatal(filename + ": " + msg);
> else
> - fatal(ArchiveName + "(" + Filename + "): " + Msg);
> + fatal(archiveName + "(" + filename + "): " + msg);
> };
>
> - if (!MB.getBuffer().startswith(ElfMagic))
> - Report("not an ELF file");
> - if (Endian != ELFDATA2LSB && Endian != ELFDATA2MSB)
> - Report("corrupted ELF file: invalid data encoding");
> - if (Size != ELFCLASS32 && Size != ELFCLASS64)
> - Report("corrupted ELF file: invalid file class");
> -
> - size_t BufSize = MB.getBuffer().size();
> - if ((Size == ELFCLASS32 && BufSize < sizeof(Elf32_Ehdr)) ||
> - (Size == ELFCLASS64 && BufSize < sizeof(Elf64_Ehdr)))
> - Report("corrupted ELF file: file is too short");
> -
> - if (Size == ELFCLASS32)
> - return (Endian == ELFDATA2LSB) ? ELF32LEKind : ELF32BEKind;
> - return (Endian == ELFDATA2LSB) ? ELF64LEKind : ELF64BEKind;
> + if (!mb.getBuffer().startswith(ElfMagic))
> + report("not an ELF file");
> + if (endian != ELFDATA2LSB && endian != ELFDATA2MSB)
> + report("corrupted ELF file: invalid data encoding");
> + if (size != ELFCLASS32 && size != ELFCLASS64)
> + report("corrupted ELF file: invalid file class");
> +
> + size_t bufSize = mb.getBuffer().size();
> + if ((size == ELFCLASS32 && bufSize < sizeof(Elf32_Ehdr)) ||
> + (size == ELFCLASS64 && bufSize < sizeof(Elf64_Ehdr)))
> + report("corrupted ELF file: file is too short");
> +
> + if (size == ELFCLASS32)
> + return (endian == ELFDATA2LSB) ? ELF32LEKind : ELF32BEKind;
> + return (endian == ELFDATA2LSB) ? ELF64LEKind : ELF64BEKind;
> }
>
> -InputFile::InputFile(Kind K, MemoryBufferRef M)
> - : MB(M), GroupId(NextGroupId), FileKind(K) {
> +InputFile::InputFile(Kind k, MemoryBufferRef m)
> + : mb(m), groupId(nextGroupId), fileKind(k) {
> // All files within the same --{start,end}-group get the same group
> ID.
> // Otherwise, a new file will get a new group ID.
> - if (!IsInGroup)
> - ++NextGroupId;
> + if (!isInGroup)
> + ++nextGroupId;
> }
>
> -Optional<MemoryBufferRef> elf::readFile(StringRef Path) {
> +Optional<MemoryBufferRef> elf::readFile(StringRef path) {
> // The --chroot option changes our virtual root directory.
> // This is useful when you are dealing with files created by
> --reproduce.
> - if (!Config->Chroot.empty() && Path.startswith("/"))
> - Path = Saver.save(Config->Chroot + Path);
> + if (!config->chroot.empty() && path.startswith("/"))
> + path = Saver.save(config->chroot + path);
>
> - log(Path);
> + log(path);
>
> - auto MBOrErr = MemoryBuffer::getFile(Path, -1, false);
> - if (auto EC = MBOrErr.getError()) {
> - error("cannot open " + Path + ": " + EC.message());
> + auto mbOrErr = MemoryBuffer::getFile(path, -1, false);
> + if (auto ec = mbOrErr.getError()) {
> + error("cannot open " + path + ": " + ec.message());
> return None;
> }
>
> - std::unique_ptr<MemoryBuffer> &MB = *MBOrErr;
> - MemoryBufferRef MBRef = MB->getMemBufferRef();
> - make<std::unique_ptr<MemoryBuffer>>(std::move(MB)); // take MB
> ownership
> -
> - if (Tar)
> - Tar->append(relativeToRoot(Path), MBRef.getBuffer());
> - return MBRef;
> + std::unique_ptr<MemoryBuffer> &mb = *mbOrErr;
> + MemoryBufferRef mbref = mb->getMemBufferRef();
> + make<std::unique_ptr<MemoryBuffer>>(std::move(mb)); // take MB
> ownership
> +
> + if (tar)
> + tar->append(relativeToRoot(path), mbref.getBuffer());
> + return mbref;
> }
>
> // All input object files must be for the same architecture
> // (e.g. it does not make sense to link x86 object files with
> // MIPS object files.) This function checks for that error.
> -static bool isCompatible(InputFile *File) {
> - if (!File->isElf() && !isa<BitcodeFile>(File))
> +static bool isCompatible(InputFile *file) {
> + if (!file->isElf() && !isa<BitcodeFile>(file))
> return true;
>
> - if (File->EKind == Config->EKind && File->EMachine ==
> Config->EMachine) {
> - if (Config->EMachine != EM_MIPS)
> + if (file->ekind == config->ekind && file->emachine ==
> config->emachine) {
> + if (config->emachine != EM_MIPS)
> return true;
> - if (isMipsN32Abi(File) == Config->MipsN32Abi)
> + if (isMipsN32Abi(file) == config->mipsN32Abi)
> return true;
> }
>
> - if (!Config->Emulation.empty()) {
> - error(toString(File) + " is incompatible with " +
> Config->Emulation);
> + if (!config->emulation.empty()) {
> + error(toString(file) + " is incompatible with " +
> config->emulation);
> } else {
> - InputFile *Existing;
> - if (!ObjectFiles.empty())
> - Existing = ObjectFiles[0];
> - else if (!SharedFiles.empty())
> - Existing = SharedFiles[0];
> + InputFile *existing;
> + if (!objectFiles.empty())
> + existing = objectFiles[0];
> + else if (!sharedFiles.empty())
> + existing = sharedFiles[0];
> else
> - Existing = BitcodeFiles[0];
> + existing = bitcodeFiles[0];
>
> - error(toString(File) + " is incompatible with " +
> toString(Existing));
> + error(toString(file) + " is incompatible with " +
> toString(existing));
> }
>
> return false;
> }
>
> -template <class ELFT> static void doParseFile(InputFile *File) {
> - if (!isCompatible(File))
> +template <class ELFT> static void doParseFile(InputFile *file) {
> + if (!isCompatible(file))
> return;
>
> // Binary file
> - if (auto *F = dyn_cast<BinaryFile>(File)) {
> - BinaryFiles.push_back(F);
> - F->parse();
> + if (auto *f = dyn_cast<BinaryFile>(file)) {
> + binaryFiles.push_back(f);
> + f->parse();
> return;
> }
>
> // .a file
> - if (auto *F = dyn_cast<ArchiveFile>(File)) {
> - F->parse();
> + if (auto *f = dyn_cast<ArchiveFile>(file)) {
> + f->parse();
> return;
> }
>
> // Lazy object file
> - if (auto *F = dyn_cast<LazyObjFile>(File)) {
> - LazyObjFiles.push_back(F);
> - F->parse<ELFT>();
> + if (auto *f = dyn_cast<LazyObjFile>(file)) {
> + lazyObjFiles.push_back(f);
> + f->parse<ELFT>();
> return;
> }
>
> - if (Config->Trace)
> - message(toString(File));
> + if (config->trace)
> + message(toString(file));
>
> // .so file
> - if (auto *F = dyn_cast<SharedFile>(File)) {
> - F->parse<ELFT>();
> + if (auto *f = dyn_cast<SharedFile>(file)) {
> + f->parse<ELFT>();
> return;
> }
>
> // LLVM bitcode file
> - if (auto *F = dyn_cast<BitcodeFile>(File)) {
> - BitcodeFiles.push_back(F);
> - F->parse<ELFT>();
> + if (auto *f = dyn_cast<BitcodeFile>(file)) {
> + bitcodeFiles.push_back(f);
> + f->parse<ELFT>();
> return;
> }
>
> // Regular object file
> - ObjectFiles.push_back(File);
> - cast<ObjFile<ELFT>>(File)->parse();
> + objectFiles.push_back(file);
> + cast<ObjFile<ELFT>>(file)->parse();
> }
>
> // Add symbols in File to the symbol table.
> -void elf::parseFile(InputFile *File) {
> - switch (Config->EKind) {
> +void elf::parseFile(InputFile *file) {
> + switch (config->ekind) {
> case ELF32LEKind:
> - doParseFile<ELF32LE>(File);
> + doParseFile<ELF32LE>(file);
> return;
> case ELF32BEKind:
> - doParseFile<ELF32BE>(File);
> + doParseFile<ELF32BE>(file);
> return;
> case ELF64LEKind:
> - doParseFile<ELF64LE>(File);
> + doParseFile<ELF64LE>(file);
> return;
> case ELF64BEKind:
> - doParseFile<ELF64BE>(File);
> + doParseFile<ELF64BE>(file);
> return;
> default:
> llvm_unreachable("unknown ELFT");
> @@ -208,87 +208,87 @@ void elf::parseFile(InputFile *File) {
> }
>
> // Concatenates arguments to construct a string representing an error
> location.
> -static std::string createFileLineMsg(StringRef Path, unsigned Line) {
> - std::string Filename = path::filename(Path);
> - std::string Lineno = ":" + std::to_string(Line);
> - if (Filename == Path)
> - return Filename + Lineno;
> - return Filename + Lineno + " (" + Path.str() + Lineno + ")";
> +static std::string createFileLineMsg(StringRef path, unsigned line) {
> + std::string filename = path::filename(path);
> + std::string lineno = ":" + std::to_string(line);
> + if (filename == path)
> + return filename + lineno;
> + return filename + lineno + " (" + path.str() + lineno + ")";
> }
>
> template <class ELFT>
> -static std::string getSrcMsgAux(ObjFile<ELFT> &File, const Symbol
> &Sym,
> - InputSectionBase &Sec, uint64_t
> Offset) {
> +static std::string getSrcMsgAux(ObjFile<ELFT> &file, const Symbol
> &sym,
> + InputSectionBase &sec, uint64_t
> offset) {
> // In DWARF, functions and variables are stored to different places.
> // First, lookup a function for a given offset.
> - if (Optional<DILineInfo> Info = File.getDILineInfo(&Sec, Offset))
> - return createFileLineMsg(Info->FileName, Info->Line);
> + if (Optional<DILineInfo> info = file.getDILineInfo(&sec, offset))
> + return createFileLineMsg(info->FileName, info->Line);
>
> // If it failed, lookup again as a variable.
> - if (Optional<std::pair<std::string, unsigned>> FileLine =
> - File.getVariableLoc(Sym.getName()))
> - return createFileLineMsg(FileLine->first, FileLine->second);
> + if (Optional<std::pair<std::string, unsigned>> fileLine =
> + file.getVariableLoc(sym.getName()))
> + return createFileLineMsg(fileLine->first, fileLine->second);
>
> // File.SourceFile contains STT_FILE symbol, and that is a last
> resort.
> - return File.SourceFile;
> + return file.sourceFile;
> }
>
> -std::string InputFile::getSrcMsg(const Symbol &Sym, InputSectionBase
> &Sec,
> - uint64_t Offset) {
> +std::string InputFile::getSrcMsg(const Symbol &sym, InputSectionBase
> &sec,
> + uint64_t offset) {
> if (kind() != ObjKind)
> return "";
> - switch (Config->EKind) {
> + switch (config->ekind) {
> default:
> llvm_unreachable("Invalid kind");
> case ELF32LEKind:
> - return getSrcMsgAux(cast<ObjFile<ELF32LE>>(*this), Sym, Sec,
> Offset);
> + return getSrcMsgAux(cast<ObjFile<ELF32LE>>(*this), sym, sec,
> offset);
> case ELF32BEKind:
> - return getSrcMsgAux(cast<ObjFile<ELF32BE>>(*this), Sym, Sec,
> Offset);
> + return getSrcMsgAux(cast<ObjFile<ELF32BE>>(*this), sym, sec,
> offset);
> case ELF64LEKind:
> - return getSrcMsgAux(cast<ObjFile<ELF64LE>>(*this), Sym, Sec,
> Offset);
> + return getSrcMsgAux(cast<ObjFile<ELF64LE>>(*this), sym, sec,
> offset);
> case ELF64BEKind:
> - return getSrcMsgAux(cast<ObjFile<ELF64BE>>(*this), Sym, Sec,
> Offset);
> + return getSrcMsgAux(cast<ObjFile<ELF64BE>>(*this), sym, sec,
> offset);
> }
> }
>
> template <class ELFT> void ObjFile<ELFT>::initializeDwarf() {
> - Dwarf =
> llvm::make_unique<DWARFContext>(make_unique<LLDDwarfObj<ELFT>>(this));
> - for (std::unique_ptr<DWARFUnit> &CU : Dwarf->compile_units()) {
> - auto Report = [](Error Err) {
> - handleAllErrors(std::move(Err),
> - [](ErrorInfoBase &Info) { warn(Info.message());
> });
> + dwarf =
> llvm::make_unique<DWARFContext>(make_unique<LLDDwarfObj<ELFT>>(this));
> + for (std::unique_ptr<DWARFUnit> &cu : dwarf->compile_units()) {
> + auto report = [](Error err) {
> + handleAllErrors(std::move(err),
> + [](ErrorInfoBase &info) { warn(info.message());
> });
> };
> - Expected<const DWARFDebugLine::LineTable *> ExpectedLT =
> - Dwarf->getLineTableForUnit(CU.get(), Report);
> - const DWARFDebugLine::LineTable *LT = nullptr;
> - if (ExpectedLT)
> - LT = *ExpectedLT;
> + Expected<const DWARFDebugLine::LineTable *> expectedLT =
> + dwarf->getLineTableForUnit(cu.get(), report);
> + const DWARFDebugLine::LineTable *lt = nullptr;
> + if (expectedLT)
> + lt = *expectedLT;
> else
> - Report(ExpectedLT.takeError());
> - if (!LT)
> + report(expectedLT.takeError());
> + if (!lt)
> continue;
> - LineTables.push_back(LT);
> + lineTables.push_back(lt);
>
> // Loop over variable records and insert them to VariableLoc.
> - for (const auto &Entry : CU->dies()) {
> - DWARFDie Die(CU.get(), &Entry);
> + for (const auto &entry : cu->dies()) {
> + DWARFDie die(cu.get(), &entry);
> // Skip all tags that are not variables.
> - if (Die.getTag() != dwarf::DW_TAG_variable)
> + if (die.getTag() != dwarf::DW_TAG_variable)
> continue;
>
> // Skip if a local variable because we don't need them for
> generating
> // error messages. In general, only non-local symbols can fail
> to be
> // linked.
> - if (!dwarf::toUnsigned(Die.find(dwarf::DW_AT_external), 0))
> + if (!dwarf::toUnsigned(die.find(dwarf::DW_AT_external), 0))
> continue;
>
> // Get the source filename index for the variable.
> - unsigned File =
> dwarf::toUnsigned(Die.find(dwarf::DW_AT_decl_file), 0);
> - if (!LT->hasFileAtIndex(File))
> + unsigned file =
> dwarf::toUnsigned(die.find(dwarf::DW_AT_decl_file), 0);
> + if (!lt->hasFileAtIndex(file))
> continue;
>
> // Get the line number on which the variable is declared.
> - unsigned Line =
> dwarf::toUnsigned(Die.find(dwarf::DW_AT_decl_line), 0);
> + unsigned line =
> dwarf::toUnsigned(die.find(dwarf::DW_AT_decl_line), 0);
>
> // Here we want to take the variable name to add it into
> VariableLoc.
> // Variable can have regular and linkage name associated. At
> first, we try
> @@ -296,11 +296,11 @@ template <class ELFT> void ObjFile<ELFT>
> // two variables in different namespaces of the same object.
> Use common
> // name otherwise, but handle the case when it also absent in
> case if the
> // input object file lacks some debug info.
> - StringRef Name =
> - dwarf::toString(Die.find(dwarf::DW_AT_linkage_name),
> -
> dwarf::toString(Die.find(dwarf::DW_AT_name), ""));
> - if (!Name.empty())
> - VariableLoc.insert({Name, {LT, File, Line}});
> + StringRef name =
> + dwarf::toString(die.find(dwarf::DW_AT_linkage_name),
> +
> dwarf::toString(die.find(dwarf::DW_AT_name), ""));
> + if (!name.empty())
> + variableLoc.insert({name, {lt, file, line}});
> }
> }
> }
> @@ -309,71 +309,71 @@ template <class ELFT> void ObjFile<ELFT>
> // object (variable, array, etc) definition.
> template <class ELFT>
> Optional<std::pair<std::string, unsigned>>
> -ObjFile<ELFT>::getVariableLoc(StringRef Name) {
> - llvm::call_once(InitDwarfLine, [this]() { initializeDwarf(); });
> +ObjFile<ELFT>::getVariableLoc(StringRef name) {
> + llvm::call_once(initDwarfLine, [this]() { initializeDwarf(); });
>
> // Return if we have no debug information about data object.
> - auto It = VariableLoc.find(Name);
> - if (It == VariableLoc.end())
> + auto it = variableLoc.find(name);
> + if (it == variableLoc.end())
> return None;
>
> // Take file name string from line table.
> - std::string FileName;
> - if (!It->second.LT->getFileNameByIndex(
> - It->second.File, nullptr,
> - DILineInfoSpecifier::FileLineInfoKind::AbsoluteFilePath,
> FileName))
> + std::string fileName;
> + if (!it->second.lt->getFileNameByIndex(
> + it->second.file, nullptr,
> + DILineInfoSpecifier::FileLineInfoKind::AbsoluteFilePath,
> fileName))
> return None;
>
> - return std::make_pair(FileName, It->second.Line);
> + return std::make_pair(fileName, it->second.line);
> }
>
> // Returns source line information for a given offset
> // using DWARF debug info.
> template <class ELFT>
> -Optional<DILineInfo> ObjFile<ELFT>::getDILineInfo(InputSectionBase *S,
> - uint64_t Offset) {
> - llvm::call_once(InitDwarfLine, [this]() { initializeDwarf(); });
> +Optional<DILineInfo> ObjFile<ELFT>::getDILineInfo(InputSectionBase *s,
> + uint64_t offset) {
> + llvm::call_once(initDwarfLine, [this]() { initializeDwarf(); });
>
> // Detect SectionIndex for specified section.
> - uint64_t SectionIndex = object::SectionedAddress::UndefSection;
> - ArrayRef<InputSectionBase *> Sections = S->File->getSections();
> - for (uint64_t CurIndex = 0; CurIndex < Sections.size(); ++CurIndex)
> {
> - if (S == Sections[CurIndex]) {
> - SectionIndex = CurIndex;
> + uint64_t sectionIndex = object::SectionedAddress::UndefSection;
> + ArrayRef<InputSectionBase *> sections = s->file->getSections();
> + for (uint64_t curIndex = 0; curIndex < sections.size(); ++curIndex)
> {
> + if (s == sections[curIndex]) {
> + sectionIndex = curIndex;
> break;
> }
> }
>
> // Use fake address calcuated by adding section file offset and
> offset in
> // section. See comments for ObjectInfo class.
> - DILineInfo Info;
> - for (const llvm::DWARFDebugLine::LineTable *LT : LineTables) {
> - if (LT->getFileLineInfoForAddress(
> - {S->getOffsetInFile() + Offset, SectionIndex}, nullptr,
> - DILineInfoSpecifier::FileLineInfoKind::AbsoluteFilePath,
> Info))
> - return Info;
> + DILineInfo info;
> + for (const llvm::DWARFDebugLine::LineTable *lt : lineTables) {
> + if (lt->getFileLineInfoForAddress(
> + {s->getOffsetInFile() + offset, sectionIndex}, nullptr,
> + DILineInfoSpecifier::FileLineInfoKind::AbsoluteFilePath,
> info))
> + return info;
> }
> return None;
> }
>
> // Returns "<internal>", "foo.a(bar.o)" or "baz.o".
> -std::string lld::toString(const InputFile *F) {
> - if (!F)
> +std::string lld::toString(const InputFile *f) {
> + if (!f)
> return "<internal>";
>
> - if (F->ToStringCache.empty()) {
> - if (F->ArchiveName.empty())
> - F->ToStringCache = F->getName();
> + if (f->toStringCache.empty()) {
> + if (f->archiveName.empty())
> + f->toStringCache = f->getName();
> else
> - F->ToStringCache = (F->ArchiveName + "(" + F->getName() +
> ")").str();
> + f->toStringCache = (f->archiveName + "(" + f->getName() +
> ")").str();
> }
> - return F->ToStringCache;
> + return f->toStringCache;
> }
>
> -ELFFileBase::ELFFileBase(Kind K, MemoryBufferRef MB) : InputFile(K,
> MB) {
> - EKind = getELFKind(MB, "");
> +ELFFileBase::ELFFileBase(Kind k, MemoryBufferRef mb) : InputFile(k,
> mb) {
> + ekind = getELFKind(mb, "");
>
> - switch (EKind) {
> + switch (ekind) {
> case ELF32LEKind:
> init<ELF32LE>();
> break;
> @@ -392,10 +392,10 @@ ELFFileBase::ELFFileBase(Kind K, MemoryB
> }
>
> template <typename Elf_Shdr>
> -static const Elf_Shdr *findSection(ArrayRef<Elf_Shdr> Sections,
> uint32_t Type) {
> - for (const Elf_Shdr &Sec : Sections)
> - if (Sec.sh_type == Type)
> - return &Sec;
> +static const Elf_Shdr *findSection(ArrayRef<Elf_Shdr> sections,
> uint32_t type) {
> + for (const Elf_Shdr &sec : sections)
> + if (sec.sh_type == type)
> + return &sec;
> return nullptr;
> }
>
> @@ -404,57 +404,57 @@ template <class ELFT> void ELFFileBase::
> using Elf_Sym = typename ELFT::Sym;
>
> // Initialize trivial attributes.
> - const ELFFile<ELFT> &Obj = getObj<ELFT>();
> - EMachine = Obj.getHeader()->e_machine;
> - OSABI = Obj.getHeader()->e_ident[llvm::ELF::EI_OSABI];
> - ABIVersion = Obj.getHeader()->e_ident[llvm::ELF::EI_ABIVERSION];
> + const ELFFile<ELFT> &obj = getObj<ELFT>();
> + emachine = obj.getHeader()->e_machine;
> + osabi = obj.getHeader()->e_ident[llvm::ELF::EI_OSABI];
> + abiVersion = obj.getHeader()->e_ident[llvm::ELF::EI_ABIVERSION];
>
> - ArrayRef<Elf_Shdr> Sections = CHECK(Obj.sections(), this);
> + ArrayRef<Elf_Shdr> sections = CHECK(obj.sections(), this);
>
> // Find a symbol table.
> - bool IsDSO =
> - (identify_magic(MB.getBuffer()) ==
> file_magic::elf_shared_object);
> - const Elf_Shdr *SymtabSec =
> - findSection(Sections, IsDSO ? SHT_DYNSYM : SHT_SYMTAB);
> + bool isDSO =
> + (identify_magic(mb.getBuffer()) ==
> file_magic::elf_shared_object);
> + const Elf_Shdr *symtabSec =
> + findSection(sections, isDSO ? SHT_DYNSYM : SHT_SYMTAB);
>
> - if (!SymtabSec)
> + if (!symtabSec)
> return;
>
> // Initialize members corresponding to a symbol table.
> - FirstGlobal = SymtabSec->sh_info;
> + firstGlobal = symtabSec->sh_info;
>
> - ArrayRef<Elf_Sym> ESyms = CHECK(Obj.symbols(SymtabSec), this);
> - if (FirstGlobal == 0 || FirstGlobal > ESyms.size())
> + ArrayRef<Elf_Sym> eSyms = CHECK(obj.symbols(symtabSec), this);
> + if (firstGlobal == 0 || firstGlobal > eSyms.size())
> fatal(toString(this) + ": invalid sh_info in symbol table");
>
> - ELFSyms = reinterpret_cast<const void *>(ESyms.data());
> - NumELFSyms = ESyms.size();
> - StringTable = CHECK(Obj.getStringTableForSymtab(*SymtabSec,
> Sections), this);
> + elfSyms = reinterpret_cast<const void *>(eSyms.data());
> + numELFSyms = eSyms.size();
> + stringTable = CHECK(obj.getStringTableForSymtab(*symtabSec,
> sections), this);
> }
>
> template <class ELFT>
> -uint32_t ObjFile<ELFT>::getSectionIndex(const Elf_Sym &Sym) const {
> +uint32_t ObjFile<ELFT>::getSectionIndex(const Elf_Sym &sym) const {
> return CHECK(
> - this->getObj().getSectionIndex(&Sym, getELFSyms<ELFT>(),
> ShndxTable),
> + this->getObj().getSectionIndex(&sym, getELFSyms<ELFT>(),
> shndxTable),
> this);
> }
>
> template <class ELFT> ArrayRef<Symbol *>
> ObjFile<ELFT>::getLocalSymbols() {
> - if (this->Symbols.empty())
> + if (this->symbols.empty())
> return {};
> - return makeArrayRef(this->Symbols).slice(1, this->FirstGlobal - 1);
> + return makeArrayRef(this->symbols).slice(1, this->firstGlobal - 1);
> }
>
> template <class ELFT> ArrayRef<Symbol *>
> ObjFile<ELFT>::getGlobalSymbols() {
> - return makeArrayRef(this->Symbols).slice(this->FirstGlobal);
> + return makeArrayRef(this->symbols).slice(this->firstGlobal);
> }
>
> -template <class ELFT> void ObjFile<ELFT>::parse(bool IgnoreComdats) {
> +template <class ELFT> void ObjFile<ELFT>::parse(bool ignoreComdats) {
> // Read a section table. JustSymbols is usually false.
> - if (this->JustSymbols)
> + if (this->justSymbols)
> initializeJustSymbols();
> else
> - initializeSections(IgnoreComdats);
> + initializeSections(ignoreComdats);
>
> // Read a symbol table.
> initializeSymbols();
> @@ -464,11 +464,11 @@ template <class ELFT> void ObjFile<ELFT>
> // They are identified and deduplicated by group name. This function
> // returns a group name.
> template <class ELFT>
> -StringRef ObjFile<ELFT>::getShtGroupSignature(ArrayRef<Elf_Shdr>
> Sections,
> - const Elf_Shdr &Sec) {
> - const Elf_Sym *Sym =
> - CHECK(object::getSymbol<ELFT>(this->getELFSyms<ELFT>(),
> Sec.sh_info), this);
> - StringRef Signature = CHECK(Sym->getName(this->StringTable), this);
> +StringRef ObjFile<ELFT>::getShtGroupSignature(ArrayRef<Elf_Shdr>
> sections,
> + const Elf_Shdr &sec) {
> + const Elf_Sym *sym =
> + CHECK(object::getSymbol<ELFT>(this->getELFSyms<ELFT>(),
> sec.sh_info), this);
> + StringRef signature = CHECK(sym->getName(this->stringTable), this);
>
> // As a special case, if a symbol is a section symbol and has no
> name,
> // we use a section name as a signature.
> @@ -477,12 +477,12 @@ StringRef ObjFile<ELFT>::getShtGroupSign
> // standard, but GNU gold 1.14 (the newest version as of July 2017)
> or
> // older produce such sections as outputs for the -r option, so we
> need
> // a bug-compatibility.
> - if (Signature.empty() && Sym->getType() == STT_SECTION)
> - return getSectionName(Sec);
> - return Signature;
> + if (signature.empty() && sym->getType() == STT_SECTION)
> + return getSectionName(sec);
> + return signature;
> }
>
> -template <class ELFT> bool ObjFile<ELFT>::shouldMerge(const Elf_Shdr
> &Sec) {
> +template <class ELFT> bool ObjFile<ELFT>::shouldMerge(const Elf_Shdr
> &sec) {
> // On a regular link we don't merge sections if -O0 (default is
> -O1). This
> // sometimes makes the linker significantly faster, although the
> output will
> // be bigger.
> @@ -495,14 +495,14 @@ template <class ELFT> bool ObjFile<ELFT>
> // SHF_MERGE sections based both on their name and sh_entsize, but
> that seems
> // to be more trouble than it is worth. Instead, we just use the
> regular (-O1)
> // logic for -r.
> - if (Config->Optimize == 0 && !Config->Relocatable)
> + if (config->optimize == 0 && !config->relocatable)
> return false;
>
> // A mergeable section with size 0 is useless because they don't
> have
> // any data to merge. A mergeable string section with size 0 can be
> // argued as invalid because it doesn't end with a null character.
> // We'll avoid a mess by handling them as if they were
> non-mergeable.
> - if (Sec.sh_size == 0)
> + if (sec.sh_size == 0)
> return false;
>
> // Check for sh_entsize. The ELF spec is not clear about the zero
> @@ -510,17 +510,17 @@ template <class ELFT> bool ObjFile<ELFT>
> // the section does not hold a table of fixed-size entries". We know
> // that Rust 1.13 produces a string mergeable section with a zero
> // sh_entsize. Here we just accept it rather than being picky about
> it.
> - uint64_t EntSize = Sec.sh_entsize;
> - if (EntSize == 0)
> + uint64_t entSize = sec.sh_entsize;
> + if (entSize == 0)
> return false;
> - if (Sec.sh_size % EntSize)
> + if (sec.sh_size % entSize)
> fatal(toString(this) +
> ": SHF_MERGE section size must be a multiple of
> sh_entsize");
>
> - uint64_t Flags = Sec.sh_flags;
> - if (!(Flags & SHF_MERGE))
> + uint64_t flags = sec.sh_flags;
> + if (!(flags & SHF_MERGE))
> return false;
> - if (Flags & SHF_WRITE)
> + if (flags & SHF_WRITE)
> fatal(toString(this) + ": writable SHF_MERGE section is not
> supported");
>
> return true;
> @@ -536,8 +536,8 @@ template <class ELFT> bool ObjFile<ELFT>
> // When the option is given, we link "just symbols". The section
> table is
> // initialized with null pointers.
> template <class ELFT> void ObjFile<ELFT>::initializeJustSymbols() {
> - ArrayRef<Elf_Shdr> Sections = CHECK(this->getObj().sections(),
> this);
> - this->Sections.resize(Sections.size());
> + ArrayRef<Elf_Shdr> sections = CHECK(this->getObj().sections(),
> this);
> + this->sections.resize(sections.size());
> }
>
> // An ELF object file may contain a `.deplibs` section. If it exists,
> the
> @@ -546,128 +546,128 @@ template <class ELFT> void ObjFile<ELFT>
> // the various ways that a library can be specified to LLD. This ELF
> extension
> // is a form of autolinking and is called `dependent libraries`. It
> is currently
> // unique to LLVM and lld.
> -static void addDependentLibrary(StringRef Specifier, const InputFile
> *F) {
> - if (!Config->DependentLibraries)
> +static void addDependentLibrary(StringRef specifier, const InputFile
> *f) {
> + if (!config->dependentLibraries)
> return;
> - if (fs::exists(Specifier))
> - Driver->addFile(Specifier, /*WithLOption=*/false);
> - else if (Optional<std::string> S = findFromSearchPaths(Specifier))
> - Driver->addFile(*S, /*WithLOption=*/true);
> - else if (Optional<std::string> S = searchLibraryBaseName(Specifier))
> - Driver->addFile(*S, /*WithLOption=*/true);
> + if (fs::exists(specifier))
> + driver->addFile(specifier, /*WithLOption=*/false);
> + else if (Optional<std::string> s = findFromSearchPaths(specifier))
> + driver->addFile(*s, /*WithLOption=*/true);
> + else if (Optional<std::string> s = searchLibraryBaseName(specifier))
> + driver->addFile(*s, /*WithLOption=*/true);
> else
> - error(toString(F) +
> + error(toString(f) +
> ": unable to find library from dependent library specifier:
> " +
> - Specifier);
> + specifier);
> }
>
> template <class ELFT>
> -void ObjFile<ELFT>::initializeSections(bool IgnoreComdats) {
> - const ELFFile<ELFT> &Obj = this->getObj();
> +void ObjFile<ELFT>::initializeSections(bool ignoreComdats) {
> + const ELFFile<ELFT> &obj = this->getObj();
>
> - ArrayRef<Elf_Shdr> ObjSections = CHECK(Obj.sections(), this);
> - uint64_t Size = ObjSections.size();
> - this->Sections.resize(Size);
> - this->SectionStringTable =
> - CHECK(Obj.getSectionStringTable(ObjSections), this);
> + ArrayRef<Elf_Shdr> objSections = CHECK(obj.sections(), this);
> + uint64_t size = objSections.size();
> + this->sections.resize(size);
> + this->sectionStringTable =
> + CHECK(obj.getSectionStringTable(objSections), this);
>
> - for (size_t I = 0, E = ObjSections.size(); I < E; I++) {
> - if (this->Sections[I] == &InputSection::Discarded)
> + for (size_t i = 0, e = objSections.size(); i < e; i++) {
> + if (this->sections[i] == &InputSection::discarded)
> continue;
> - const Elf_Shdr &Sec = ObjSections[I];
> + const Elf_Shdr &sec = objSections[i];
>
> - if (Sec.sh_type == ELF::SHT_LLVM_CALL_GRAPH_PROFILE)
> - CGProfile =
> - check(Obj.template
> getSectionContentsAsArray<Elf_CGProfile>(&Sec));
> + if (sec.sh_type == ELF::SHT_LLVM_CALL_GRAPH_PROFILE)
> + cgProfile =
> + check(obj.template
> getSectionContentsAsArray<Elf_CGProfile>(&sec));
>
> // SHF_EXCLUDE'ed sections are discarded by the linker. However,
> // if -r is given, we'll let the final link discard such sections.
> // This is compatible with GNU.
> - if ((Sec.sh_flags & SHF_EXCLUDE) && !Config->Relocatable) {
> - if (Sec.sh_type == SHT_LLVM_ADDRSIG) {
> + if ((sec.sh_flags & SHF_EXCLUDE) && !config->relocatable) {
> + if (sec.sh_type == SHT_LLVM_ADDRSIG) {
> // We ignore the address-significance table if we know that
> the object
> // file was created by objcopy or ld -r. This is because
> these tools
> // will reorder the symbols in the symbol table, invalidating
> the data
> // in the address-significance table, which refers to symbols
> by index.
> - if (Sec.sh_link != 0)
> - this->AddrsigSec = &Sec;
> - else if (Config->ICF == ICFLevel::Safe)
> + if (sec.sh_link != 0)
> + this->addrsigSec = &sec;
> + else if (config->icf == ICFLevel::Safe)
> warn(toString(this) + ": --icf=safe is incompatible with
> object "
> "files created using objcopy or ld
> -r");
> }
> - this->Sections[I] = &InputSection::Discarded;
> + this->sections[i] = &InputSection::discarded;
> continue;
> }
>
> - switch (Sec.sh_type) {
> + switch (sec.sh_type) {
> case SHT_GROUP: {
> // De-duplicate section groups by their signatures.
> - StringRef Signature = getShtGroupSignature(ObjSections, Sec);
> - this->Sections[I] = &InputSection::Discarded;
> + StringRef signature = getShtGroupSignature(objSections, sec);
> + this->sections[i] = &InputSection::discarded;
>
>
> - ArrayRef<Elf_Word> Entries =
> - CHECK(Obj.template
> getSectionContentsAsArray<Elf_Word>(&Sec), this);
> - if (Entries.empty())
> + ArrayRef<Elf_Word> entries =
> + CHECK(obj.template
> getSectionContentsAsArray<Elf_Word>(&sec), this);
> + if (entries.empty())
> fatal(toString(this) + ": empty SHT_GROUP");
>
> // The first word of a SHT_GROUP section contains flags.
> Currently,
> // the standard defines only "GRP_COMDAT" flag for the COMDAT
> group.
> // An group with the empty flag doesn't define anything; such
> sections
> // are just skipped.
> - if (Entries[0] == 0)
> + if (entries[0] == 0)
> continue;
>
> - if (Entries[0] != GRP_COMDAT)
> + if (entries[0] != GRP_COMDAT)
> fatal(toString(this) + ": unsupported SHT_GROUP format");
>
> - bool IsNew =
> - IgnoreComdats ||
> -
> Symtab->ComdatGroups.try_emplace(CachedHashStringRef(Signature), this)
> + bool isNew =
> + ignoreComdats ||
> +
> symtab->comdatGroups.try_emplace(CachedHashStringRef(signature), this)
> .second;
> - if (IsNew) {
> - if (Config->Relocatable)
> - this->Sections[I] = createInputSection(Sec);
> + if (isNew) {
> + if (config->relocatable)
> + this->sections[i] = createInputSection(sec);
> continue;
> }
>
> // Otherwise, discard group members.
> - for (uint32_t SecIndex : Entries.slice(1)) {
> - if (SecIndex >= Size)
> + for (uint32_t secIndex : entries.slice(1)) {
> + if (secIndex >= size)
> fatal(toString(this) +
> - ": invalid section index in group: " +
> Twine(SecIndex));
> - this->Sections[SecIndex] = &InputSection::Discarded;
> + ": invalid section index in group: " +
> Twine(secIndex));
> + this->sections[secIndex] = &InputSection::discarded;
> }
> break;
> }
> case SHT_SYMTAB_SHNDX:
> - ShndxTable = CHECK(Obj.getSHNDXTable(Sec, ObjSections), this);
> + shndxTable = CHECK(obj.getSHNDXTable(sec, objSections), this);
> break;
> case SHT_SYMTAB:
> case SHT_STRTAB:
> case SHT_NULL:
> break;
> default:
> - this->Sections[I] = createInputSection(Sec);
> + this->sections[i] = createInputSection(sec);
> }
>
> // .ARM.exidx sections have a reverse dependency on the
> InputSection they
> // have a SHF_LINK_ORDER dependency, this is identified by the
> sh_link.
> - if (Sec.sh_flags & SHF_LINK_ORDER) {
> - InputSectionBase *LinkSec = nullptr;
> - if (Sec.sh_link < this->Sections.size())
> - LinkSec = this->Sections[Sec.sh_link];
> - if (!LinkSec)
> + if (sec.sh_flags & SHF_LINK_ORDER) {
> + InputSectionBase *linkSec = nullptr;
> + if (sec.sh_link < this->sections.size())
> + linkSec = this->sections[sec.sh_link];
> + if (!linkSec)
> fatal(toString(this) +
> - ": invalid sh_link index: " + Twine(Sec.sh_link));
> + ": invalid sh_link index: " + Twine(sec.sh_link));
>
> - InputSection *IS = cast<InputSection>(this->Sections[I]);
> - LinkSec->DependentSections.push_back(IS);
> - if (!isa<InputSection>(LinkSec))
> - error("a section " + IS->Name +
> + InputSection *isec = cast<InputSection>(this->sections[i]);
> + linkSec->dependentSections.push_back(isec);
> + if (!isa<InputSection>(linkSec))
> + error("a section " + isec->name +
> " with SHF_LINK_ORDER should not refer a non-regular "
> "section: " +
> - toString(LinkSec));
> + toString(linkSec));
> }
> }
> }
> @@ -675,9 +675,9 @@ void ObjFile<ELFT>::initializeSections(b
> // For ARM only, to set the EF_ARM_ABI_FLOAT_SOFT or
> EF_ARM_ABI_FLOAT_HARD
> // flag in the ELF Header we need to look at Tag_ABI_VFP_args to find
> out how
> // the input objects have been compiled.
> -static void updateARMVFPArgs(const ARMAttributeParser &Attributes,
> - const InputFile *F) {
> - if (!Attributes.hasAttribute(ARMBuildAttrs::ABI_VFP_args))
> +static void updateARMVFPArgs(const ARMAttributeParser &attributes,
> + const InputFile *f) {
> + if (!attributes.hasAttribute(ARMBuildAttrs::ABI_VFP_args))
> // If an ABI tag isn't present then it is implicitly given the
> value of 0
> // which maps to ARMBuildAttrs::BaseAAPCS. However many assembler
> files,
> // including some in glibc that don't use FP args (and should
> have value 3)
> @@ -685,31 +685,31 @@ static void updateARMVFPArgs(const ARMAt
> // as a clash.
> return;
>
> - unsigned VFPArgs =
> Attributes.getAttributeValue(ARMBuildAttrs::ABI_VFP_args);
> - ARMVFPArgKind Arg;
> - switch (VFPArgs) {
> + unsigned vfpArgs =
> attributes.getAttributeValue(ARMBuildAttrs::ABI_VFP_args);
> + ARMVFPArgKind arg;
> + switch (vfpArgs) {
> case ARMBuildAttrs::BaseAAPCS:
> - Arg = ARMVFPArgKind::Base;
> + arg = ARMVFPArgKind::Base;
> break;
> case ARMBuildAttrs::HardFPAAPCS:
> - Arg = ARMVFPArgKind::VFP;
> + arg = ARMVFPArgKind::VFP;
> break;
> case ARMBuildAttrs::ToolChainFPPCS:
> // Tool chain specific convention that conforms to neither AAPCS
> variant.
> - Arg = ARMVFPArgKind::ToolChain;
> + arg = ARMVFPArgKind::ToolChain;
> break;
> case ARMBuildAttrs::CompatibleFPAAPCS:
> // Object compatible with all conventions.
> return;
> default:
> - error(toString(F) + ": unknown Tag_ABI_VFP_args value: " +
> Twine(VFPArgs));
> + error(toString(f) + ": unknown Tag_ABI_VFP_args value: " +
> Twine(vfpArgs));
> return;
> }
> // Follow ld.bfd and error if there is a mix of calling conventions.
> - if (Config->ARMVFPArgs != Arg && Config->ARMVFPArgs !=
> ARMVFPArgKind::Default)
> - error(toString(F) + ": incompatible Tag_ABI_VFP_args");
> + if (config->armVFPArgs != arg && config->armVFPArgs !=
> ARMVFPArgKind::Default)
> + error(toString(f) + ": incompatible Tag_ABI_VFP_args");
> else
> - Config->ARMVFPArgs = Arg;
> + config->armVFPArgs = arg;
> }
>
> // The ARM support in lld makes some use of instructions that are not
> available
> @@ -721,11 +721,11 @@ static void updateARMVFPArgs(const ARMAt
> // at compile time. We follow the convention that if at least one
> input object
> // is compiled with an architecture that supports these features then
> lld is
> // permitted to use them.
> -static void updateSupportedARMFeatures(const ARMAttributeParser
> &Attributes) {
> - if (!Attributes.hasAttribute(ARMBuildAttrs::CPU_arch))
> +static void updateSupportedARMFeatures(const ARMAttributeParser
> &attributes) {
> + if (!attributes.hasAttribute(ARMBuildAttrs::CPU_arch))
> return;
> - auto Arch = Attributes.getAttributeValue(ARMBuildAttrs::CPU_arch);
> - switch (Arch) {
> + auto arch = attributes.getAttributeValue(ARMBuildAttrs::CPU_arch);
> + switch (arch) {
> case ARMBuildAttrs::Pre_v4:
> case ARMBuildAttrs::v4:
> case ARMBuildAttrs::v4T:
> @@ -737,19 +737,19 @@ static void updateSupportedARMFeatures(c
> case ARMBuildAttrs::v6:
> case ARMBuildAttrs::v6KZ:
> case ARMBuildAttrs::v6K:
> - Config->ARMHasBlx = true;
> + config->armHasBlx = true;
> // Architectures used in pre-Cortex processors do not support
> // The J1 = 1 J2 = 1 Thumb branch range extension, with the
> exception
> // of Architecture v6T2 (arm1156t2-s and arm1156t2f-s) that do.
> break;
> default:
> // All other Architectures have BLX and extended branch encoding
> - Config->ARMHasBlx = true;
> - Config->ARMJ1J2BranchEncoding = true;
> - if (Arch != ARMBuildAttrs::v6_M && Arch != ARMBuildAttrs::v6S_M)
> + config->armHasBlx = true;
> + config->armJ1J2BranchEncoding = true;
> + if (arch != ARMBuildAttrs::v6_M && arch != ARMBuildAttrs::v6S_M)
> // All Architectures used in Cortex processors with the
> exception
> // of v6-M and v6S-M have the MOVT and MOVW instructions.
> - Config->ARMHasMovtMovw = true;
> + config->armHasMovtMovw = true;
> break;
> }
> }
> @@ -767,126 +767,126 @@ static void updateSupportedARMFeatures(c
> // certain type. It seems a bit too much to just store a 32-bit
> value, perhaps
> // the ABI is unnecessarily complicated.
> template <class ELFT>
> -static uint32_t readAndFeatures(ObjFile<ELFT> *Obj, ArrayRef<uint8_t>
> Data) {
> +static uint32_t readAndFeatures(ObjFile<ELFT> *obj, ArrayRef<uint8_t>
> data) {
> using Elf_Nhdr = typename ELFT::Nhdr;
> using Elf_Note = typename ELFT::Note;
>
> - uint32_t FeaturesSet = 0;
> - while (!Data.empty()) {
> + uint32_t featuresSet = 0;
> + while (!data.empty()) {
> // Read one NOTE record.
> - if (Data.size() < sizeof(Elf_Nhdr))
> - fatal(toString(Obj) + ": .note.gnu.property: section too
> short");
> + if (data.size() < sizeof(Elf_Nhdr))
> + fatal(toString(obj) + ": .note.gnu.property: section too
> short");
>
> - auto *Nhdr = reinterpret_cast<const Elf_Nhdr *>(Data.data());
> - if (Data.size() < Nhdr->getSize())
> - fatal(toString(Obj) + ": .note.gnu.property: section too
> short");
> -
> - Elf_Note Note(*Nhdr);
> - if (Nhdr->n_type != NT_GNU_PROPERTY_TYPE_0 || Note.getName() !=
> "GNU") {
> - Data = Data.slice(Nhdr->getSize());
> + auto *nhdr = reinterpret_cast<const Elf_Nhdr *>(data.data());
> + if (data.size() < nhdr->getSize())
> + fatal(toString(obj) + ": .note.gnu.property: section too
> short");
> +
> + Elf_Note note(*nhdr);
> + if (nhdr->n_type != NT_GNU_PROPERTY_TYPE_0 || note.getName() !=
> "GNU") {
> + data = data.slice(nhdr->getSize());
> continue;
> }
>
> - uint32_t FeatureAndType = Config->EMachine == EM_AARCH64
> + uint32_t featureAndType = config->emachine == EM_AARCH64
> ? GNU_PROPERTY_AARCH64_FEATURE_1_AND
> : GNU_PROPERTY_X86_FEATURE_1_AND;
>
> // Read a body of a NOTE record, which consists of
> type-length-value fields.
> - ArrayRef<uint8_t> Desc = Note.getDesc();
> - while (!Desc.empty()) {
> - if (Desc.size() < 8)
> - fatal(toString(Obj) + ": .note.gnu.property: section too
> short");
> + ArrayRef<uint8_t> desc = note.getDesc();
> + while (!desc.empty()) {
> + if (desc.size() < 8)
> + fatal(toString(obj) + ": .note.gnu.property: section too
> short");
>
> - uint32_t Type = read32le(Desc.data());
> - uint32_t Size = read32le(Desc.data() + 4);
> + uint32_t type = read32le(desc.data());
> + uint32_t size = read32le(desc.data() + 4);
>
> - if (Type == FeatureAndType) {
> + if (type == featureAndType) {
> // We found a FEATURE_1_AND field. There may be more than one
> of these
> // in a .note.gnu.propery section, for a relocatable object we
> // accumulate the bits set.
> - FeaturesSet |= read32le(Desc.data() + 8);
> + featuresSet |= read32le(desc.data() + 8);
> }
>
> // On 64-bit, a payload may be followed by a 4-byte padding to
> make its
> // size a multiple of 8.
> if (ELFT::Is64Bits)
> - Size = alignTo(Size, 8);
> + size = alignTo(size, 8);
>
> - Desc = Desc.slice(Size + 8); // +8 for Type and Size
> + desc = desc.slice(size + 8); // +8 for Type and Size
> }
>
> // Go to next NOTE record to look for more FEATURE_1_AND
> descriptions.
> - Data = Data.slice(Nhdr->getSize());
> + data = data.slice(nhdr->getSize());
> }
>
> - return FeaturesSet;
> + return featuresSet;
> }
>
> template <class ELFT>
> -InputSectionBase *ObjFile<ELFT>::getRelocTarget(const Elf_Shdr &Sec) {
> - uint32_t Idx = Sec.sh_info;
> - if (Idx >= this->Sections.size())
> - fatal(toString(this) + ": invalid relocated section index: " +
> Twine(Idx));
> - InputSectionBase *Target = this->Sections[Idx];
> +InputSectionBase *ObjFile<ELFT>::getRelocTarget(const Elf_Shdr &sec) {
> + uint32_t idx = sec.sh_info;
> + if (idx >= this->sections.size())
> + fatal(toString(this) + ": invalid relocated section index: " +
> Twine(idx));
> + InputSectionBase *target = this->sections[idx];
>
> // Strictly speaking, a relocation section must be included in the
> // group of the section it relocates. However, LLVM 3.3 and earlier
> // would fail to do so, so we gracefully handle that case.
> - if (Target == &InputSection::Discarded)
> + if (target == &InputSection::discarded)
> return nullptr;
>
> - if (!Target)
> + if (!target)
> fatal(toString(this) + ": unsupported relocation reference");
> - return Target;
> + return target;
> }
>
> // Create a regular InputSection class that has the same contents
> // as a given section.
> -static InputSection *toRegularSection(MergeInputSection *Sec) {
> - return make<InputSection>(Sec->File, Sec->Flags, Sec->Type,
> Sec->Alignment,
> - Sec->data(), Sec->Name);
> +static InputSection *toRegularSection(MergeInputSection *sec) {
> + return make<InputSection>(sec->file, sec->flags, sec->type,
> sec->alignment,
> + sec->data(), sec->name);
> }
>
> template <class ELFT>
> -InputSectionBase *ObjFile<ELFT>::createInputSection(const Elf_Shdr
> &Sec) {
> - StringRef Name = getSectionName(Sec);
> +InputSectionBase *ObjFile<ELFT>::createInputSection(const Elf_Shdr
> &sec) {
> + StringRef name = getSectionName(sec);
>
> - switch (Sec.sh_type) {
> + switch (sec.sh_type) {
> case SHT_ARM_ATTRIBUTES: {
> - if (Config->EMachine != EM_ARM)
> + if (config->emachine != EM_ARM)
> break;
> - ARMAttributeParser Attributes;
> - ArrayRef<uint8_t> Contents =
> check(this->getObj().getSectionContents(&Sec));
> - Attributes.Parse(Contents, /*isLittle*/ Config->EKind ==
> ELF32LEKind);
> - updateSupportedARMFeatures(Attributes);
> - updateARMVFPArgs(Attributes, this);
> + ARMAttributeParser attributes;
> + ArrayRef<uint8_t> contents =
> check(this->getObj().getSectionContents(&sec));
> + attributes.Parse(contents, /*isLittle*/ config->ekind ==
> ELF32LEKind);
> + updateSupportedARMFeatures(attributes);
> + updateARMVFPArgs(attributes, this);
>
> // FIXME: Retain the first attribute section we see. The eglibc
> ARM
> // dynamic loaders require the presence of an attribute section
> for dlopen
> // to work. In a full implementation we would merge all attribute
> sections.
> - if (In.ARMAttributes == nullptr) {
> - In.ARMAttributes = make<InputSection>(*this, Sec, Name);
> - return In.ARMAttributes;
> + if (in.armAttributes == nullptr) {
> + in.armAttributes = make<InputSection>(*this, sec, name);
> + return in.armAttributes;
> }
> - return &InputSection::Discarded;
> + return &InputSection::discarded;
> }
> case SHT_LLVM_DEPENDENT_LIBRARIES: {
> - if (Config->Relocatable)
> + if (config->relocatable)
> break;
> - ArrayRef<char> Data =
> - CHECK(this->getObj().template
> getSectionContentsAsArray<char>(&Sec), this);
> - if (!Data.empty() && Data.back() != '\0') {
> + ArrayRef<char> data =
> + CHECK(this->getObj().template
> getSectionContentsAsArray<char>(&sec), this);
> + if (!data.empty() && data.back() != '\0') {
> error(toString(this) +
> ": corrupted dependent libraries section (unterminated
> string): " +
> - Name);
> - return &InputSection::Discarded;
> + name);
> + return &InputSection::discarded;
> }
> - for (const char *D = Data.begin(), *E = Data.end(); D < E;) {
> - StringRef S(D);
> - addDependentLibrary(S, this);
> - D += S.size() + 1;
> + for (const char *d = data.begin(), *e = data.end(); d < e;) {
> + StringRef s(d);
> + addDependentLibrary(s, this);
> + d += s.size() + 1;
> }
> - return &InputSection::Discarded;
> + return &InputSection::discarded;
> }
> case SHT_RELA:
> case SHT_REL: {
> @@ -895,25 +895,25 @@ InputSectionBase *ObjFile<ELFT>::createI
> // and the group is discarded, even though it's a violation of the
> // spec. We handle that situation gracefully by discarding
> dangling
> // relocation sections.
> - InputSectionBase *Target = getRelocTarget(Sec);
> - if (!Target)
> + InputSectionBase *target = getRelocTarget(sec);
> + if (!target)
> return nullptr;
>
> // This section contains relocation information.
> // If -r is given, we do not interpret or apply relocation
> // but just copy relocation sections to output.
> - if (Config->Relocatable) {
> - InputSection *RelocSec = make<InputSection>(*this, Sec, Name);
> + if (config->relocatable) {
> + InputSection *relocSec = make<InputSection>(*this, sec, name);
> // We want to add a dependency to target, similar like we do for
> // -emit-relocs below. This is useful for the case when linker
> script
> // contains the "/DISCARD/". It is perhaps uncommon to use a
> script with
> // -r, but we faced it in the Linux kernel and have to handle
> such case
> // and not to crash.
> - Target->DependentSections.push_back(RelocSec);
> - return RelocSec;
> + target->dependentSections.push_back(relocSec);
> + return relocSec;
> }
>
> - if (Target->FirstRelocation)
> + if (target->firstRelocation)
> fatal(toString(this) +
> ": multiple relocation sections to one section are not
> supported");
>
> @@ -922,33 +922,33 @@ InputSectionBase *ObjFile<ELFT>::createI
> // because applying relocations at end of linking changes section
> // contents. So, we simply handle such sections as non-mergeable
> ones.
> // Degrading like this is acceptable because section merging is
> optional.
> - if (auto *MS = dyn_cast<MergeInputSection>(Target)) {
> - Target = toRegularSection(MS);
> - this->Sections[Sec.sh_info] = Target;
> + if (auto *ms = dyn_cast<MergeInputSection>(target)) {
> + target = toRegularSection(ms);
> + this->sections[sec.sh_info] = target;
> }
>
> - if (Sec.sh_type == SHT_RELA) {
> - ArrayRef<Elf_Rela> Rels = CHECK(getObj().relas(&Sec), this);
> - Target->FirstRelocation = Rels.begin();
> - Target->NumRelocations = Rels.size();
> - Target->AreRelocsRela = true;
> + if (sec.sh_type == SHT_RELA) {
> + ArrayRef<Elf_Rela> rels = CHECK(getObj().relas(&sec), this);
> + target->firstRelocation = rels.begin();
> + target->numRelocations = rels.size();
> + target->areRelocsRela = true;
> } else {
> - ArrayRef<Elf_Rel> Rels = CHECK(getObj().rels(&Sec), this);
> - Target->FirstRelocation = Rels.begin();
> - Target->NumRelocations = Rels.size();
> - Target->AreRelocsRela = false;
> + ArrayRef<Elf_Rel> rels = CHECK(getObj().rels(&sec), this);
> + target->firstRelocation = rels.begin();
> + target->numRelocations = rels.size();
> + target->areRelocsRela = false;
> }
> - assert(isUInt<31>(Target->NumRelocations));
> + assert(isUInt<31>(target->numRelocations));
>
> // Relocation sections processed by the linker are usually removed
> // from the output, so returning `nullptr` for the normal case.
> // However, if -emit-relocs is given, we need to leave them in
> the output.
> // (Some post link analysis tools need this information.)
> - if (Config->EmitRelocs) {
> - InputSection *RelocSec = make<InputSection>(*this, Sec, Name);
> + if (config->emitRelocs) {
> + InputSection *relocSec = make<InputSection>(*this, sec, name);
> // We will not emit relocation section if target was discarded.
> - Target->DependentSections.push_back(RelocSec);
> - return RelocSec;
> + target->dependentSections.push_back(relocSec);
> + return relocSec;
> }
> return nullptr;
> }
> @@ -967,8 +967,8 @@ InputSectionBase *ObjFile<ELFT>::createI
> // explicitly told to do otherwise (by -z execstack). Because the
> stack
> // executable-ness is controlled solely by command line options,
> // .note.GNU-stack sections are simply ignored.
> - if (Name == ".note.GNU-stack")
> - return &InputSection::Discarded;
> + if (name == ".note.GNU-stack")
> + return &InputSection::discarded;
>
> // Object files that use processor features such as Intel
> Control-Flow
> // Enforcement (CET) or AArch64 Branch Target Identification BTI,
> use a
> @@ -978,31 +978,31 @@ InputSectionBase *ObjFile<ELFT>::createI
> // Since we merge bitmaps from multiple object files to create a new
> // .note.gnu.property containing a single AND'ed bitmap, we discard
> an input
> // file's .note.gnu.property section.
> - if (Name == ".note.gnu.property") {
> - ArrayRef<uint8_t> Contents =
> check(this->getObj().getSectionContents(&Sec));
> - this->AndFeatures = readAndFeatures(this, Contents);
> - return &InputSection::Discarded;
> + if (name == ".note.gnu.property") {
> + ArrayRef<uint8_t> contents =
> check(this->getObj().getSectionContents(&sec));
> + this->andFeatures = readAndFeatures(this, contents);
> + return &InputSection::discarded;
> }
>
> // Split stacks is a feature to support a discontiguous stack,
> // commonly used in the programming language Go. For the details,
> // see https://gcc.gnu.org/wiki/SplitStacks. An object file
> compiled
> // for split stack will include a .note.GNU-split-stack section.
> - if (Name == ".note.GNU-split-stack") {
> - if (Config->Relocatable) {
> + if (name == ".note.GNU-split-stack") {
> + if (config->relocatable) {
> error("cannot mix split-stack and non-split-stack in a
> relocatable link");
> - return &InputSection::Discarded;
> + return &InputSection::discarded;
> }
> - this->SplitStack = true;
> - return &InputSection::Discarded;
> + this->splitStack = true;
> + return &InputSection::discarded;
> }
>
> // An object file cmpiled for split stack, but where some of the
> // functions were compiled with the no_split_stack_attribute will
> // include a .note.GNU-no-split-stack section.
> - if (Name == ".note.GNU-no-split-stack") {
> - this->SomeNoSplitStack = true;
> - return &InputSection::Discarded;
> + if (name == ".note.GNU-no-split-stack") {
> + this->someNoSplitStack = true;
> + return &InputSection::discarded;
> }
>
> // The linkonce feature is a sort of proto-comdat. Some glibc i386
> object
> @@ -1010,98 +1010,98 @@ InputSectionBase *ObjFile<ELFT>::createI
> // sections. Drop those sections to avoid duplicate symbol errors.
> // FIXME: This is glibc PR20543, we should remove this hack once
> that has been
> // fixed for a while.
> - if (Name == ".gnu.linkonce.t.__x86.get_pc_thunk.bx" ||
> - Name == ".gnu.linkonce.t.__i686.get_pc_thunk.bx")
> - return &InputSection::Discarded;
> + if (name == ".gnu.linkonce.t.__x86.get_pc_thunk.bx" ||
> + name == ".gnu.linkonce.t.__i686.get_pc_thunk.bx")
> + return &InputSection::discarded;
>
> // If we are creating a new .build-id section, strip existing
> .build-id
> // sections so that the output won't have more than one .build-id.
> // This is not usually a problem because input object files
> normally don't
> // have .build-id sections, but you can create such files by
> // "ld.{bfd,gold,lld} -r --build-id", and we want to guard against
> it.
> - if (Name == ".note.gnu.build-id" && Config->BuildId !=
> BuildIdKind::None)
> - return &InputSection::Discarded;
> + if (name == ".note.gnu.build-id" && config->buildId !=
> BuildIdKind::None)
> + return &InputSection::discarded;
>
> // The linker merges EH (exception handling) frames and creates a
> // .eh_frame_hdr section for runtime. So we handle them with a
> special
> // class. For relocatable outputs, they are just passed through.
> - if (Name == ".eh_frame" && !Config->Relocatable)
> - return make<EhInputSection>(*this, Sec, Name);
> + if (name == ".eh_frame" && !config->relocatable)
> + return make<EhInputSection>(*this, sec, name);
>
> - if (shouldMerge(Sec))
> - return make<MergeInputSection>(*this, Sec, Name);
> - return make<InputSection>(*this, Sec, Name);
> + if (shouldMerge(sec))
> + return make<MergeInputSection>(*this, sec, name);
> + return make<InputSection>(*this, sec, name);
> }
>
> template <class ELFT>
> -StringRef ObjFile<ELFT>::getSectionName(const Elf_Shdr &Sec) {
> - return CHECK(getObj().getSectionName(&Sec, SectionStringTable),
> this);
> +StringRef ObjFile<ELFT>::getSectionName(const Elf_Shdr &sec) {
> + return CHECK(getObj().getSectionName(&sec, sectionStringTable),
> this);
> }
>
> // Initialize this->Symbols. this->Symbols is a parallel array as
> // its corresponding ELF symbol table.
> template <class ELFT> void ObjFile<ELFT>::initializeSymbols() {
> - ArrayRef<Elf_Sym> ESyms = this->getELFSyms<ELFT>();
> - this->Symbols.resize(ESyms.size());
> + ArrayRef<Elf_Sym> eSyms = this->getELFSyms<ELFT>();
> + this->symbols.resize(eSyms.size());
>
> // Our symbol table may have already been partially initialized
> // because of LazyObjFile.
> - for (size_t I = 0, End = ESyms.size(); I != End; ++I)
> - if (!this->Symbols[I] && ESyms[I].getBinding() != STB_LOCAL)
> - this->Symbols[I] =
> - Symtab->insert(CHECK(ESyms[I].getName(this->StringTable),
> this));
> + for (size_t i = 0, end = eSyms.size(); i != end; ++i)
> + if (!this->symbols[i] && eSyms[i].getBinding() != STB_LOCAL)
> + this->symbols[i] =
> + symtab->insert(CHECK(eSyms[i].getName(this->stringTable),
> this));
>
> // Fill this->Symbols. A symbol is either local or global.
> - for (size_t I = 0, End = ESyms.size(); I != End; ++I) {
> - const Elf_Sym &ESym = ESyms[I];
> + for (size_t i = 0, end = eSyms.size(); i != end; ++i) {
> + const Elf_Sym &eSym = eSyms[i];
>
> // Read symbol attributes.
> - uint32_t SecIdx = getSectionIndex(ESym);
> - if (SecIdx >= this->Sections.size())
> - fatal(toString(this) + ": invalid section index: " +
> Twine(SecIdx));
> -
> - InputSectionBase *Sec = this->Sections[SecIdx];
> - uint8_t Binding = ESym.getBinding();
> - uint8_t StOther = ESym.st_other;
> - uint8_t Type = ESym.getType();
> - uint64_t Value = ESym.st_value;
> - uint64_t Size = ESym.st_size;
> - StringRefZ Name = this->StringTable.data() + ESym.st_name;
> + uint32_t secIdx = getSectionIndex(eSym);
> + if (secIdx >= this->sections.size())
> + fatal(toString(this) + ": invalid section index: " +
> Twine(secIdx));
> +
> + InputSectionBase *sec = this->sections[secIdx];
> + uint8_t binding = eSym.getBinding();
> + uint8_t stOther = eSym.st_other;
> + uint8_t type = eSym.getType();
> + uint64_t value = eSym.st_value;
> + uint64_t size = eSym.st_size;
> + StringRefZ name = this->stringTable.data() + eSym.st_name;
>
> // Handle local symbols. Local symbols are not added to the symbol
> // table because they are not visible from other object files. We
> // allocate symbol instances and add their pointers to Symbols.
> - if (Binding == STB_LOCAL) {
> - if (ESym.getType() == STT_FILE)
> - SourceFile = CHECK(ESym.getName(this->StringTable), this);
> + if (binding == STB_LOCAL) {
> + if (eSym.getType() == STT_FILE)
> + sourceFile = CHECK(eSym.getName(this->stringTable), this);
>
> - if (this->StringTable.size() <= ESym.st_name)
> + if (this->stringTable.size() <= eSym.st_name)
> fatal(toString(this) + ": invalid symbol name offset");
>
> - if (ESym.st_shndx == SHN_UNDEF)
> - this->Symbols[I] = make<Undefined>(this, Name, Binding,
> StOther, Type);
> - else if (Sec == &InputSection::Discarded)
> - this->Symbols[I] = make<Undefined>(this, Name, Binding,
> StOther, Type,
> -
> /*DiscardedSecIdx=*/SecIdx);
> + if (eSym.st_shndx == SHN_UNDEF)
> + this->symbols[i] = make<Undefined>(this, name, binding,
> stOther, type);
> + else if (sec == &InputSection::discarded)
> + this->symbols[i] = make<Undefined>(this, name, binding,
> stOther, type,
> +
> /*DiscardedSecIdx=*/secIdx);
> else
> - this->Symbols[I] =
> - make<Defined>(this, Name, Binding, StOther, Type, Value,
> Size, Sec);
> + this->symbols[i] =
> + make<Defined>(this, name, binding, stOther, type, value,
> size, sec);
> continue;
> }
>
> // Handle global undefined symbols.
> - if (ESym.st_shndx == SHN_UNDEF) {
> - this->Symbols[I]->resolve(Undefined{this, Name, Binding,
> StOther, Type});
> + if (eSym.st_shndx == SHN_UNDEF) {
> + this->symbols[i]->resolve(Undefined{this, name, binding,
> stOther, type});
> continue;
> }
>
> // Handle global common symbols.
> - if (ESym.st_shndx == SHN_COMMON) {
> - if (Value == 0 || Value >= UINT32_MAX)
> - fatal(toString(this) + ": common symbol '" +
> StringRef(Name.Data) +
> - "' has invalid alignment: " + Twine(Value));
> - this->Symbols[I]->resolve(
> - CommonSymbol{this, Name, Binding, StOther, Type, Value,
> Size});
> + if (eSym.st_shndx == SHN_COMMON) {
> + if (value == 0 || value >= UINT32_MAX)
> + fatal(toString(this) + ": common symbol '" +
> StringRef(name.data) +
> + "' has invalid alignment: " + Twine(value));
> + this->symbols[i]->resolve(
> + CommonSymbol{this, name, binding, stOther, type, value,
> size});
> continue;
> }
>
> @@ -1110,87 +1110,87 @@ template <class ELFT> void ObjFile<ELFT>
> // standard, but in practice, a .eh_frame often directly refer
> // COMDAT member sections, and if a comdat group is discarded,
> some
> // defined symbol in a .eh_frame becomes dangling symbols.
> - if (Sec == &InputSection::Discarded) {
> - this->Symbols[I]->resolve(
> - Undefined{this, Name, Binding, StOther, Type, SecIdx});
> + if (sec == &InputSection::discarded) {
> + this->symbols[i]->resolve(
> + Undefined{this, name, binding, stOther, type, secIdx});
> continue;
> }
>
> // Handle global defined symbols.
> - if (Binding == STB_GLOBAL || Binding == STB_WEAK ||
> - Binding == STB_GNU_UNIQUE) {
> - this->Symbols[I]->resolve(
> - Defined{this, Name, Binding, StOther, Type, Value, Size,
> Sec});
> + if (binding == STB_GLOBAL || binding == STB_WEAK ||
> + binding == STB_GNU_UNIQUE) {
> + this->symbols[i]->resolve(
> + Defined{this, name, binding, stOther, type, value, size,
> sec});
> continue;
> }
>
> - fatal(toString(this) + ": unexpected binding: " +
> Twine((int)Binding));
> + fatal(toString(this) + ": unexpected binding: " +
> Twine((int)binding));
> }
> }
>
> -ArchiveFile::ArchiveFile(std::unique_ptr<Archive> &&File)
> - : InputFile(ArchiveKind, File->getMemoryBufferRef()),
> - File(std::move(File)) {}
> +ArchiveFile::ArchiveFile(std::unique_ptr<Archive> &&file)
> + : InputFile(ArchiveKind, file->getMemoryBufferRef()),
> + file(std::move(file)) {}
>
> void ArchiveFile::parse() {
> - for (const Archive::Symbol &Sym : File->symbols())
> - Symtab->addSymbol(LazyArchive{*this, Sym});
> + for (const Archive::Symbol &sym : file->symbols())
> + symtab->addSymbol(LazyArchive{*this, sym});
> }
>
> // Returns a buffer pointing to a member file containing a given
> symbol.
> -void ArchiveFile::fetch(const Archive::Symbol &Sym) {
> - Archive::Child C =
> - CHECK(Sym.getMember(), toString(this) +
> +void ArchiveFile::fetch(const Archive::Symbol &sym) {
> + Archive::Child c =
> + CHECK(sym.getMember(), toString(this) +
> ": could not get the member for
> symbol " +
> - Sym.getName());
> + sym.getName());
>
> - if (!Seen.insert(C.getChildOffset()).second)
> + if (!seen.insert(c.getChildOffset()).second)
> return;
>
> - MemoryBufferRef MB =
> - CHECK(C.getMemoryBufferRef(),
> + MemoryBufferRef mb =
> + CHECK(c.getMemoryBufferRef(),
> toString(this) +
> ": could not get the buffer for the member defining
> symbol " +
> - Sym.getName());
> + sym.getName());
>
> - if (Tar && C.getParent()->isThin())
> - Tar->append(relativeToRoot(CHECK(C.getFullName(), this)),
> MB.getBuffer());
> + if (tar && c.getParent()->isThin())
> + tar->append(relativeToRoot(CHECK(c.getFullName(), this)),
> mb.getBuffer());
>
> - InputFile *File = createObjectFile(
> - MB, getName(), C.getParent()->isThin() ? 0 :
> C.getChildOffset());
> - File->GroupId = GroupId;
> - parseFile(File);
> + InputFile *file = createObjectFile(
> + mb, getName(), c.getParent()->isThin() ? 0 :
> c.getChildOffset());
> + file->groupId = groupId;
> + parseFile(file);
> }
>
> -unsigned SharedFile::VernauxNum;
> +unsigned SharedFile::vernauxNum;
>
> // Parse the version definitions in the object file if present, and
> return a
> // vector whose nth element contains a pointer to the Elf_Verdef for
> version
> // identifier n. Version identifiers that are not definitions map to
> nullptr.
> template <typename ELFT>
> -static std::vector<const void *> parseVerdefs(const uint8_t *Base,
> - const typename
> ELFT::Shdr *Sec) {
> - if (!Sec)
> +static std::vector<const void *> parseVerdefs(const uint8_t *base,
> + const typename
> ELFT::Shdr *sec) {
> + if (!sec)
> return {};
>
> // We cannot determine the largest verdef identifier without
> inspecting
> // every Elf_Verdef, but both bfd and gold assign verdef identifiers
> // sequentially starting from 1, so we predict that the largest
> identifier
> // will be VerdefCount.
> - unsigned VerdefCount = Sec->sh_info;
> - std::vector<const void *> Verdefs(VerdefCount + 1);
> + unsigned verdefCount = sec->sh_info;
> + std::vector<const void *> verdefs(verdefCount + 1);
>
> // Build the Verdefs array by following the chain of Elf_Verdef
> objects
> // from the start of the .gnu.version_d section.
> - const uint8_t *Verdef = Base + Sec->sh_offset;
> - for (unsigned I = 0; I != VerdefCount; ++I) {
> - auto *CurVerdef = reinterpret_cast<const typename ELFT::Verdef
> *>(Verdef);
> - Verdef += CurVerdef->vd_next;
> - unsigned VerdefIndex = CurVerdef->vd_ndx;
> - Verdefs.resize(VerdefIndex + 1);
> - Verdefs[VerdefIndex] = CurVerdef;
> + const uint8_t *verdef = base + sec->sh_offset;
> + for (unsigned i = 0; i != verdefCount; ++i) {
> + auto *curVerdef = reinterpret_cast<const typename ELFT::Verdef
> *>(verdef);
> + verdef += curVerdef->vd_next;
> + unsigned verdefIndex = curVerdef->vd_ndx;
> + verdefs.resize(verdefIndex + 1);
> + verdefs[verdefIndex] = curVerdef;
> }
> - return Verdefs;
> + return verdefs;
> }
>
> // We do not usually care about alignments of data in shared object
> @@ -1198,14 +1198,14 @@ static std::vector<const void *> parseVe
> // DSO symbol to point to .bss due to copy relocation, we need to keep
> // the original alignment requirements. We infer it in this function.
> template <typename ELFT>
> -static uint64_t getAlignment(ArrayRef<typename ELFT::Shdr> Sections,
> - const typename ELFT::Sym &Sym) {
> - uint64_t Ret = UINT64_MAX;
> - if (Sym.st_value)
> - Ret = 1ULL << countTrailingZeros((uint64_t)Sym.st_value);
> - if (0 < Sym.st_shndx && Sym.st_shndx < Sections.size())
> - Ret = std::min<uint64_t>(Ret,
> Sections[Sym.st_shndx].sh_addralign);
> - return (Ret > UINT32_MAX) ? 0 : Ret;
> +static uint64_t getAlignment(ArrayRef<typename ELFT::Shdr> sections,
> + const typename ELFT::Sym &sym) {
> + uint64_t ret = UINT64_MAX;
> + if (sym.st_value)
> + ret = 1ULL << countTrailingZeros((uint64_t)sym.st_value);
> + if (0 < sym.st_shndx && sym.st_shndx < sections.size())
> + ret = std::min<uint64_t>(ret,
> sections[sym.st_shndx].sh_addralign);
> + return (ret > UINT32_MAX) ? 0 : ret;
> }
>
> // Fully parse the shared object file.
> @@ -1230,156 +1230,156 @@ template <class ELFT> void SharedFile::p
> using Elf_Verdef = typename ELFT::Verdef;
> using Elf_Versym = typename ELFT::Versym;
>
> - ArrayRef<Elf_Dyn> DynamicTags;
> - const ELFFile<ELFT> Obj = this->getObj<ELFT>();
> - ArrayRef<Elf_Shdr> Sections = CHECK(Obj.sections(), this);
> + ArrayRef<Elf_Dyn> dynamicTags;
> + const ELFFile<ELFT> obj = this->getObj<ELFT>();
> + ArrayRef<Elf_Shdr> sections = CHECK(obj.sections(), this);
>
> - const Elf_Shdr *VersymSec = nullptr;
> - const Elf_Shdr *VerdefSec = nullptr;
> + const Elf_Shdr *versymSec = nullptr;
> + const Elf_Shdr *verdefSec = nullptr;
>
> // Search for .dynsym, .dynamic, .symtab, .gnu.version and
> .gnu.version_d.
> - for (const Elf_Shdr &Sec : Sections) {
> - switch (Sec.sh_type) {
> + for (const Elf_Shdr &sec : sections) {
> + switch (sec.sh_type) {
> default:
> continue;
> case SHT_DYNAMIC:
> - DynamicTags =
> - CHECK(Obj.template
> getSectionContentsAsArray<Elf_Dyn>(&Sec), this);
> + dynamicTags =
> + CHECK(obj.template
> getSectionContentsAsArray<Elf_Dyn>(&sec), this);
> break;
> case SHT_GNU_versym:
> - VersymSec = &Sec;
> + versymSec = &sec;
> break;
> case SHT_GNU_verdef:
> - VerdefSec = &Sec;
> + verdefSec = &sec;
> break;
> }
> }
>
> - if (VersymSec && NumELFSyms == 0) {
> + if (versymSec && numELFSyms == 0) {
> error("SHT_GNU_versym should be associated with symbol table");
> return;
> }
>
> // Search for a DT_SONAME tag to initialize this->SoName.
> - for (const Elf_Dyn &Dyn : DynamicTags) {
> - if (Dyn.d_tag == DT_NEEDED) {
> - uint64_t Val = Dyn.getVal();
> - if (Val >= this->StringTable.size())
> + for (const Elf_Dyn &dyn : dynamicTags) {
> + if (dyn.d_tag == DT_NEEDED) {
> + uint64_t val = dyn.getVal();
> + if (val >= this->stringTable.size())
> fatal(toString(this) + ": invalid DT_NEEDED entry");
> - DtNeeded.push_back(this->StringTable.data() + Val);
> - } else if (Dyn.d_tag == DT_SONAME) {
> - uint64_t Val = Dyn.getVal();
> - if (Val >= this->StringTable.size())
> + dtNeeded.push_back(this->stringTable.data() + val);
> + } else if (dyn.d_tag == DT_SONAME) {
> + uint64_t val = dyn.getVal();
> + if (val >= this->stringTable.size())
> fatal(toString(this) + ": invalid DT_SONAME entry");
> - SoName = this->StringTable.data() + Val;
> + soName = this->stringTable.data() + val;
> }
> }
>
> // DSOs are uniquified not by filename but by soname.
> - DenseMap<StringRef, SharedFile *>::iterator It;
> - bool WasInserted;
> - std::tie(It, WasInserted) = Symtab->SoNames.try_emplace(SoName,
> this);
> + DenseMap<StringRef, SharedFile *>::iterator it;
> + bool wasInserted;
> + std::tie(it, wasInserted) = symtab->soNames.try_emplace(soName,
> this);
>
> // If a DSO appears more than once on the command line with and
> without
> // --as-needed, --no-as-needed takes precedence over --as-needed
> because a
> // user can add an extra DSO with --no-as-needed to force it to be
> added to
> // the dependency list.
> - It->second->IsNeeded |= IsNeeded;
> - if (!WasInserted)
> + it->second->isNeeded |= isNeeded;
> + if (!wasInserted)
> return;
>
> - SharedFiles.push_back(this);
> + sharedFiles.push_back(this);
>
> - Verdefs = parseVerdefs<ELFT>(Obj.base(), VerdefSec);
> + verdefs = parseVerdefs<ELFT>(obj.base(), verdefSec);
>
> // Parse ".gnu.version" section which is a parallel array for the
> symbol
> // table. If a given file doesn't have a ".gnu.version" section, we
> use
> // VER_NDX_GLOBAL.
> - size_t Size = NumELFSyms - FirstGlobal;
> - std::vector<uint32_t> Versyms(Size, VER_NDX_GLOBAL);
> - if (VersymSec) {
> - ArrayRef<Elf_Versym> Versym =
> - CHECK(Obj.template
> getSectionContentsAsArray<Elf_Versym>(VersymSec),
> + size_t size = numELFSyms - firstGlobal;
> + std::vector<uint32_t> versyms(size, VER_NDX_GLOBAL);
> + if (versymSec) {
> + ArrayRef<Elf_Versym> versym =
> + CHECK(obj.template
> getSectionContentsAsArray<Elf_Versym>(versymSec),
> this)
> - .slice(FirstGlobal);
> - for (size_t I = 0; I < Size; ++I)
> - Versyms[I] = Versym[I].vs_index;
> + .slice(firstGlobal);
> + for (size_t i = 0; i < size; ++i)
> + versyms[i] = versym[i].vs_index;
> }
>
> // System libraries can have a lot of symbols with versions. Using a
> // fixed buffer for computing the versions name (foo at ver) can save
> a
> // lot of allocations.
> - SmallString<0> VersionedNameBuffer;
> + SmallString<0> versionedNameBuffer;
>
> // Add symbols to the symbol table.
> - ArrayRef<Elf_Sym> Syms = this->getGlobalELFSyms<ELFT>();
> - for (size_t I = 0; I < Syms.size(); ++I) {
> - const Elf_Sym &Sym = Syms[I];
> + ArrayRef<Elf_Sym> syms = this->getGlobalELFSyms<ELFT>();
> + for (size_t i = 0; i < syms.size(); ++i) {
> + const Elf_Sym &sym = syms[i];
>
> // ELF spec requires that all local symbols precede weak or global
> // symbols in each symbol table, and the index of first non-local
> symbol
> // is stored to sh_info. If a local symbol appears after some
> non-local
> // symbol, that's a violation of the spec.
> - StringRef Name = CHECK(Sym.getName(this->StringTable), this);
> - if (Sym.getBinding() == STB_LOCAL) {
> - warn("found local symbol '" + Name +
> + StringRef name = CHECK(sym.getName(this->stringTable), this);
> + if (sym.getBinding() == STB_LOCAL) {
> + warn("found local symbol '" + name +
> "' in global part of symbol table in file " +
> toString(this));
> continue;
> }
>
> - if (Sym.isUndefined()) {
> - Symbol *S = Symtab->addSymbol(
> - Undefined{this, Name, Sym.getBinding(), Sym.st_other,
> Sym.getType()});
> - S->ExportDynamic = true;
> + if (sym.isUndefined()) {
> + Symbol *s = symtab->addSymbol(
> + Undefined{this, name, sym.getBinding(), sym.st_other,
> sym.getType()});
> + s->exportDynamic = true;
> continue;
> }
>
> // MIPS BFD linker puts _gp_disp symbol into DSO files and
> incorrectly
> // assigns VER_NDX_LOCAL to this section global symbol. Here is a
> // workaround for this bug.
> - uint32_t Idx = Versyms[I] & ~VERSYM_HIDDEN;
> - if (Config->EMachine == EM_MIPS && Idx == VER_NDX_LOCAL &&
> - Name == "_gp_disp")
> + uint32_t idx = versyms[i] & ~VERSYM_HIDDEN;
> + if (config->emachine == EM_MIPS && idx == VER_NDX_LOCAL &&
> + name == "_gp_disp")
> continue;
>
> - uint32_t Alignment = getAlignment<ELFT>(Sections, Sym);
> - if (!(Versyms[I] & VERSYM_HIDDEN)) {
> - Symtab->addSymbol(SharedSymbol{*this, Name, Sym.getBinding(),
> - Sym.st_other, Sym.getType(),
> Sym.st_value,
> - Sym.st_size, Alignment, Idx});
> + uint32_t alignment = getAlignment<ELFT>(sections, sym);
> + if (!(versyms[i] & VERSYM_HIDDEN)) {
> + symtab->addSymbol(SharedSymbol{*this, name, sym.getBinding(),
> + sym.st_other, sym.getType(),
> sym.st_value,
> + sym.st_size, alignment, idx});
> }
>
> // Also add the symbol with the versioned name to handle
> undefined symbols
> // with explicit versions.
> - if (Idx == VER_NDX_GLOBAL)
> + if (idx == VER_NDX_GLOBAL)
> continue;
>
> - if (Idx >= Verdefs.size() || Idx == VER_NDX_LOCAL) {
> - error("corrupt input file: version definition index " +
> Twine(Idx) +
> - " for symbol " + Name + " is out of bounds\n>>> defined
> in " +
> + if (idx >= verdefs.size() || idx == VER_NDX_LOCAL) {
> + error("corrupt input file: version definition index " +
> Twine(idx) +
> + " for symbol " + name + " is out of bounds\n>>> defined
> in " +
> toString(this));
> continue;
> }
>
> - StringRef VerName =
> - this->StringTable.data() +
> - reinterpret_cast<const Elf_Verdef
> *>(Verdefs[Idx])->getAux()->vda_name;
> - VersionedNameBuffer.clear();
> - Name = (Name + "@" + VerName).toStringRef(VersionedNameBuffer);
> - Symtab->addSymbol(SharedSymbol{*this, Saver.save(Name),
> Sym.getBinding(),
> - Sym.st_other, Sym.getType(),
> Sym.st_value,
> - Sym.st_size, Alignment, Idx});
> + StringRef verName =
> + this->stringTable.data() +
> + reinterpret_cast<const Elf_Verdef
> *>(verdefs[idx])->getAux()->vda_name;
> + versionedNameBuffer.clear();
> + name = (name + "@" + verName).toStringRef(versionedNameBuffer);
> + symtab->addSymbol(SharedSymbol{*this, Saver.save(name),
> sym.getBinding(),
> + sym.st_other, sym.getType(),
> sym.st_value,
> + sym.st_size, alignment, idx});
> }
> }
>
> -static ELFKind getBitcodeELFKind(const Triple &T) {
> - if (T.isLittleEndian())
> - return T.isArch64Bit() ? ELF64LEKind : ELF32LEKind;
> - return T.isArch64Bit() ? ELF64BEKind : ELF32BEKind;
> +static ELFKind getBitcodeELFKind(const Triple &t) {
> + if (t.isLittleEndian())
> + return t.isArch64Bit() ? ELF64LEKind : ELF32LEKind;
> + return t.isArch64Bit() ? ELF64BEKind : ELF32BEKind;
> }
>
> -static uint8_t getBitcodeMachineKind(StringRef Path, const Triple &T)
> {
> - switch (T.getArch()) {
> +static uint8_t getBitcodeMachineKind(StringRef path, const Triple &t)
> {
> + switch (t.getArch()) {
> case Triple::aarch64:
> return EM_AARCH64;
> case Triple::amdgcn:
> @@ -1406,24 +1406,24 @@ static uint8_t getBitcodeMachineKind(Str
> case Triple::riscv64:
> return EM_RISCV;
> case Triple::x86:
> - return T.isOSIAMCU() ? EM_IAMCU : EM_386;
> + return t.isOSIAMCU() ? EM_IAMCU : EM_386;
> case Triple::x86_64:
> return EM_X86_64;
> default:
> - error(Path + ": could not infer e_machine from bitcode target
> triple " +
> - T.str());
> + error(path + ": could not infer e_machine from bitcode target
> triple " +
> + t.str());
> return EM_NONE;
> }
> }
>
> -BitcodeFile::BitcodeFile(MemoryBufferRef MB, StringRef ArchiveName,
> - uint64_t OffsetInArchive)
> - : InputFile(BitcodeKind, MB) {
> - this->ArchiveName = ArchiveName;
> -
> - std::string Path = MB.getBufferIdentifier().str();
> - if (Config->ThinLTOIndexOnly)
> - Path = replaceThinLTOSuffix(MB.getBufferIdentifier());
> +BitcodeFile::BitcodeFile(MemoryBufferRef mb, StringRef archiveName,
> + uint64_t offsetInArchive)
> + : InputFile(BitcodeKind, mb) {
> + this->archiveName = archiveName;
> +
> + std::string path = mb.getBufferIdentifier().str();
> + if (config->thinLTOIndexOnly)
> + path = replaceThinLTOSuffix(mb.getBufferIdentifier());
>
> // ThinLTO assumes that all MemoryBufferRefs given to it have a
> unique
> // name. If two archives define two members with the same name, this
> @@ -1431,21 +1431,21 @@ BitcodeFile::BitcodeFile(MemoryBufferRef
> // into consideration at LTO time (which very likely causes
> undefined
> // symbols later in the link stage). So we append file offset to
> make
> // filename unique.
> - StringRef Name = ArchiveName.empty()
> - ? Saver.save(Path)
> - : Saver.save(ArchiveName + "(" + Path + " at "
> +
> - utostr(OffsetInArchive) + ")");
> - MemoryBufferRef MBRef(MB.getBuffer(), Name);
> + StringRef name = archiveName.empty()
> + ? Saver.save(path)
> + : Saver.save(archiveName + "(" + path + " at "
> +
> + utostr(offsetInArchive) + ")");
> + MemoryBufferRef mbref(mb.getBuffer(), name);
>
> - Obj = CHECK(lto::InputFile::create(MBRef), this);
> + obj = CHECK(lto::InputFile::create(mbref), this);
>
> - Triple T(Obj->getTargetTriple());
> - EKind = getBitcodeELFKind(T);
> - EMachine = getBitcodeMachineKind(MB.getBufferIdentifier(), T);
> + Triple t(obj->getTargetTriple());
> + ekind = getBitcodeELFKind(t);
> + emachine = getBitcodeMachineKind(mb.getBufferIdentifier(), t);
> }
>
> -static uint8_t mapVisibility(GlobalValue::VisibilityTypes
> GvVisibility) {
> - switch (GvVisibility) {
> +static uint8_t mapVisibility(GlobalValue::VisibilityTypes
> gvVisibility) {
> + switch (gvVisibility) {
> case GlobalValue::DefaultVisibility:
> return STV_DEFAULT;
> case GlobalValue::HiddenVisibility:
> @@ -1457,169 +1457,169 @@ static uint8_t mapVisibility(GlobalValue
> }
>
> template <class ELFT>
> -static Symbol *createBitcodeSymbol(const std::vector<bool>
> &KeptComdats,
> - const lto::InputFile::Symbol
> &ObjSym,
> - BitcodeFile &F) {
> - StringRef Name = Saver.save(ObjSym.getName());
> - uint8_t Binding = ObjSym.isWeak() ? STB_WEAK : STB_GLOBAL;
> - uint8_t Type = ObjSym.isTLS() ? STT_TLS : STT_NOTYPE;
> - uint8_t Visibility = mapVisibility(ObjSym.getVisibility());
> - bool CanOmitFromDynSym = ObjSym.canBeOmittedFromSymbolTable();
> -
> - int C = ObjSym.getComdatIndex();
> - if (ObjSym.isUndefined() || (C != -1 && !KeptComdats[C])) {
> - Undefined New(&F, Name, Binding, Visibility, Type);
> - if (CanOmitFromDynSym)
> - New.ExportDynamic = false;
> - return Symtab->addSymbol(New);
> - }
> -
> - if (ObjSym.isCommon())
> - return Symtab->addSymbol(
> - CommonSymbol{&F, Name, Binding, Visibility, STT_OBJECT,
> - ObjSym.getCommonAlignment(),
> ObjSym.getCommonSize()});
> -
> - Defined New(&F, Name, Binding, Visibility, Type, 0, 0, nullptr);
> - if (CanOmitFromDynSym)
> - New.ExportDynamic = false;
> - return Symtab->addSymbol(New);
> +static Symbol *createBitcodeSymbol(const std::vector<bool>
> &keptComdats,
> + const lto::InputFile::Symbol
> &objSym,
> + BitcodeFile &f) {
> + StringRef name = Saver.save(objSym.getName());
> + uint8_t binding = objSym.isWeak() ? STB_WEAK : STB_GLOBAL;
> + uint8_t type = objSym.isTLS() ? STT_TLS : STT_NOTYPE;
> + uint8_t visibility = mapVisibility(objSym.getVisibility());
> + bool canOmitFromDynSym = objSym.canBeOmittedFromSymbolTable();
> +
> + int c = objSym.getComdatIndex();
> + if (objSym.isUndefined() || (c != -1 && !keptComdats[c])) {
> + Undefined New(&f, name, binding, visibility, type);
> + if (canOmitFromDynSym)
> + New.exportDynamic = false;
> + return symtab->addSymbol(New);
> + }
> +
> + if (objSym.isCommon())
> + return symtab->addSymbol(
> + CommonSymbol{&f, name, binding, visibility, STT_OBJECT,
> + objSym.getCommonAlignment(),
> objSym.getCommonSize()});
> +
> + Defined New(&f, name, binding, visibility, type, 0, 0, nullptr);
> + if (canOmitFromDynSym)
> + New.exportDynamic = false;
> + return symtab->addSymbol(New);
> }
>
> template <class ELFT> void BitcodeFile::parse() {
> - std::vector<bool> KeptComdats;
> - for (StringRef S : Obj->getComdatTable())
> - KeptComdats.push_back(
> - Symtab->ComdatGroups.try_emplace(CachedHashStringRef(S),
> this).second);
> + std::vector<bool> keptComdats;
> + for (StringRef s : obj->getComdatTable())
> + keptComdats.push_back(
> + symtab->comdatGroups.try_emplace(CachedHashStringRef(s),
> this).second);
>
> - for (const lto::InputFile::Symbol &ObjSym : Obj->symbols())
> - Symbols.push_back(createBitcodeSymbol<ELFT>(KeptComdats, ObjSym,
> *this));
> + for (const lto::InputFile::Symbol &objSym : obj->symbols())
> + symbols.push_back(createBitcodeSymbol<ELFT>(keptComdats, objSym,
> *this));
>
> - for (auto L : Obj->getDependentLibraries())
> - addDependentLibrary(L, this);
> + for (auto l : obj->getDependentLibraries())
> + addDependentLibrary(l, this);
> }
>
> void BinaryFile::parse() {
> - ArrayRef<uint8_t> Data = arrayRefFromStringRef(MB.getBuffer());
> - auto *Section = make<InputSection>(this, SHF_ALLOC | SHF_WRITE,
> SHT_PROGBITS,
> - 8, Data, ".data");
> - Sections.push_back(Section);
> + ArrayRef<uint8_t> data = arrayRefFromStringRef(mb.getBuffer());
> + auto *section = make<InputSection>(this, SHF_ALLOC | SHF_WRITE,
> SHT_PROGBITS,
> + 8, data, ".data");
> + sections.push_back(section);
>
> // For each input file foo that is embedded to a result as a binary
> // blob, we define _binary_foo_{start,end,size} symbols, so that
> // user programs can access blobs by name. Non-alphanumeric
> // characters in a filename are replaced with underscore.
> - std::string S = "_binary_" + MB.getBufferIdentifier().str();
> - for (size_t I = 0; I < S.size(); ++I)
> - if (!isAlnum(S[I]))
> - S[I] = '_';
> -
> - Symtab->addSymbol(Defined{nullptr, Saver.save(S + "_start"),
> STB_GLOBAL,
> - STV_DEFAULT, STT_OBJECT, 0, 0, Section});
> - Symtab->addSymbol(Defined{nullptr, Saver.save(S + "_end"),
> STB_GLOBAL,
> - STV_DEFAULT, STT_OBJECT, Data.size(), 0,
> Section});
> - Symtab->addSymbol(Defined{nullptr, Saver.save(S + "_size"),
> STB_GLOBAL,
> - STV_DEFAULT, STT_OBJECT, Data.size(), 0,
> nullptr});
> -}
> -
> -InputFile *elf::createObjectFile(MemoryBufferRef MB, StringRef
> ArchiveName,
> - uint64_t OffsetInArchive) {
> - if (isBitcode(MB))
> - return make<BitcodeFile>(MB, ArchiveName, OffsetInArchive);
> + std::string s = "_binary_" + mb.getBufferIdentifier().str();
> + for (size_t i = 0; i < s.size(); ++i)
> + if (!isAlnum(s[i]))
> + s[i] = '_';
> +
> + symtab->addSymbol(Defined{nullptr, Saver.save(s + "_start"),
> STB_GLOBAL,
> + STV_DEFAULT, STT_OBJECT, 0, 0, section});
> + symtab->addSymbol(Defined{nullptr, Saver.save(s + "_end"),
> STB_GLOBAL,
> + STV_DEFAULT, STT_OBJECT, data.size(), 0,
> section});
> + symtab->addSymbol(Defined{nullptr, Saver.save(s + "_size"),
> STB_GLOBAL,
> + STV_DEFAULT, STT_OBJECT, data.size(), 0,
> nullptr});
> +}
> +
> +InputFile *elf::createObjectFile(MemoryBufferRef mb, StringRef
> archiveName,
> + uint64_t offsetInArchive) {
> + if (isBitcode(mb))
> + return make<BitcodeFile>(mb, archiveName, offsetInArchive);
>
> - switch (getELFKind(MB, ArchiveName)) {
> + switch (getELFKind(mb, archiveName)) {
> case ELF32LEKind:
> - return make<ObjFile<ELF32LE>>(MB, ArchiveName);
> + return make<ObjFile<ELF32LE>>(mb, archiveName);
> case ELF32BEKind:
> - return make<ObjFile<ELF32BE>>(MB, ArchiveName);
> + return make<ObjFile<ELF32BE>>(mb, archiveName);
> case ELF64LEKind:
> - return make<ObjFile<ELF64LE>>(MB, ArchiveName);
> + return make<ObjFile<ELF64LE>>(mb, archiveName);
> case ELF64BEKind:
> - return make<ObjFile<ELF64BE>>(MB, ArchiveName);
> + return make<ObjFile<ELF64BE>>(mb, archiveName);
> default:
> llvm_unreachable("getELFKind");
> }
> }
>
> void LazyObjFile::fetch() {
> - if (MB.getBuffer().empty())
> + if (mb.getBuffer().empty())
> return;
>
> - InputFile *File = createObjectFile(MB, ArchiveName,
> OffsetInArchive);
> - File->GroupId = GroupId;
> + InputFile *file = createObjectFile(mb, archiveName,
> offsetInArchive);
> + file->groupId = groupId;
>
> - MB = {};
> + mb = {};
>
> // Copy symbol vector so that the new InputFile doesn't have to
> // insert the same defined symbols to the symbol table again.
> - File->Symbols = std::move(Symbols);
> + file->symbols = std::move(symbols);
>
> - parseFile(File);
> + parseFile(file);
> }
>
> template <class ELFT> void LazyObjFile::parse() {
> using Elf_Sym = typename ELFT::Sym;
>
> // A lazy object file wraps either a bitcode file or an ELF file.
> - if (isBitcode(this->MB)) {
> - std::unique_ptr<lto::InputFile> Obj =
> - CHECK(lto::InputFile::create(this->MB), this);
> - for (const lto::InputFile::Symbol &Sym : Obj->symbols()) {
> - if (Sym.isUndefined())
> + if (isBitcode(this->mb)) {
> + std::unique_ptr<lto::InputFile> obj =
> + CHECK(lto::InputFile::create(this->mb), this);
> + for (const lto::InputFile::Symbol &sym : obj->symbols()) {
> + if (sym.isUndefined())
> continue;
> - Symtab->addSymbol(LazyObject{*this, Saver.save(Sym.getName())});
> + symtab->addSymbol(LazyObject{*this, Saver.save(sym.getName())});
> }
> return;
> }
>
> - if (getELFKind(this->MB, ArchiveName) != Config->EKind) {
> - error("incompatible file: " + this->MB.getBufferIdentifier());
> + if (getELFKind(this->mb, archiveName) != config->ekind) {
> + error("incompatible file: " + this->mb.getBufferIdentifier());
> return;
> }
>
> // Find a symbol table.
> - ELFFile<ELFT> Obj = check(ELFFile<ELFT>::create(MB.getBuffer()));
> - ArrayRef<typename ELFT::Shdr> Sections = CHECK(Obj.sections(),
> this);
> + ELFFile<ELFT> obj = check(ELFFile<ELFT>::create(mb.getBuffer()));
> + ArrayRef<typename ELFT::Shdr> sections = CHECK(obj.sections(),
> this);
>
> - for (const typename ELFT::Shdr &Sec : Sections) {
> - if (Sec.sh_type != SHT_SYMTAB)
> + for (const typename ELFT::Shdr &sec : sections) {
> + if (sec.sh_type != SHT_SYMTAB)
> continue;
>
> // A symbol table is found.
> - ArrayRef<Elf_Sym> ESyms = CHECK(Obj.symbols(&Sec), this);
> - uint32_t FirstGlobal = Sec.sh_info;
> - StringRef Strtab = CHECK(Obj.getStringTableForSymtab(Sec,
> Sections), this);
> - this->Symbols.resize(ESyms.size());
> + ArrayRef<Elf_Sym> eSyms = CHECK(obj.symbols(&sec), this);
> + uint32_t firstGlobal = sec.sh_info;
> + StringRef strtab = CHECK(obj.getStringTableForSymtab(sec,
> sections), this);
> + this->symbols.resize(eSyms.size());
>
> // Get existing symbols or insert placeholder symbols.
> - for (size_t I = FirstGlobal, End = ESyms.size(); I != End; ++I)
> - if (ESyms[I].st_shndx != SHN_UNDEF)
> - this->Symbols[I] =
> Symtab->insert(CHECK(ESyms[I].getName(Strtab), this));
> + for (size_t i = firstGlobal, end = eSyms.size(); i != end; ++i)
> + if (eSyms[i].st_shndx != SHN_UNDEF)
> + this->symbols[i] =
> symtab->insert(CHECK(eSyms[i].getName(strtab), this));
>
> // Replace existing symbols with LazyObject symbols.
> //
> // resolve() may trigger this->fetch() if an existing symbol is an
> // undefined symbol. If that happens, this LazyObjFile has served
> // its purpose, and we can exit from the loop early.
> - for (Symbol *Sym : this->Symbols) {
> - if (!Sym)
> + for (Symbol *sym : this->symbols) {
> + if (!sym)
> continue;
> - Sym->resolve(LazyObject{*this, Sym->getName()});
> + sym->resolve(LazyObject{*this, sym->getName()});
>
> // MemoryBuffer is emptied if this file is instantiated as
> ObjFile.
> - if (MB.getBuffer().empty())
> + if (mb.getBuffer().empty())
> return;
> }
> return;
> }
> }
>
> -std::string elf::replaceThinLTOSuffix(StringRef Path) {
> - StringRef Suffix = Config->ThinLTOObjectSuffixReplace.first;
> - StringRef Repl = Config->ThinLTOObjectSuffixReplace.second;
> -
> - if (Path.consume_back(Suffix))
> - return (Path + Repl).str();
> - return Path;
> +std::string elf::replaceThinLTOSuffix(StringRef path) {
> + StringRef suffix = config->thinLTOObjectSuffixReplace.first;
> + StringRef repl = config->thinLTOObjectSuffixReplace.second;
> +
> + if (path.consume_back(suffix))
> + return (path + repl).str();
> + return path;
> }
>
> template void BitcodeFile::parse<ELF32LE>();
>
> Modified: lld/trunk/ELF/InputFiles.h
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_InputFiles.h-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=8CMbPezr9q-cnBldZ16ej1bZmpQKIDw24JFdc6xGuvU&e=
>
> ==============================================================================
> --- lld/trunk/ELF/InputFiles.h (original)
> +++ lld/trunk/ELF/InputFiles.h Tue Jul 9 22:00:37 2019
> @@ -39,7 +39,7 @@ class InputSectionBase;
> }
>
> // Returns "<internal>", "foo.a(bar.o)" or "baz.o".
> -std::string toString(const elf::InputFile *F);
> +std::string toString(const elf::InputFile *f);
>
> namespace elf {
>
> @@ -49,13 +49,13 @@ class Symbol;
>
> // If -reproduce option is given, all input files are written
> // to this tar archive.
> -extern std::unique_ptr<llvm::TarWriter> Tar;
> +extern std::unique_ptr<llvm::TarWriter> tar;
>
> // Opens a given file.
> -llvm::Optional<MemoryBufferRef> readFile(StringRef Path);
> +llvm::Optional<MemoryBufferRef> readFile(StringRef path);
>
> // Add symbols in File to the symbol table.
> -void parseFile(InputFile *File);
> +void parseFile(InputFile *file);
>
> // The root class of input files.
> class InputFile {
> @@ -69,21 +69,21 @@ public:
> BinaryKind,
> };
>
> - Kind kind() const { return FileKind; }
> + Kind kind() const { return fileKind; }
>
> bool isElf() const {
> - Kind K = kind();
> - return K == ObjKind || K == SharedKind;
> + Kind k = kind();
> + return k == ObjKind || k == SharedKind;
> }
>
> - StringRef getName() const { return MB.getBufferIdentifier(); }
> - MemoryBufferRef MB;
> + StringRef getName() const { return mb.getBufferIdentifier(); }
> + MemoryBufferRef mb;
>
> // Returns sections. It is a runtime error to call this function
> // on files that don't have the notion of sections.
> ArrayRef<InputSectionBase *> getSections() const {
> - assert(FileKind == ObjKind || FileKind == BinaryKind);
> - return Sections;
> + assert(fileKind == ObjKind || fileKind == BinaryKind);
> + return sections;
> }
>
> // Returns object file symbols. It is a runtime error to call this
> @@ -91,35 +91,35 @@ public:
> ArrayRef<Symbol *> getSymbols() { return getMutableSymbols(); }
>
> MutableArrayRef<Symbol *> getMutableSymbols() {
> - assert(FileKind == BinaryKind || FileKind == ObjKind ||
> - FileKind == BitcodeKind);
> - return Symbols;
> + assert(fileKind == BinaryKind || fileKind == ObjKind ||
> + fileKind == BitcodeKind);
> + return symbols;
> }
>
> // Filename of .a which contained this file. If this file was
> // not in an archive file, it is the empty string. We use this
> // string for creating error messages.
> - std::string ArchiveName;
> + std::string archiveName;
>
> // If this is an architecture-specific file, the following members
> // have ELF type (i.e. ELF{32,64}{LE,BE}) and target machine type.
> - ELFKind EKind = ELFNoneKind;
> - uint16_t EMachine = llvm::ELF::EM_NONE;
> - uint8_t OSABI = 0;
> - uint8_t ABIVersion = 0;
> + ELFKind ekind = ELFNoneKind;
> + uint16_t emachine = llvm::ELF::EM_NONE;
> + uint8_t osabi = 0;
> + uint8_t abiVersion = 0;
>
> // Cache for toString(). Only toString() should use this member.
> - mutable std::string ToStringCache;
> + mutable std::string toStringCache;
>
> - std::string getSrcMsg(const Symbol &Sym, InputSectionBase &Sec,
> - uint64_t Offset);
> + std::string getSrcMsg(const Symbol &sym, InputSectionBase &sec,
> + uint64_t offset);
>
> // True if this is an argument for --just-symbols. Usually false.
> - bool JustSymbols = false;
> + bool justSymbols = false;
>
> // OutSecOff of .got2 in the current file. This is used by PPC32
> -fPIC/-fPIE
> // to compute offsets in PLT call stubs.
> - uint32_t PPC32Got2OutSecOff = 0;
> + uint32_t ppc32Got2OutSecOff = 0;
>
> // On PPC64 we need to keep track of which files contain small code
> model
> // relocations that access the .toc section. To minimize the chance
> of a
> @@ -130,56 +130,56 @@ public:
> // code model relocations support immediates in the range [-0x8000,
> 0x7FFC],
> // making the addressable range relative to the toc pointer
> // [.got, .got + 0xFFFC].
> - bool PPC64SmallCodeModelTocRelocs = false;
> + bool ppc64SmallCodeModelTocRelocs = false;
>
> // GroupId is used for --warn-backrefs which is an optional error
> // checking feature. All files within the same --{start,end}-group
> or
> // --{start,end}-lib get the same group ID. Otherwise, each file
> gets a new
> // group ID. For more info, see checkDependency() in
> SymbolTable.cpp.
> - uint32_t GroupId;
> - static bool IsInGroup;
> - static uint32_t NextGroupId;
> + uint32_t groupId;
> + static bool isInGroup;
> + static uint32_t nextGroupId;
>
> // Index of MIPS GOT built for this file.
> - llvm::Optional<size_t> MipsGotIndex;
> + llvm::Optional<size_t> mipsGotIndex;
>
> - std::vector<Symbol *> Symbols;
> + std::vector<Symbol *> symbols;
>
> protected:
> - InputFile(Kind K, MemoryBufferRef M);
> - std::vector<InputSectionBase *> Sections;
> + InputFile(Kind k, MemoryBufferRef m);
> + std::vector<InputSectionBase *> sections;
>
> private:
> - const Kind FileKind;
> + const Kind fileKind;
> };
>
> class ELFFileBase : public InputFile {
> public:
> - ELFFileBase(Kind K, MemoryBufferRef M);
> - static bool classof(const InputFile *F) { return F->isElf(); }
> + ELFFileBase(Kind k, MemoryBufferRef m);
> + static bool classof(const InputFile *f) { return f->isElf(); }
>
> template <typename ELFT> llvm::object::ELFFile<ELFT> getObj() const
> {
> - return check(llvm::object::ELFFile<ELFT>::create(MB.getBuffer()));
> + return check(llvm::object::ELFFile<ELFT>::create(mb.getBuffer()));
> }
>
> - StringRef getStringTable() const { return StringTable; }
> + StringRef getStringTable() const { return stringTable; }
>
> template <typename ELFT> typename ELFT::SymRange getELFSyms() const
> {
> return typename ELFT::SymRange(
> - reinterpret_cast<const typename ELFT::Sym *>(ELFSyms),
> NumELFSyms);
> + reinterpret_cast<const typename ELFT::Sym *>(elfSyms),
> numELFSyms);
> }
> template <typename ELFT> typename ELFT::SymRange getGlobalELFSyms()
> const {
> - return getELFSyms<ELFT>().slice(FirstGlobal);
> + return getELFSyms<ELFT>().slice(firstGlobal);
> }
>
> protected:
> // Initializes this class's member variables.
> template <typename ELFT> void init();
>
> - const void *ELFSyms = nullptr;
> - size_t NumELFSyms = 0;
> - uint32_t FirstGlobal = 0;
> - StringRef StringTable;
> + const void *elfSyms = nullptr;
> + size_t numELFSyms = 0;
> + uint32_t firstGlobal = 0;
> + StringRef stringTable;
> };
>
> // .o file.
> @@ -192,7 +192,7 @@ template <class ELFT> class ObjFile : pu
> using Elf_CGProfile = typename ELFT::CGProfile;
>
> public:
> - static bool classof(const InputFile *F) { return F->kind() ==
> ObjKind; }
> + static bool classof(const InputFile *f) { return f->kind() ==
> ObjKind; }
>
> llvm::object::ELFFile<ELFT> getObj() const {
> return this->ELFFileBase::getObj<ELFT>();
> @@ -201,67 +201,67 @@ public:
> ArrayRef<Symbol *> getLocalSymbols();
> ArrayRef<Symbol *> getGlobalSymbols();
>
> - ObjFile(MemoryBufferRef M, StringRef ArchiveName) :
> ELFFileBase(ObjKind, M) {
> - this->ArchiveName = ArchiveName;
> + ObjFile(MemoryBufferRef m, StringRef archiveName) :
> ELFFileBase(ObjKind, m) {
> + this->archiveName = archiveName;
> }
>
> - void parse(bool IgnoreComdats = false);
> + void parse(bool ignoreComdats = false);
>
> - StringRef getShtGroupSignature(ArrayRef<Elf_Shdr> Sections,
> - const Elf_Shdr &Sec);
> + StringRef getShtGroupSignature(ArrayRef<Elf_Shdr> sections,
> + const Elf_Shdr &sec);
>
> - Symbol &getSymbol(uint32_t SymbolIndex) const {
> - if (SymbolIndex >= this->Symbols.size())
> + Symbol &getSymbol(uint32_t symbolIndex) const {
> + if (symbolIndex >= this->symbols.size())
> fatal(toString(this) + ": invalid symbol index");
> - return *this->Symbols[SymbolIndex];
> + return *this->symbols[symbolIndex];
> }
>
> - uint32_t getSectionIndex(const Elf_Sym &Sym) const;
> + uint32_t getSectionIndex(const Elf_Sym &sym) const;
>
> - template <typename RelT> Symbol &getRelocTargetSym(const RelT &Rel)
> const {
> - uint32_t SymIndex = Rel.getSymbol(Config->IsMips64EL);
> - return getSymbol(SymIndex);
> + template <typename RelT> Symbol &getRelocTargetSym(const RelT &rel)
> const {
> + uint32_t symIndex = rel.getSymbol(config->isMips64EL);
> + return getSymbol(symIndex);
> }
>
> llvm::Optional<llvm::DILineInfo> getDILineInfo(InputSectionBase *,
> uint64_t);
> - llvm::Optional<std::pair<std::string, unsigned>>
> getVariableLoc(StringRef Name);
> + llvm::Optional<std::pair<std::string, unsigned>>
> getVariableLoc(StringRef name);
>
> // MIPS GP0 value defined by this file. This value represents the
> gp value
> // used to create the relocatable object and required to support
> // R_MIPS_GPREL16 / R_MIPS_GPREL32 relocations.
> - uint32_t MipsGp0 = 0;
> + uint32_t mipsGp0 = 0;
>
> - uint32_t AndFeatures = 0;
> + uint32_t andFeatures = 0;
>
> // Name of source file obtained from STT_FILE symbol value,
> // or empty string if there is no such symbol in object file
> // symbol table.
> - StringRef SourceFile;
> + StringRef sourceFile;
>
> // True if the file defines functions compiled with
> // -fsplit-stack. Usually false.
> - bool SplitStack = false;
> + bool splitStack = false;
>
> // True if the file defines functions compiled with -fsplit-stack,
> // but had one or more functions with the no_split_stack attribute.
> - bool SomeNoSplitStack = false;
> + bool someNoSplitStack = false;
>
> // Pointer to this input file's .llvm_addrsig section, if it has
> one.
> - const Elf_Shdr *AddrsigSec = nullptr;
> + const Elf_Shdr *addrsigSec = nullptr;
>
> // SHT_LLVM_CALL_GRAPH_PROFILE table
> - ArrayRef<Elf_CGProfile> CGProfile;
> + ArrayRef<Elf_CGProfile> cgProfile;
>
> private:
> - void initializeSections(bool IgnoreComdats);
> + void initializeSections(bool ignoreComdats);
> void initializeSymbols();
> void initializeJustSymbols();
> void initializeDwarf();
> - InputSectionBase *getRelocTarget(const Elf_Shdr &Sec);
> - InputSectionBase *createInputSection(const Elf_Shdr &Sec);
> - StringRef getSectionName(const Elf_Shdr &Sec);
> + InputSectionBase *getRelocTarget(const Elf_Shdr &sec);
> + InputSectionBase *createInputSection(const Elf_Shdr &sec);
> + StringRef getSectionName(const Elf_Shdr &sec);
>
> - bool shouldMerge(const Elf_Shdr &Sec);
> + bool shouldMerge(const Elf_Shdr &sec);
>
> // Each ELF symbol contains a section index which the symbol
> belongs to.
> // However, because the number of bits dedicated for that is
> limited, a
> @@ -275,24 +275,24 @@ private:
> //
> // The following variable contains the contents of .symtab_shndx.
> // If the section does not exist (which is common), the array is
> empty.
> - ArrayRef<Elf_Word> ShndxTable;
> + ArrayRef<Elf_Word> shndxTable;
>
> // .shstrtab contents.
> - StringRef SectionStringTable;
> + StringRef sectionStringTable;
>
> // Debugging information to retrieve source file and line for error
> // reporting. Linker may find reasonable number of errors in a
> // single object file, so we cache debugging information in order to
> // parse it only once for each object file we link.
> - std::unique_ptr<llvm::DWARFContext> Dwarf;
> - std::vector<const llvm::DWARFDebugLine::LineTable *> LineTables;
> + std::unique_ptr<llvm::DWARFContext> dwarf;
> + std::vector<const llvm::DWARFDebugLine::LineTable *> lineTables;
> struct VarLoc {
> - const llvm::DWARFDebugLine::LineTable *LT;
> - unsigned File;
> - unsigned Line;
> + const llvm::DWARFDebugLine::LineTable *lt;
> + unsigned file;
> + unsigned line;
> };
> - llvm::DenseMap<StringRef, VarLoc> VariableLoc;
> - llvm::once_flag InitDwarfLine;
> + llvm::DenseMap<StringRef, VarLoc> variableLoc;
> + llvm::once_flag initDwarfLine;
> };
>
> // LazyObjFile is analogous to ArchiveFile in the sense that
> @@ -304,100 +304,100 @@ private:
> // archive file semantics.
> class LazyObjFile : public InputFile {
> public:
> - LazyObjFile(MemoryBufferRef M, StringRef ArchiveName,
> - uint64_t OffsetInArchive)
> - : InputFile(LazyObjKind, M), OffsetInArchive(OffsetInArchive) {
> - this->ArchiveName = ArchiveName;
> + LazyObjFile(MemoryBufferRef m, StringRef archiveName,
> + uint64_t offsetInArchive)
> + : InputFile(LazyObjKind, m), offsetInArchive(offsetInArchive) {
> + this->archiveName = archiveName;
> }
>
> - static bool classof(const InputFile *F) { return F->kind() ==
> LazyObjKind; }
> + static bool classof(const InputFile *f) { return f->kind() ==
> LazyObjKind; }
>
> template <class ELFT> void parse();
> void fetch();
>
> private:
> - uint64_t OffsetInArchive;
> + uint64_t offsetInArchive;
> };
>
> // An ArchiveFile object represents a .a file.
> class ArchiveFile : public InputFile {
> public:
> - explicit ArchiveFile(std::unique_ptr<Archive> &&File);
> - static bool classof(const InputFile *F) { return F->kind() ==
> ArchiveKind; }
> + explicit ArchiveFile(std::unique_ptr<Archive> &&file);
> + static bool classof(const InputFile *f) { return f->kind() ==
> ArchiveKind; }
> void parse();
>
> // Pulls out an object file that contains a definition for Sym and
> // returns it. If the same file was instantiated before, this
> // function does nothing (so we don't instantiate the same file
> // more than once.)
> - void fetch(const Archive::Symbol &Sym);
> + void fetch(const Archive::Symbol &sym);
>
> private:
> - std::unique_ptr<Archive> File;
> - llvm::DenseSet<uint64_t> Seen;
> + std::unique_ptr<Archive> file;
> + llvm::DenseSet<uint64_t> seen;
> };
>
> class BitcodeFile : public InputFile {
> public:
> - BitcodeFile(MemoryBufferRef M, StringRef ArchiveName,
> - uint64_t OffsetInArchive);
> - static bool classof(const InputFile *F) { return F->kind() ==
> BitcodeKind; }
> + BitcodeFile(MemoryBufferRef m, StringRef archiveName,
> + uint64_t offsetInArchive);
> + static bool classof(const InputFile *f) { return f->kind() ==
> BitcodeKind; }
> template <class ELFT> void parse();
> - std::unique_ptr<llvm::lto::InputFile> Obj;
> + std::unique_ptr<llvm::lto::InputFile> obj;
> };
>
> // .so file.
> class SharedFile : public ELFFileBase {
> public:
> - SharedFile(MemoryBufferRef M, StringRef DefaultSoName)
> - : ELFFileBase(SharedKind, M), SoName(DefaultSoName),
> - IsNeeded(!Config->AsNeeded) {}
> + SharedFile(MemoryBufferRef m, StringRef defaultSoName)
> + : ELFFileBase(SharedKind, m), soName(defaultSoName),
> + isNeeded(!config->asNeeded) {}
>
> // This is actually a vector of Elf_Verdef pointers.
> - std::vector<const void *> Verdefs;
> + std::vector<const void *> verdefs;
>
> // If the output file needs Elf_Verneed data structures for this
> file, this is
> // a vector of Elf_Vernaux version identifiers that map onto the
> entries in
> // Verdefs, otherwise it is empty.
> - std::vector<unsigned> Vernauxs;
> + std::vector<unsigned> vernauxs;
>
> - static unsigned VernauxNum;
> + static unsigned vernauxNum;
>
> - std::vector<StringRef> DtNeeded;
> - std::string SoName;
> + std::vector<StringRef> dtNeeded;
> + std::string soName;
>
> - static bool classof(const InputFile *F) { return F->kind() ==
> SharedKind; }
> + static bool classof(const InputFile *f) { return f->kind() ==
> SharedKind; }
>
> template <typename ELFT> void parse();
>
> // Used for --no-allow-shlib-undefined.
> - bool AllNeededIsKnown;
> + bool allNeededIsKnown;
>
> // Used for --as-needed
> - bool IsNeeded;
> + bool isNeeded;
> };
>
> class BinaryFile : public InputFile {
> public:
> - explicit BinaryFile(MemoryBufferRef M) : InputFile(BinaryKind, M) {}
> - static bool classof(const InputFile *F) { return F->kind() ==
> BinaryKind; }
> + explicit BinaryFile(MemoryBufferRef m) : InputFile(BinaryKind, m) {}
> + static bool classof(const InputFile *f) { return f->kind() ==
> BinaryKind; }
> void parse();
> };
>
> -InputFile *createObjectFile(MemoryBufferRef MB, StringRef ArchiveName
> = "",
> - uint64_t OffsetInArchive = 0);
> +InputFile *createObjectFile(MemoryBufferRef mb, StringRef archiveName
> = "",
> + uint64_t offsetInArchive = 0);
>
> -inline bool isBitcode(MemoryBufferRef MB) {
> - return identify_magic(MB.getBuffer()) == llvm::file_magic::bitcode;
> +inline bool isBitcode(MemoryBufferRef mb) {
> + return identify_magic(mb.getBuffer()) == llvm::file_magic::bitcode;
> }
>
> -std::string replaceThinLTOSuffix(StringRef Path);
> +std::string replaceThinLTOSuffix(StringRef path);
>
> -extern std::vector<BinaryFile *> BinaryFiles;
> -extern std::vector<BitcodeFile *> BitcodeFiles;
> -extern std::vector<LazyObjFile *> LazyObjFiles;
> -extern std::vector<InputFile *> ObjectFiles;
> -extern std::vector<SharedFile *> SharedFiles;
> +extern std::vector<BinaryFile *> binaryFiles;
> +extern std::vector<BitcodeFile *> bitcodeFiles;
> +extern std::vector<LazyObjFile *> lazyObjFiles;
> +extern std::vector<InputFile *> objectFiles;
> +extern std::vector<SharedFile *> sharedFiles;
>
> } // namespace elf
> } // namespace lld
>
> Modified: lld/trunk/ELF/InputSection.cpp
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_InputSection.cpp-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=ogECe1ENEqw6TBvmzsmn7KY1fMM6AT2g3Mu1gdOE09A&e=
>
> ==============================================================================
> --- lld/trunk/ELF/InputSection.cpp (original)
> +++ lld/trunk/ELF/InputSection.cpp Tue Jul 9 22:00:37 2019
> @@ -40,52 +40,52 @@ using namespace llvm::sys;
> using namespace lld;
> using namespace lld::elf;
>
> -std::vector<InputSectionBase *> elf::InputSections;
> +std::vector<InputSectionBase *> elf::inputSections;
>
> // Returns a string to construct an error message.
> -std::string lld::toString(const InputSectionBase *Sec) {
> - return (toString(Sec->File) + ":(" + Sec->Name + ")").str();
> +std::string lld::toString(const InputSectionBase *sec) {
> + return (toString(sec->file) + ":(" + sec->name + ")").str();
> }
>
> template <class ELFT>
> -static ArrayRef<uint8_t> getSectionContents(ObjFile<ELFT> &File,
> - const typename ELFT::Shdr
> &Hdr) {
> - if (Hdr.sh_type == SHT_NOBITS)
> - return makeArrayRef<uint8_t>(nullptr, Hdr.sh_size);
> - return check(File.getObj().getSectionContents(&Hdr));
> +static ArrayRef<uint8_t> getSectionContents(ObjFile<ELFT> &file,
> + const typename ELFT::Shdr
> &hdr) {
> + if (hdr.sh_type == SHT_NOBITS)
> + return makeArrayRef<uint8_t>(nullptr, hdr.sh_size);
> + return check(file.getObj().getSectionContents(&hdr));
> }
>
> -InputSectionBase::InputSectionBase(InputFile *File, uint64_t Flags,
> - uint32_t Type, uint64_t Entsize,
> - uint32_t Link, uint32_t Info,
> - uint32_t Alignment,
> ArrayRef<uint8_t> Data,
> - StringRef Name, Kind SectionKind)
> - : SectionBase(SectionKind, Name, Flags, Entsize, Alignment, Type,
> Info,
> - Link),
> - File(File), RawData(Data) {
> +InputSectionBase::InputSectionBase(InputFile *file, uint64_t flags,
> + uint32_t type, uint64_t entsize,
> + uint32_t link, uint32_t info,
> + uint32_t alignment,
> ArrayRef<uint8_t> data,
> + StringRef name, Kind sectionKind)
> + : SectionBase(sectionKind, name, flags, entsize, alignment, type,
> info,
> + link),
> + file(file), rawData(data) {
> // In order to reduce memory allocation, we assume that mergeable
> // sections are smaller than 4 GiB, which is not an unreasonable
> // assumption as of 2017.
> - if (SectionKind == SectionBase::Merge && RawData.size() >
> UINT32_MAX)
> + if (sectionKind == SectionBase::Merge && rawData.size() >
> UINT32_MAX)
> error(toString(this) + ": section too large");
>
> - NumRelocations = 0;
> - AreRelocsRela = false;
> + numRelocations = 0;
> + areRelocsRela = false;
>
> // The ELF spec states that a value of 0 means the section has
> // no alignment constraits.
> - uint32_t V = std::max<uint32_t>(Alignment, 1);
> - if (!isPowerOf2_64(V))
> + uint32_t v = std::max<uint32_t>(alignment, 1);
> + if (!isPowerOf2_64(v))
> fatal(toString(this) + ": sh_addralign is not a power of 2");
> - this->Alignment = V;
> + this->alignment = v;
>
> // In ELF, each section can be compressed by zlib, and if
> compressed,
> // section name may be mangled by appending "z" (e.g.
> ".zdebug_info").
> // If that's the case, demangle section name so that we can handle a
> // section as if it weren't compressed.
> - if ((Flags & SHF_COMPRESSED) || Name.startswith(".zdebug")) {
> + if ((flags & SHF_COMPRESSED) || name.startswith(".zdebug")) {
> if (!zlib::isAvailable())
> - error(toString(File) + ": contains a compressed section, " +
> + error(toString(file) + ": contains a compressed section, " +
> "but zlib is not available");
> parseCompressedHeader();
> }
> @@ -94,11 +94,11 @@ InputSectionBase::InputSectionBase(Input
> // Drop SHF_GROUP bit unless we are producing a re-linkable object
> file.
> // SHF_GROUP is a marker that a section belongs to some comdat group.
> // That flag doesn't make sense in an executable.
> -static uint64_t getFlags(uint64_t Flags) {
> - Flags &= ~(uint64_t)SHF_INFO_LINK;
> - if (!Config->Relocatable)
> - Flags &= ~(uint64_t)SHF_GROUP;
> - return Flags;
> +static uint64_t getFlags(uint64_t flags) {
> + flags &= ~(uint64_t)SHF_INFO_LINK;
> + if (!config->relocatable)
> + flags &= ~(uint64_t)SHF_GROUP;
> + return flags;
> }
>
> // GNU assembler 2.24 and LLVM 4.0.0's MC (the newest release as of
> @@ -111,99 +111,99 @@ static uint64_t getFlags(uint64_t Flags)
> //
> // This function forces SHT_{INIT,FINI}_ARRAY so that we can handle
> // incorrect inputs as if they were correct from the beginning.
> -static uint64_t getType(uint64_t Type, StringRef Name) {
> - if (Type == SHT_PROGBITS && Name.startswith(".init_array."))
> +static uint64_t getType(uint64_t type, StringRef name) {
> + if (type == SHT_PROGBITS && name.startswith(".init_array."))
> return SHT_INIT_ARRAY;
> - if (Type == SHT_PROGBITS && Name.startswith(".fini_array."))
> + if (type == SHT_PROGBITS && name.startswith(".fini_array."))
> return SHT_FINI_ARRAY;
> - return Type;
> + return type;
> }
>
> template <class ELFT>
> -InputSectionBase::InputSectionBase(ObjFile<ELFT> &File,
> - const typename ELFT::Shdr &Hdr,
> - StringRef Name, Kind SectionKind)
> - : InputSectionBase(&File, getFlags(Hdr.sh_flags),
> - getType(Hdr.sh_type, Name), Hdr.sh_entsize,
> Hdr.sh_link,
> - Hdr.sh_info, Hdr.sh_addralign,
> - getSectionContents(File, Hdr), Name,
> SectionKind) {
> +InputSectionBase::InputSectionBase(ObjFile<ELFT> &file,
> + const typename ELFT::Shdr &hdr,
> + StringRef name, Kind sectionKind)
> + : InputSectionBase(&file, getFlags(hdr.sh_flags),
> + getType(hdr.sh_type, name), hdr.sh_entsize,
> hdr.sh_link,
> + hdr.sh_info, hdr.sh_addralign,
> + getSectionContents(file, hdr), name,
> sectionKind) {
> // We reject object files having insanely large alignments even
> though
> // they are allowed by the spec. I think 4GB is a reasonable
> limitation.
> // We might want to relax this in the future.
> - if (Hdr.sh_addralign > UINT32_MAX)
> - fatal(toString(&File) + ": section sh_addralign is too large");
> + if (hdr.sh_addralign > UINT32_MAX)
> + fatal(toString(&file) + ": section sh_addralign is too large");
> }
>
> size_t InputSectionBase::getSize() const {
> - if (auto *S = dyn_cast<SyntheticSection>(this))
> - return S->getSize();
> - if (UncompressedSize >= 0)
> - return UncompressedSize;
> - return RawData.size();
> + if (auto *s = dyn_cast<SyntheticSection>(this))
> + return s->getSize();
> + if (uncompressedSize >= 0)
> + return uncompressedSize;
> + return rawData.size();
> }
>
> void InputSectionBase::uncompress() const {
> - size_t Size = UncompressedSize;
> - char *UncompressedBuf;
> + size_t size = uncompressedSize;
> + char *uncompressedBuf;
> {
> - static std::mutex Mu;
> - std::lock_guard<std::mutex> Lock(Mu);
> - UncompressedBuf = BAlloc.Allocate<char>(Size);
> + static std::mutex mu;
> + std::lock_guard<std::mutex> lock(mu);
> + uncompressedBuf = BAlloc.Allocate<char>(size);
> }
>
> - if (Error E = zlib::uncompress(toStringRef(RawData),
> UncompressedBuf, Size))
> + if (Error e = zlib::uncompress(toStringRef(rawData),
> uncompressedBuf, size))
> fatal(toString(this) +
> - ": uncompress failed: " + llvm::toString(std::move(E)));
> - RawData = makeArrayRef((uint8_t *)UncompressedBuf, Size);
> - UncompressedSize = -1;
> + ": uncompress failed: " + llvm::toString(std::move(e)));
> + rawData = makeArrayRef((uint8_t *)uncompressedBuf, size);
> + uncompressedSize = -1;
> }
>
> uint64_t InputSectionBase::getOffsetInFile() const {
> - const uint8_t *FileStart = (const uint8_t
> *)File->MB.getBufferStart();
> - const uint8_t *SecStart = data().begin();
> - return SecStart - FileStart;
> + const uint8_t *fileStart = (const uint8_t
> *)file->mb.getBufferStart();
> + const uint8_t *secStart = data().begin();
> + return secStart - fileStart;
> }
>
> -uint64_t SectionBase::getOffset(uint64_t Offset) const {
> +uint64_t SectionBase::getOffset(uint64_t offset) const {
> switch (kind()) {
> case Output: {
> - auto *OS = cast<OutputSection>(this);
> + auto *os = cast<OutputSection>(this);
> // For output sections we treat offset -1 as the end of the
> section.
> - return Offset == uint64_t(-1) ? OS->Size : Offset;
> + return offset == uint64_t(-1) ? os->size : offset;
> }
> case Regular:
> case Synthetic:
> - return cast<InputSection>(this)->getOffset(Offset);
> + return cast<InputSection>(this)->getOffset(offset);
> case EHFrame:
> // The file crtbeginT.o has relocations pointing to the start of
> an empty
> // .eh_frame that is known to be the first in the link. It does
> that to
> // identify the start of the output .eh_frame.
> - return Offset;
> + return offset;
> case Merge:
> - const MergeInputSection *MS = cast<MergeInputSection>(this);
> - if (InputSection *IS = MS->getParent())
> - return IS->getOffset(MS->getParentOffset(Offset));
> - return MS->getParentOffset(Offset);
> + const MergeInputSection *ms = cast<MergeInputSection>(this);
> + if (InputSection *isec = ms->getParent())
> + return isec->getOffset(ms->getParentOffset(offset));
> + return ms->getParentOffset(offset);
> }
> llvm_unreachable("invalid section kind");
> }
>
> -uint64_t SectionBase::getVA(uint64_t Offset) const {
> - const OutputSection *Out = getOutputSection();
> - return (Out ? Out->Addr : 0) + getOffset(Offset);
> +uint64_t SectionBase::getVA(uint64_t offset) const {
> + const OutputSection *out = getOutputSection();
> + return (out ? out->addr : 0) + getOffset(offset);
> }
>
> OutputSection *SectionBase::getOutputSection() {
> - InputSection *Sec;
> - if (auto *IS = dyn_cast<InputSection>(this))
> - Sec = IS;
> - else if (auto *MS = dyn_cast<MergeInputSection>(this))
> - Sec = MS->getParent();
> - else if (auto *EH = dyn_cast<EhInputSection>(this))
> - Sec = EH->getParent();
> + InputSection *sec;
> + if (auto *isec = dyn_cast<InputSection>(this))
> + sec = isec;
> + else if (auto *ms = dyn_cast<MergeInputSection>(this))
> + sec = ms->getParent();
> + else if (auto *eh = dyn_cast<EhInputSection>(this))
> + sec = eh->getParent();
> else
> return cast<OutputSection>(this);
> - return Sec ? Sec->getParent() : nullptr;
> + return sec ? sec->getParent() : nullptr;
> }
>
> // When a section is compressed, `RawData` consists with a header
> followed
> @@ -214,109 +214,109 @@ void InputSectionBase::parseCompressedHe
> using Chdr32 = typename ELF32LE::Chdr;
>
> // Old-style header
> - if (Name.startswith(".zdebug")) {
> - if (!toStringRef(RawData).startswith("ZLIB")) {
> + if (name.startswith(".zdebug")) {
> + if (!toStringRef(rawData).startswith("ZLIB")) {
> error(toString(this) + ": corrupted compressed section header");
> return;
> }
> - RawData = RawData.slice(4);
> + rawData = rawData.slice(4);
>
> - if (RawData.size() < 8) {
> + if (rawData.size() < 8) {
> error(toString(this) + ": corrupted compressed section header");
> return;
> }
>
> - UncompressedSize = read64be(RawData.data());
> - RawData = RawData.slice(8);
> + uncompressedSize = read64be(rawData.data());
> + rawData = rawData.slice(8);
>
> // Restore the original section name.
> // (e.g. ".zdebug_info" -> ".debug_info")
> - Name = Saver.save("." + Name.substr(2));
> + name = Saver.save("." + name.substr(2));
> return;
> }
>
> - assert(Flags & SHF_COMPRESSED);
> - Flags &= ~(uint64_t)SHF_COMPRESSED;
> + assert(flags & SHF_COMPRESSED);
> + flags &= ~(uint64_t)SHF_COMPRESSED;
>
> // New-style 64-bit header
> - if (Config->Is64) {
> - if (RawData.size() < sizeof(Chdr64)) {
> + if (config->is64) {
> + if (rawData.size() < sizeof(Chdr64)) {
> error(toString(this) + ": corrupted compressed section");
> return;
> }
>
> - auto *Hdr = reinterpret_cast<const Chdr64 *>(RawData.data());
> - if (Hdr->ch_type != ELFCOMPRESS_ZLIB) {
> + auto *hdr = reinterpret_cast<const Chdr64 *>(rawData.data());
> + if (hdr->ch_type != ELFCOMPRESS_ZLIB) {
> error(toString(this) + ": unsupported compression type");
> return;
> }
>
> - UncompressedSize = Hdr->ch_size;
> - Alignment = std::max<uint32_t>(Hdr->ch_addralign, 1);
> - RawData = RawData.slice(sizeof(*Hdr));
> + uncompressedSize = hdr->ch_size;
> + alignment = std::max<uint32_t>(hdr->ch_addralign, 1);
> + rawData = rawData.slice(sizeof(*hdr));
> return;
> }
>
> // New-style 32-bit header
> - if (RawData.size() < sizeof(Chdr32)) {
> + if (rawData.size() < sizeof(Chdr32)) {
> error(toString(this) + ": corrupted compressed section");
> return;
> }
>
> - auto *Hdr = reinterpret_cast<const Chdr32 *>(RawData.data());
> - if (Hdr->ch_type != ELFCOMPRESS_ZLIB) {
> + auto *hdr = reinterpret_cast<const Chdr32 *>(rawData.data());
> + if (hdr->ch_type != ELFCOMPRESS_ZLIB) {
> error(toString(this) + ": unsupported compression type");
> return;
> }
>
> - UncompressedSize = Hdr->ch_size;
> - Alignment = std::max<uint32_t>(Hdr->ch_addralign, 1);
> - RawData = RawData.slice(sizeof(*Hdr));
> + uncompressedSize = hdr->ch_size;
> + alignment = std::max<uint32_t>(hdr->ch_addralign, 1);
> + rawData = rawData.slice(sizeof(*hdr));
> }
>
> InputSection *InputSectionBase::getLinkOrderDep() const {
> - assert(Link);
> - assert(Flags & SHF_LINK_ORDER);
> - return cast<InputSection>(File->getSections()[Link]);
> + assert(link);
> + assert(flags & SHF_LINK_ORDER);
> + return cast<InputSection>(file->getSections()[link]);
> }
>
> // Find a function symbol that encloses a given location.
> template <class ELFT>
> -Defined *InputSectionBase::getEnclosingFunction(uint64_t Offset) {
> - for (Symbol *B : File->getSymbols())
> - if (Defined *D = dyn_cast<Defined>(B))
> - if (D->Section == this && D->Type == STT_FUNC && D->Value <=
> Offset &&
> - Offset < D->Value + D->Size)
> - return D;
> +Defined *InputSectionBase::getEnclosingFunction(uint64_t offset) {
> + for (Symbol *b : file->getSymbols())
> + if (Defined *d = dyn_cast<Defined>(b))
> + if (d->section == this && d->type == STT_FUNC && d->value <=
> offset &&
> + offset < d->value + d->size)
> + return d;
> return nullptr;
> }
>
> // Returns a source location string. Used to construct an error
> message.
> template <class ELFT>
> -std::string InputSectionBase::getLocation(uint64_t Offset) {
> - std::string SecAndOffset = (Name + "+0x" + utohexstr(Offset)).str();
> +std::string InputSectionBase::getLocation(uint64_t offset) {
> + std::string secAndOffset = (name + "+0x" + utohexstr(offset)).str();
>
> // We don't have file for synthetic sections.
> if (getFile<ELFT>() == nullptr)
> - return (Config->OutputFile + ":(" + SecAndOffset + ")")
> + return (config->outputFile + ":(" + secAndOffset + ")")
> .str();
>
> // First check if we can get desired values from debugging
> information.
> - if (Optional<DILineInfo> Info =
> getFile<ELFT>()->getDILineInfo(this, Offset))
> - return Info->FileName + ":" + std::to_string(Info->Line) + ":(" +
> - SecAndOffset + ")";
> + if (Optional<DILineInfo> info =
> getFile<ELFT>()->getDILineInfo(this, offset))
> + return info->FileName + ":" + std::to_string(info->Line) + ":(" +
> + secAndOffset + ")";
>
> // File->SourceFile contains STT_FILE symbol that contains a
> // source file name. If it's missing, we use an object file name.
> - std::string SrcFile = getFile<ELFT>()->SourceFile;
> - if (SrcFile.empty())
> - SrcFile = toString(File);
> + std::string srcFile = getFile<ELFT>()->sourceFile;
> + if (srcFile.empty())
> + srcFile = toString(file);
>
> - if (Defined *D = getEnclosingFunction<ELFT>(Offset))
> - return SrcFile + ":(function " + toString(*D) + ": " +
> SecAndOffset + ")";
> + if (Defined *d = getEnclosingFunction<ELFT>(offset))
> + return srcFile + ":(function " + toString(*d) + ": " +
> secAndOffset + ")";
>
> // If there's no symbol, print out the offset in the section.
> - return (SrcFile + ":(" + SecAndOffset + ")");
> + return (srcFile + ":(" + secAndOffset + ")");
> }
>
> // This function is intended to be used for constructing an error
> message.
> @@ -325,8 +325,8 @@ std::string InputSectionBase::getLocatio
> // foo.c:42 (/home/alice/possibly/very/long/path/foo.c:42)
> //
> // Returns an empty string if there's no way to get line info.
> -std::string InputSectionBase::getSrcMsg(const Symbol &Sym, uint64_t
> Offset) {
> - return File->getSrcMsg(Sym, *this, Offset);
> +std::string InputSectionBase::getSrcMsg(const Symbol &sym, uint64_t
> offset) {
> + return file->getSrcMsg(sym, *this, offset);
> }
>
> // Returns a filename string along with an optional section name. This
> @@ -338,96 +338,96 @@ std::string InputSectionBase::getSrcMsg(
> // or
> //
> // path/to/foo.o:(function bar) in archive path/to/bar.a
> -std::string InputSectionBase::getObjMsg(uint64_t Off) {
> - std::string Filename = File->getName();
> +std::string InputSectionBase::getObjMsg(uint64_t off) {
> + std::string filename = file->getName();
>
> - std::string Archive;
> - if (!File->ArchiveName.empty())
> - Archive = " in archive " + File->ArchiveName;
> + std::string archive;
> + if (!file->archiveName.empty())
> + archive = " in archive " + file->archiveName;
>
> // Find a symbol that encloses a given location.
> - for (Symbol *B : File->getSymbols())
> - if (auto *D = dyn_cast<Defined>(B))
> - if (D->Section == this && D->Value <= Off && Off < D->Value +
> D->Size)
> - return Filename + ":(" + toString(*D) + ")" + Archive;
> + for (Symbol *b : file->getSymbols())
> + if (auto *d = dyn_cast<Defined>(b))
> + if (d->section == this && d->value <= off && off < d->value +
> d->size)
> + return filename + ":(" + toString(*d) + ")" + archive;
>
> // If there's no symbol, print out the offset in the section.
> - return (Filename + ":(" + Name + "+0x" + utohexstr(Off) + ")" +
> Archive)
> + return (filename + ":(" + name + "+0x" + utohexstr(off) + ")" +
> archive)
> .str();
> }
>
> -InputSection InputSection::Discarded(nullptr, 0, 0, 0,
> ArrayRef<uint8_t>(), "");
> +InputSection InputSection::discarded(nullptr, 0, 0, 0,
> ArrayRef<uint8_t>(), "");
>
> -InputSection::InputSection(InputFile *F, uint64_t Flags, uint32_t
> Type,
> - uint32_t Alignment, ArrayRef<uint8_t> Data,
> - StringRef Name, Kind K)
> - : InputSectionBase(F, Flags, Type,
> - /*Entsize*/ 0, /*Link*/ 0, /*Info*/ 0,
> Alignment, Data,
> - Name, K) {}
> +InputSection::InputSection(InputFile *f, uint64_t flags, uint32_t
> type,
> + uint32_t alignment, ArrayRef<uint8_t> data,
> + StringRef name, Kind k)
> + : InputSectionBase(f, flags, type,
> + /*Entsize*/ 0, /*Link*/ 0, /*Info*/ 0,
> alignment, data,
> + name, k) {}
>
> template <class ELFT>
> -InputSection::InputSection(ObjFile<ELFT> &F, const typename
> ELFT::Shdr &Header,
> - StringRef Name)
> - : InputSectionBase(F, Header, Name, InputSectionBase::Regular) {}
> -
> -bool InputSection::classof(const SectionBase *S) {
> - return S->kind() == SectionBase::Regular ||
> - S->kind() == SectionBase::Synthetic;
> +InputSection::InputSection(ObjFile<ELFT> &f, const typename
> ELFT::Shdr &header,
> + StringRef name)
> + : InputSectionBase(f, header, name, InputSectionBase::Regular) {}
> +
> +bool InputSection::classof(const SectionBase *s) {
> + return s->kind() == SectionBase::Regular ||
> + s->kind() == SectionBase::Synthetic;
> }
>
> OutputSection *InputSection::getParent() const {
> - return cast_or_null<OutputSection>(Parent);
> + return cast_or_null<OutputSection>(parent);
> }
>
> // Copy SHT_GROUP section contents. Used only for the -r option.
> -template <class ELFT> void InputSection::copyShtGroup(uint8_t *Buf) {
> +template <class ELFT> void InputSection::copyShtGroup(uint8_t *buf) {
> // ELFT::Word is the 32-bit integral type in the target endianness.
> using u32 = typename ELFT::Word;
> - ArrayRef<u32> From = getDataAs<u32>();
> - auto *To = reinterpret_cast<u32 *>(Buf);
> + ArrayRef<u32> from = getDataAs<u32>();
> + auto *to = reinterpret_cast<u32 *>(buf);
>
> // The first entry is not a section number but a flag.
> - *To++ = From[0];
> + *to++ = from[0];
>
> // Adjust section numbers because section numbers in an input object
> // files are different in the output.
> - ArrayRef<InputSectionBase *> Sections = File->getSections();
> - for (uint32_t Idx : From.slice(1))
> - *To++ = Sections[Idx]->getOutputSection()->SectionIndex;
> + ArrayRef<InputSectionBase *> sections = file->getSections();
> + for (uint32_t idx : from.slice(1))
> + *to++ = sections[idx]->getOutputSection()->sectionIndex;
> }
>
> InputSectionBase *InputSection::getRelocatedSection() const {
> - if (!File || (Type != SHT_RELA && Type != SHT_REL))
> + if (!file || (type != SHT_RELA && type != SHT_REL))
> return nullptr;
> - ArrayRef<InputSectionBase *> Sections = File->getSections();
> - return Sections[Info];
> + ArrayRef<InputSectionBase *> sections = file->getSections();
> + return sections[info];
> }
>
> // This is used for -r and --emit-relocs. We can't use memcpy to copy
> // relocations because we need to update symbol table offset and
> section index
> // for each relocation. So we copy relocations one by one.
> template <class ELFT, class RelTy>
> -void InputSection::copyRelocations(uint8_t *Buf, ArrayRef<RelTy>
> Rels) {
> - InputSectionBase *Sec = getRelocatedSection();
> +void InputSection::copyRelocations(uint8_t *buf, ArrayRef<RelTy>
> rels) {
> + InputSectionBase *sec = getRelocatedSection();
>
> - for (const RelTy &Rel : Rels) {
> - RelType Type = Rel.getType(Config->IsMips64EL);
> - const ObjFile<ELFT> *File = getFile<ELFT>();
> - Symbol &Sym = File->getRelocTargetSym(Rel);
> + for (const RelTy &rel : rels) {
> + RelType type = rel.getType(config->isMips64EL);
> + const ObjFile<ELFT> *file = getFile<ELFT>();
> + Symbol &sym = file->getRelocTargetSym(rel);
>
> - auto *P = reinterpret_cast<typename ELFT::Rela *>(Buf);
> - Buf += sizeof(RelTy);
> + auto *p = reinterpret_cast<typename ELFT::Rela *>(buf);
> + buf += sizeof(RelTy);
>
> if (RelTy::IsRela)
> - P->r_addend = getAddend<ELFT>(Rel);
> + p->r_addend = getAddend<ELFT>(rel);
>
> // Output section VA is zero for -r, so r_offset is an offset
> within the
> // section, but for --emit-relocs it is an virtual address.
> - P->r_offset = Sec->getVA(Rel.r_offset);
> - P->setSymbolAndType(In.SymTab->getSymbolIndex(&Sym), Type,
> - Config->IsMips64EL);
> + p->r_offset = sec->getVA(rel.r_offset);
> + p->setSymbolAndType(in.symTab->getSymbolIndex(&sym), type,
> + config->isMips64EL);
>
> - if (Sym.Type == STT_SECTION) {
> + if (sym.type == STT_SECTION) {
> // We combine multiple section symbols into only one per
> // section. This means we have to update the addend. That is
> // trivial for Elf_Rela, but for Elf_Rel we have to write to the
> @@ -440,34 +440,34 @@ void InputSection::copyRelocations(uint8
> // on .gcc_except_table and debug sections.
> //
> // See the comment in maybeReportUndefined for PPC64 .toc .
> - auto *D = dyn_cast<Defined>(&Sym);
> - if (!D) {
> - if (!Sec->Name.startswith(".debug") &&
> - !Sec->Name.startswith(".zdebug") && Sec->Name !=
> ".eh_frame" &&
> - Sec->Name != ".gcc_except_table" && Sec->Name != ".toc") {
> - uint32_t SecIdx = cast<Undefined>(Sym).DiscardedSecIdx;
> - Elf_Shdr_Impl<ELFT> Sec =
> - CHECK(File->getObj().sections(), File)[SecIdx];
> + auto *d = dyn_cast<Defined>(&sym);
> + if (!d) {
> + if (!sec->name.startswith(".debug") &&
> + !sec->name.startswith(".zdebug") && sec->name !=
> ".eh_frame" &&
> + sec->name != ".gcc_except_table" && sec->name != ".toc") {
> + uint32_t secIdx = cast<Undefined>(sym).discardedSecIdx;
> + Elf_Shdr_Impl<ELFT> sec =
> + CHECK(file->getObj().sections(), file)[secIdx];
> warn("relocation refers to a discarded section: " +
> - CHECK(File->getObj().getSectionName(&Sec), File) +
> - "\n>>> referenced by " + getObjMsg(P->r_offset));
> + CHECK(file->getObj().getSectionName(&sec), file) +
> + "\n>>> referenced by " + getObjMsg(p->r_offset));
> }
> - P->setSymbolAndType(0, 0, false);
> + p->setSymbolAndType(0, 0, false);
> continue;
> }
> - SectionBase *Section = D->Section->Repl;
> - if (!Section->isLive()) {
> - P->setSymbolAndType(0, 0, false);
> + SectionBase *section = d->section->repl;
> + if (!section->isLive()) {
> + p->setSymbolAndType(0, 0, false);
> continue;
> }
>
> - int64_t Addend = getAddend<ELFT>(Rel);
> - const uint8_t *BufLoc = Sec->data().begin() + Rel.r_offset;
> + int64_t addend = getAddend<ELFT>(rel);
> + const uint8_t *bufLoc = sec->data().begin() + rel.r_offset;
> if (!RelTy::IsRela)
> - Addend = Target->getImplicitAddend(BufLoc, Type);
> + addend = target->getImplicitAddend(bufLoc, type);
>
> - if (Config->EMachine == EM_MIPS && Config->Relocatable &&
> - Target->getRelExpr(Type, Sym, BufLoc) == R_MIPS_GOTREL) {
> + if (config->emachine == EM_MIPS && config->relocatable &&
> + target->getRelExpr(type, sym, bufLoc) == R_MIPS_GOTREL) {
> // Some MIPS relocations depend on "gp" value. By default,
> // this value has 0x7ff0 offset from a .got section. But
> // relocatable files produced by a complier or a linker
> @@ -479,13 +479,13 @@ void InputSection::copyRelocations(uint8
> // individual "gp" values used by each input object file.
> // As a workaround we add the "gp" value to the relocation
> // addend and save it back to the file.
> - Addend += Sec->getFile<ELFT>()->MipsGp0;
> + addend += sec->getFile<ELFT>()->mipsGp0;
> }
>
> if (RelTy::IsRela)
> - P->r_addend = Sym.getVA(Addend) -
> Section->getOutputSection()->Addr;
> - else if (Config->Relocatable && Type != Target->NoneRel)
> - Sec->Relocations.push_back({R_ABS, Type, Rel.r_offset,
> Addend, &Sym});
> + p->r_addend = sym.getVA(addend) -
> section->getOutputSection()->addr;
> + else if (config->relocatable && type != target->noneRel)
> + sec->relocations.push_back({R_ABS, type, rel.r_offset,
> addend, &sym});
> }
> }
> }
> @@ -495,13 +495,13 @@ void InputSection::copyRelocations(uint8
> // this context is the address of the place P. A further special case
> is that
> // branch relocations to an undefined weak reference resolve to the
> next
> // instruction.
> -static uint32_t getARMUndefinedRelativeWeakVA(RelType Type, uint32_t
> A,
> - uint32_t P) {
> - switch (Type) {
> +static uint32_t getARMUndefinedRelativeWeakVA(RelType type, uint32_t
> a,
> + uint32_t p) {
> + switch (type) {
> // Unresolved branch relocations to weak references resolve to next
> // instruction, this will be either 2 or 4 bytes on from P.
> case R_ARM_THM_JUMP11:
> - return P + 2 + A;
> + return p + 2 + a;
> case R_ARM_CALL:
> case R_ARM_JUMP24:
> case R_ARM_PC24:
> @@ -509,10 +509,10 @@ static uint32_t getARMUndefinedRelativeW
> case R_ARM_PREL31:
> case R_ARM_THM_JUMP19:
> case R_ARM_THM_JUMP24:
> - return P + 4 + A;
> + return p + 4 + a;
> case R_ARM_THM_CALL:
> // We don't want an interworking BLX to ARM
> - return P + 5 + A;
> + return p + 5 + a;
> // Unresolved non branch pc-relative relocations
> // R_ARM_TARGET2 which can be resolved relatively is not present as
> it never
> // targets a weak-reference.
> @@ -521,29 +521,29 @@ static uint32_t getARMUndefinedRelativeW
> case R_ARM_REL32:
> case R_ARM_THM_MOVW_PREL_NC:
> case R_ARM_THM_MOVT_PREL:
> - return P + A;
> + return p + a;
> }
> llvm_unreachable("ARM pc-relative relocation expected\n");
> }
>
> // The comment above getARMUndefinedRelativeWeakVA applies to this
> function.
> -static uint64_t getAArch64UndefinedRelativeWeakVA(uint64_t Type,
> uint64_t A,
> - uint64_t P) {
> - switch (Type) {
> +static uint64_t getAArch64UndefinedRelativeWeakVA(uint64_t type,
> uint64_t a,
> + uint64_t p) {
> + switch (type) {
> // Unresolved branch relocations to weak references resolve to next
> // instruction, this is 4 bytes on from P.
> case R_AARCH64_CALL26:
> case R_AARCH64_CONDBR19:
> case R_AARCH64_JUMP26:
> case R_AARCH64_TSTBR14:
> - return P + 4 + A;
> + return p + 4 + a;
> // Unresolved non branch pc-relative relocations
> case R_AARCH64_PREL16:
> case R_AARCH64_PREL32:
> case R_AARCH64_PREL64:
> case R_AARCH64_ADR_PREL_LO21:
> case R_AARCH64_LD_PREL_LO19:
> - return P + A;
> + return p + a;
> }
> llvm_unreachable("AArch64 pc-relative relocation expected\n");
> }
> @@ -555,11 +555,11 @@ static uint64_t getAArch64UndefinedRelat
> // The procedure call standard only defines a Read Write Position
> Independent
> // RWPI variant so in practice we should expect the static base to be
> the base
> // of the RW segment.
> -static uint64_t getARMStaticBase(const Symbol &Sym) {
> - OutputSection *OS = Sym.getOutputSection();
> - if (!OS || !OS->PtLoad || !OS->PtLoad->FirstSec)
> - fatal("SBREL relocation to " + Sym.getName() + " without static
> base");
> - return OS->PtLoad->FirstSec->Addr;
> +static uint64_t getARMStaticBase(const Symbol &sym) {
> + OutputSection *os = sym.getOutputSection();
> + if (!os || !os->ptLoad || !os->ptLoad->firstSec)
> + fatal("SBREL relocation to " + sym.getName() + " without static
> base");
> + return os->ptLoad->firstSec->addr;
> }
>
> // For R_RISCV_PC_INDIRECT (R_RISCV_PCREL_LO12_{I,S}), the symbol
> actually
> @@ -568,115 +568,115 @@ static uint64_t getARMStaticBase(const S
> //
> // This function returns the R_RISCV_PCREL_HI20 relocation from
> // R_RISCV_PCREL_LO12's symbol and addend.
> -static Relocation *getRISCVPCRelHi20(const Symbol *Sym, uint64_t
> Addend) {
> - const Defined *D = cast<Defined>(Sym);
> - if (!D->Section) {
> +static Relocation *getRISCVPCRelHi20(const Symbol *sym, uint64_t
> addend) {
> + const Defined *d = cast<Defined>(sym);
> + if (!d->section) {
> error("R_RISCV_PCREL_LO12 relocation points to an absolute
> symbol: " +
> - Sym->getName());
> + sym->getName());
> return nullptr;
> }
> - InputSection *IS = cast<InputSection>(D->Section);
> + InputSection *isec = cast<InputSection>(d->section);
>
> - if (Addend != 0)
> + if (addend != 0)
> warn("Non-zero addend in R_RISCV_PCREL_LO12 relocation to " +
> - IS->getObjMsg(D->Value) + " is ignored");
> + isec->getObjMsg(d->value) + " is ignored");
>
> // Relocations are sorted by offset, so we can use std::equal_range
> to do
> // binary search.
> - Relocation R;
> - R.Offset = D->Value;
> - auto Range =
> - std::equal_range(IS->Relocations.begin(),
> IS->Relocations.end(), R,
> - [](const Relocation &LHS, const Relocation
> &RHS) {
> - return LHS.Offset < RHS.Offset;
> + Relocation r;
> + r.offset = d->value;
> + auto range =
> + std::equal_range(isec->relocations.begin(),
> isec->relocations.end(), r,
> + [](const Relocation &lhs, const Relocation
> &rhs) {
> + return lhs.offset < rhs.offset;
> });
>
> - for (auto It = Range.first; It != Range.second; ++It)
> - if (It->Type == R_RISCV_PCREL_HI20 || It->Type ==
> R_RISCV_GOT_HI20 ||
> - It->Type == R_RISCV_TLS_GD_HI20 || It->Type ==
> R_RISCV_TLS_GOT_HI20)
> - return &*It;
> + for (auto it = range.first; it != range.second; ++it)
> + if (it->type == R_RISCV_PCREL_HI20 || it->type ==
> R_RISCV_GOT_HI20 ||
> + it->type == R_RISCV_TLS_GD_HI20 || it->type ==
> R_RISCV_TLS_GOT_HI20)
> + return &*it;
>
> - error("R_RISCV_PCREL_LO12 relocation points to " +
> IS->getObjMsg(D->Value) +
> + error("R_RISCV_PCREL_LO12 relocation points to " +
> isec->getObjMsg(d->value) +
> " without an associated R_RISCV_PCREL_HI20 relocation");
> return nullptr;
> }
>
> // A TLS symbol's virtual address is relative to the TLS segment. Add
> a
> // target-specific adjustment to produce a thread-pointer-relative
> offset.
> -static int64_t getTlsTpOffset(const Symbol &S) {
> +static int64_t getTlsTpOffset(const Symbol &s) {
> // On targets that support TLSDESC, _TLS_MODULE_BASE_ at tpoff = 0.
> - if (&S == ElfSym::TlsModuleBase)
> + if (&s == ElfSym::tlsModuleBase)
> return 0;
>
> - switch (Config->EMachine) {
> + switch (config->emachine) {
> case EM_ARM:
> case EM_AARCH64:
> // Variant 1. The thread pointer points to a TCB with a fixed
> 2-word size,
> // followed by a variable amount of alignment padding, followed
> by the TLS
> // segment.
> - return S.getVA(0) + alignTo(Config->Wordsize * 2,
> Out::TlsPhdr->p_align);
> + return s.getVA(0) + alignTo(config->wordsize * 2,
> Out::tlsPhdr->p_align);
> case EM_386:
> case EM_X86_64:
> // Variant 2. The TLS segment is located just before the thread
> pointer.
> - return S.getVA(0) - alignTo(Out::TlsPhdr->p_memsz,
> Out::TlsPhdr->p_align);
> + return s.getVA(0) - alignTo(Out::tlsPhdr->p_memsz,
> Out::tlsPhdr->p_align);
> case EM_PPC:
> case EM_PPC64:
> // The thread pointer points to a fixed offset from the start of
> the
> // executable's TLS segment. An offset of 0x7000 allows a signed
> 16-bit
> // offset to reach 0x1000 of TCB/thread-library data and 0xf000
> of the
> // program's TLS segment.
> - return S.getVA(0) - 0x7000;
> + return s.getVA(0) - 0x7000;
> case EM_RISCV:
> - return S.getVA(0);
> + return s.getVA(0);
> default:
> llvm_unreachable("unhandled Config->EMachine");
> }
> }
>
> -static uint64_t getRelocTargetVA(const InputFile *File, RelType Type,
> int64_t A,
> - uint64_t P, const Symbol &Sym,
> RelExpr Expr) {
> - switch (Expr) {
> +static uint64_t getRelocTargetVA(const InputFile *file, RelType type,
> int64_t a,
> + uint64_t p, const Symbol &sym,
> RelExpr expr) {
> + switch (expr) {
> case R_ABS:
> case R_DTPREL:
> case R_RELAX_TLS_LD_TO_LE_ABS:
> case R_RELAX_GOT_PC_NOPIC:
> case R_RISCV_ADD:
> - return Sym.getVA(A);
> + return sym.getVA(a);
> case R_ADDEND:
> - return A;
> + return a;
> case R_ARM_SBREL:
> - return Sym.getVA(A) - getARMStaticBase(Sym);
> + return sym.getVA(a) - getARMStaticBase(sym);
> case R_GOT:
> case R_RELAX_TLS_GD_TO_IE_ABS:
> - return Sym.getGotVA() + A;
> + return sym.getGotVA() + a;
> case R_GOTONLY_PC:
> - return In.Got->getVA() + A - P;
> + return in.got->getVA() + a - p;
> case R_GOTPLTONLY_PC:
> - return In.GotPlt->getVA() + A - P;
> + return in.gotPlt->getVA() + a - p;
> case R_GOTREL:
> case R_PPC64_RELAX_TOC:
> - return Sym.getVA(A) - In.Got->getVA();
> + return sym.getVA(a) - in.got->getVA();
> case R_GOTPLTREL:
> - return Sym.getVA(A) - In.GotPlt->getVA();
> + return sym.getVA(a) - in.gotPlt->getVA();
> case R_GOTPLT:
> case R_RELAX_TLS_GD_TO_IE_GOTPLT:
> - return Sym.getGotVA() + A - In.GotPlt->getVA();
> + return sym.getGotVA() + a - in.gotPlt->getVA();
> case R_TLSLD_GOT_OFF:
> case R_GOT_OFF:
> case R_RELAX_TLS_GD_TO_IE_GOT_OFF:
> - return Sym.getGotOffset() + A;
> + return sym.getGotOffset() + a;
> case R_AARCH64_GOT_PAGE_PC:
> case R_AARCH64_RELAX_TLS_GD_TO_IE_PAGE_PC:
> - return getAArch64Page(Sym.getGotVA() + A) - getAArch64Page(P);
> + return getAArch64Page(sym.getGotVA() + a) - getAArch64Page(p);
> case R_GOT_PC:
> case R_RELAX_TLS_GD_TO_IE:
> - return Sym.getGotVA() + A - P;
> + return sym.getGotVA() + a - p;
> case R_HEXAGON_GOT:
> - return Sym.getGotVA() - In.GotPlt->getVA();
> + return sym.getGotVA() - in.gotPlt->getVA();
> case R_MIPS_GOTREL:
> - return Sym.getVA(A) - In.MipsGot->getGp(File);
> + return sym.getVA(a) - in.mipsGot->getGp(file);
> case R_MIPS_GOT_GP:
> - return In.MipsGot->getGp(File) + A;
> + return in.mipsGot->getGp(file) + a;
> case R_MIPS_GOT_GP_PC: {
> // R_MIPS_LO16 expression has R_MIPS_GOT_GP_PC type iif the target
> // is _gp_disp symbol. In that case we should use the following
> @@ -685,76 +685,76 @@ static uint64_t getRelocTargetVA(const I
> // microMIPS variants of these relocations use slightly different
> // expressions: AHL + GP - P + 3 for %lo() and AHL + GP - P - 1
> for %hi()
> // to correctly handle less-sugnificant bit of the microMIPS
> symbol.
> - uint64_t V = In.MipsGot->getGp(File) + A - P;
> - if (Type == R_MIPS_LO16 || Type == R_MICROMIPS_LO16)
> - V += 4;
> - if (Type == R_MICROMIPS_LO16 || Type == R_MICROMIPS_HI16)
> - V -= 1;
> - return V;
> + uint64_t v = in.mipsGot->getGp(file) + a - p;
> + if (type == R_MIPS_LO16 || type == R_MICROMIPS_LO16)
> + v += 4;
> + if (type == R_MICROMIPS_LO16 || type == R_MICROMIPS_HI16)
> + v -= 1;
> + return v;
> }
> case R_MIPS_GOT_LOCAL_PAGE:
> // If relocation against MIPS local symbol requires GOT entry,
> this entry
> // should be initialized by 'page address'. This address is high
> 16-bits
> // of sum the symbol's value and the addend.
> - return In.MipsGot->getVA() + In.MipsGot->getPageEntryOffset(File,
> Sym, A) -
> - In.MipsGot->getGp(File);
> + return in.mipsGot->getVA() + in.mipsGot->getPageEntryOffset(file,
> sym, a) -
> + in.mipsGot->getGp(file);
> case R_MIPS_GOT_OFF:
> case R_MIPS_GOT_OFF32:
> // In case of MIPS if a GOT relocation has non-zero addend this
> addend
> // should be applied to the GOT entry content not to the GOT
> entry offset.
> // That is why we use separate expression type.
> - return In.MipsGot->getVA() + In.MipsGot->getSymEntryOffset(File,
> Sym, A) -
> - In.MipsGot->getGp(File);
> + return in.mipsGot->getVA() + in.mipsGot->getSymEntryOffset(file,
> sym, a) -
> + in.mipsGot->getGp(file);
> case R_MIPS_TLSGD:
> - return In.MipsGot->getVA() + In.MipsGot->getGlobalDynOffset(File,
> Sym) -
> - In.MipsGot->getGp(File);
> + return in.mipsGot->getVA() + in.mipsGot->getGlobalDynOffset(file,
> sym) -
> + in.mipsGot->getGp(file);
> case R_MIPS_TLSLD:
> - return In.MipsGot->getVA() + In.MipsGot->getTlsIndexOffset(File) -
> - In.MipsGot->getGp(File);
> + return in.mipsGot->getVA() + in.mipsGot->getTlsIndexOffset(file) -
> + in.mipsGot->getGp(file);
> case R_AARCH64_PAGE_PC: {
> - uint64_t Val = Sym.isUndefWeak() ? P + A : Sym.getVA(A);
> - return getAArch64Page(Val) - getAArch64Page(P);
> + uint64_t val = sym.isUndefWeak() ? p + a : sym.getVA(a);
> + return getAArch64Page(val) - getAArch64Page(p);
> }
> case R_RISCV_PC_INDIRECT: {
> - if (const Relocation *HiRel = getRISCVPCRelHi20(&Sym, A))
> - return getRelocTargetVA(File, HiRel->Type, HiRel->Addend,
> Sym.getVA(),
> - *HiRel->Sym, HiRel->Expr);
> + if (const Relocation *hiRel = getRISCVPCRelHi20(&sym, a))
> + return getRelocTargetVA(file, hiRel->type, hiRel->addend,
> sym.getVA(),
> + *hiRel->sym, hiRel->expr);
> return 0;
> }
> case R_PC: {
> - uint64_t Dest;
> - if (Sym.isUndefWeak()) {
> + uint64_t dest;
> + if (sym.isUndefWeak()) {
> // On ARM and AArch64 a branch to an undefined weak resolves to
> the
> // next instruction, otherwise the place.
> - if (Config->EMachine == EM_ARM)
> - Dest = getARMUndefinedRelativeWeakVA(Type, A, P);
> - else if (Config->EMachine == EM_AARCH64)
> - Dest = getAArch64UndefinedRelativeWeakVA(Type, A, P);
> - else if (Config->EMachine == EM_PPC)
> - Dest = P;
> + if (config->emachine == EM_ARM)
> + dest = getARMUndefinedRelativeWeakVA(type, a, p);
> + else if (config->emachine == EM_AARCH64)
> + dest = getAArch64UndefinedRelativeWeakVA(type, a, p);
> + else if (config->emachine == EM_PPC)
> + dest = p;
> else
> - Dest = Sym.getVA(A);
> + dest = sym.getVA(a);
> } else {
> - Dest = Sym.getVA(A);
> + dest = sym.getVA(a);
> }
> - return Dest - P;
> + return dest - p;
> }
> case R_PLT:
> - return Sym.getPltVA() + A;
> + return sym.getPltVA() + a;
> case R_PLT_PC:
> case R_PPC64_CALL_PLT:
> - return Sym.getPltVA() + A - P;
> + return sym.getPltVA() + a - p;
> case R_PPC32_PLTREL:
> // R_PPC_PLTREL24 uses the addend (usually 0 or 0x8000) to
> indicate r30
> // stores _GLOBAL_OFFSET_TABLE_ or .got2+0x8000. The addend is
> ignored for
> // target VA compuation.
> - return Sym.getPltVA() - P;
> + return sym.getPltVA() - p;
> case R_PPC64_CALL: {
> - uint64_t SymVA = Sym.getVA(A);
> + uint64_t symVA = sym.getVA(a);
> // If we have an undefined weak symbol, we might get here with a
> symbol
> // address of zero. That could overflow, but the code must be
> unreachable,
> // so don't bother doing anything at all.
> - if (!SymVA)
> + if (!symVA)
> return 0;
>
> // PPC64 V2 ABI describes two entry points to a function. The
> global entry
> @@ -763,12 +763,12 @@ static uint64_t getRelocTargetVA(const I
> // the callee. For local calls the caller and callee share the
> same
> // TOC base and so the TOC pointer initialization code should be
> skipped by
> // branching to the local entry point.
> - return SymVA - P +
> getPPC64GlobalEntryToLocalEntryOffset(Sym.StOther);
> + return symVA - p +
> getPPC64GlobalEntryToLocalEntryOffset(sym.stOther);
> }
> case R_PPC64_TOCBASE:
> - return getPPC64TocBase() + A;
> + return getPPC64TocBase() + a;
> case R_RELAX_GOT_PC:
> - return Sym.getVA(A) - P;
> + return sym.getVA(a) - p;
> case R_RELAX_TLS_GD_TO_LE:
> case R_RELAX_TLS_IE_TO_LE:
> case R_RELAX_TLS_LD_TO_LE:
> @@ -777,35 +777,35 @@ static uint64_t getRelocTargetVA(const I
> // --noinhibit-exec, even a non-weak undefined reference may
> reach here.
> // Just return A, which matches R_ABS, and the behavior of some
> dynamic
> // loaders.
> - if (Sym.isUndefined())
> - return A;
> - return getTlsTpOffset(Sym) + A;
> + if (sym.isUndefined())
> + return a;
> + return getTlsTpOffset(sym) + a;
> case R_RELAX_TLS_GD_TO_LE_NEG:
> case R_NEG_TLS:
> - if (Sym.isUndefined())
> - return A;
> - return -getTlsTpOffset(Sym) + A;
> + if (sym.isUndefined())
> + return a;
> + return -getTlsTpOffset(sym) + a;
> case R_SIZE:
> - return Sym.getSize() + A;
> + return sym.getSize() + a;
> case R_TLSDESC:
> - return In.Got->getGlobalDynAddr(Sym) + A;
> + return in.got->getGlobalDynAddr(sym) + a;
> case R_TLSDESC_PC:
> - return In.Got->getGlobalDynAddr(Sym) + A - P;
> + return in.got->getGlobalDynAddr(sym) + a - p;
> case R_AARCH64_TLSDESC_PAGE:
> - return getAArch64Page(In.Got->getGlobalDynAddr(Sym) + A) -
> - getAArch64Page(P);
> + return getAArch64Page(in.got->getGlobalDynAddr(sym) + a) -
> + getAArch64Page(p);
> case R_TLSGD_GOT:
> - return In.Got->getGlobalDynOffset(Sym) + A;
> + return in.got->getGlobalDynOffset(sym) + a;
> case R_TLSGD_GOTPLT:
> - return In.Got->getVA() + In.Got->getGlobalDynOffset(Sym) + A -
> In.GotPlt->getVA();
> + return in.got->getVA() + in.got->getGlobalDynOffset(sym) + a -
> in.gotPlt->getVA();
> case R_TLSGD_PC:
> - return In.Got->getGlobalDynAddr(Sym) + A - P;
> + return in.got->getGlobalDynAddr(sym) + a - p;
> case R_TLSLD_GOTPLT:
> - return In.Got->getVA() + In.Got->getTlsIndexOff() + A -
> In.GotPlt->getVA();
> + return in.got->getVA() + in.got->getTlsIndexOff() + a -
> in.gotPlt->getVA();
> case R_TLSLD_GOT:
> - return In.Got->getTlsIndexOff() + A;
> + return in.got->getTlsIndexOff() + a;
> case R_TLSLD_PC:
> - return In.Got->getTlsIndexVA() + A - P;
> + return in.got->getTlsIndexVA() + a - p;
> default:
> llvm_unreachable("invalid expression");
> }
> @@ -819,36 +819,36 @@ static uint64_t getRelocTargetVA(const I
> // So, we handle relocations for non-alloc sections directly in this
> // function as a performance optimization.
> template <class ELFT, class RelTy>
> -void InputSection::relocateNonAlloc(uint8_t *Buf, ArrayRef<RelTy>
> Rels) {
> - const unsigned Bits = sizeof(typename ELFT::uint) * 8;
> +void InputSection::relocateNonAlloc(uint8_t *buf, ArrayRef<RelTy>
> rels) {
> + const unsigned bits = sizeof(typename ELFT::uint) * 8;
>
> - for (const RelTy &Rel : Rels) {
> - RelType Type = Rel.getType(Config->IsMips64EL);
> + for (const RelTy &rel : rels) {
> + RelType type = rel.getType(config->isMips64EL);
>
> // GCC 8.0 or earlier have a bug that they emit R_386_GOTPC
> relocations
> // against _GLOBAL_OFFSET_TABLE_ for .debug_info. The bug has
> been fixed
> // in 2017 (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82630),
> but we
> // need to keep this bug-compatible code for a while.
> - if (Config->EMachine == EM_386 && Type == R_386_GOTPC)
> + if (config->emachine == EM_386 && type == R_386_GOTPC)
> continue;
>
> - uint64_t Offset = getOffset(Rel.r_offset);
> - uint8_t *BufLoc = Buf + Offset;
> - int64_t Addend = getAddend<ELFT>(Rel);
> + uint64_t offset = getOffset(rel.r_offset);
> + uint8_t *bufLoc = buf + offset;
> + int64_t addend = getAddend<ELFT>(rel);
> if (!RelTy::IsRela)
> - Addend += Target->getImplicitAddend(BufLoc, Type);
> + addend += target->getImplicitAddend(bufLoc, type);
>
> - Symbol &Sym = getFile<ELFT>()->getRelocTargetSym(Rel);
> - RelExpr Expr = Target->getRelExpr(Type, Sym, BufLoc);
> - if (Expr == R_NONE)
> + Symbol &sym = getFile<ELFT>()->getRelocTargetSym(rel);
> + RelExpr expr = target->getRelExpr(type, sym, bufLoc);
> + if (expr == R_NONE)
> continue;
>
> - if (Expr != R_ABS && Expr != R_DTPREL && Expr != R_RISCV_ADD) {
> - std::string Msg = getLocation<ELFT>(Offset) +
> - ": has non-ABS relocation " + toString(Type) +
> - " against symbol '" + toString(Sym) + "'";
> - if (Expr != R_PC) {
> - error(Msg);
> + if (expr != R_ABS && expr != R_DTPREL && expr != R_RISCV_ADD) {
> + std::string msg = getLocation<ELFT>(offset) +
> + ": has non-ABS relocation " + toString(type) +
> + " against symbol '" + toString(sym) + "'";
> + if (expr != R_PC) {
> + error(msg);
> return;
> }
>
> @@ -859,16 +859,16 @@ void InputSection::relocateNonAlloc(uint
> // relocations without any errors and relocate them as if they
> were at
> // address 0. For bug-compatibilty, we accept them with
> warnings. We
> // know Steel Bank Common Lisp as of 2018 have this bug.
> - warn(Msg);
> - Target->relocateOne(BufLoc, Type,
> - SignExtend64<Bits>(Sym.getVA(Addend -
> Offset)));
> + warn(msg);
> + target->relocateOne(bufLoc, type,
> + SignExtend64<bits>(sym.getVA(addend -
> offset)));
> continue;
> }
>
> - if (Sym.isTls() && !Out::TlsPhdr)
> - Target->relocateOne(BufLoc, Type, 0);
> + if (sym.isTls() && !Out::tlsPhdr)
> + target->relocateOne(bufLoc, type, 0);
> else
> - Target->relocateOne(BufLoc, Type,
> SignExtend64<Bits>(Sym.getVA(Addend)));
> + target->relocateOne(bufLoc, type,
> SignExtend64<bits>(sym.getVA(addend)));
> }
> }
>
> @@ -877,100 +877,100 @@ void InputSection::relocateNonAlloc(uint
> // relocations aimed to update addends. They are handled in
> relocateAlloc()
> // for allocatable sections, and this function does the same for
> // non-allocatable sections, such as sections with debug information.
> -static void relocateNonAllocForRelocatable(InputSection *Sec, uint8_t
> *Buf) {
> - const unsigned Bits = Config->Is64 ? 64 : 32;
> +static void relocateNonAllocForRelocatable(InputSection *sec, uint8_t
> *buf) {
> + const unsigned bits = config->is64 ? 64 : 32;
>
> - for (const Relocation &Rel : Sec->Relocations) {
> + for (const Relocation &rel : sec->relocations) {
> // InputSection::copyRelocations() adds only R_ABS relocations.
> - assert(Rel.Expr == R_ABS);
> - uint8_t *BufLoc = Buf + Rel.Offset + Sec->OutSecOff;
> - uint64_t TargetVA = SignExtend64(Rel.Sym->getVA(Rel.Addend),
> Bits);
> - Target->relocateOne(BufLoc, Rel.Type, TargetVA);
> + assert(rel.expr == R_ABS);
> + uint8_t *bufLoc = buf + rel.offset + sec->outSecOff;
> + uint64_t targetVA = SignExtend64(rel.sym->getVA(rel.addend),
> bits);
> + target->relocateOne(bufLoc, rel.type, targetVA);
> }
> }
>
> template <class ELFT>
> -void InputSectionBase::relocate(uint8_t *Buf, uint8_t *BufEnd) {
> - if (Flags & SHF_EXECINSTR)
> - adjustSplitStackFunctionPrologues<ELFT>(Buf, BufEnd);
> +void InputSectionBase::relocate(uint8_t *buf, uint8_t *bufEnd) {
> + if (flags & SHF_EXECINSTR)
> + adjustSplitStackFunctionPrologues<ELFT>(buf, bufEnd);
>
> - if (Flags & SHF_ALLOC) {
> - relocateAlloc(Buf, BufEnd);
> + if (flags & SHF_ALLOC) {
> + relocateAlloc(buf, bufEnd);
> return;
> }
>
> - auto *Sec = cast<InputSection>(this);
> - if (Config->Relocatable)
> - relocateNonAllocForRelocatable(Sec, Buf);
> - else if (Sec->AreRelocsRela)
> - Sec->relocateNonAlloc<ELFT>(Buf, Sec->template relas<ELFT>());
> + auto *sec = cast<InputSection>(this);
> + if (config->relocatable)
> + relocateNonAllocForRelocatable(sec, buf);
> + else if (sec->areRelocsRela)
> + sec->relocateNonAlloc<ELFT>(buf, sec->template relas<ELFT>());
> else
> - Sec->relocateNonAlloc<ELFT>(Buf, Sec->template rels<ELFT>());
> + sec->relocateNonAlloc<ELFT>(buf, sec->template rels<ELFT>());
> }
>
> -void InputSectionBase::relocateAlloc(uint8_t *Buf, uint8_t *BufEnd) {
> - assert(Flags & SHF_ALLOC);
> - const unsigned Bits = Config->Wordsize * 8;
> -
> - for (const Relocation &Rel : Relocations) {
> - uint64_t Offset = Rel.Offset;
> - if (auto *Sec = dyn_cast<InputSection>(this))
> - Offset += Sec->OutSecOff;
> - uint8_t *BufLoc = Buf + Offset;
> - RelType Type = Rel.Type;
> -
> - uint64_t AddrLoc = getOutputSection()->Addr + Offset;
> - RelExpr Expr = Rel.Expr;
> - uint64_t TargetVA = SignExtend64(
> - getRelocTargetVA(File, Type, Rel.Addend, AddrLoc, *Rel.Sym,
> Expr),
> - Bits);
> +void InputSectionBase::relocateAlloc(uint8_t *buf, uint8_t *bufEnd) {
> + assert(flags & SHF_ALLOC);
> + const unsigned bits = config->wordsize * 8;
> +
> + for (const Relocation &rel : relocations) {
> + uint64_t offset = rel.offset;
> + if (auto *sec = dyn_cast<InputSection>(this))
> + offset += sec->outSecOff;
> + uint8_t *bufLoc = buf + offset;
> + RelType type = rel.type;
> +
> + uint64_t addrLoc = getOutputSection()->addr + offset;
> + RelExpr expr = rel.expr;
> + uint64_t targetVA = SignExtend64(
> + getRelocTargetVA(file, type, rel.addend, addrLoc, *rel.sym,
> expr),
> + bits);
>
> - switch (Expr) {
> + switch (expr) {
> case R_RELAX_GOT_PC:
> case R_RELAX_GOT_PC_NOPIC:
> - Target->relaxGot(BufLoc, Type, TargetVA);
> + target->relaxGot(bufLoc, type, targetVA);
> break;
> case R_PPC64_RELAX_TOC:
> - if (!tryRelaxPPC64TocIndirection(Type, Rel, BufLoc))
> - Target->relocateOne(BufLoc, Type, TargetVA);
> + if (!tryRelaxPPC64TocIndirection(type, rel, bufLoc))
> + target->relocateOne(bufLoc, type, targetVA);
> break;
> case R_RELAX_TLS_IE_TO_LE:
> - Target->relaxTlsIeToLe(BufLoc, Type, TargetVA);
> + target->relaxTlsIeToLe(bufLoc, type, targetVA);
> break;
> case R_RELAX_TLS_LD_TO_LE:
> case R_RELAX_TLS_LD_TO_LE_ABS:
> - Target->relaxTlsLdToLe(BufLoc, Type, TargetVA);
> + target->relaxTlsLdToLe(bufLoc, type, targetVA);
> break;
> case R_RELAX_TLS_GD_TO_LE:
> case R_RELAX_TLS_GD_TO_LE_NEG:
> - Target->relaxTlsGdToLe(BufLoc, Type, TargetVA);
> + target->relaxTlsGdToLe(bufLoc, type, targetVA);
> break;
> case R_AARCH64_RELAX_TLS_GD_TO_IE_PAGE_PC:
> case R_RELAX_TLS_GD_TO_IE:
> case R_RELAX_TLS_GD_TO_IE_ABS:
> case R_RELAX_TLS_GD_TO_IE_GOT_OFF:
> case R_RELAX_TLS_GD_TO_IE_GOTPLT:
> - Target->relaxTlsGdToIe(BufLoc, Type, TargetVA);
> + target->relaxTlsGdToIe(bufLoc, type, targetVA);
> break;
> case R_PPC64_CALL:
> // If this is a call to __tls_get_addr, it may be part of a TLS
> // sequence that has been relaxed and turned into a nop. In this
> // case, we don't want to handle it as a call.
> - if (read32(BufLoc) == 0x60000000) // nop
> + if (read32(bufLoc) == 0x60000000) // nop
> break;
>
> // Patch a nop (0x60000000) to a ld.
> - if (Rel.Sym->NeedsTocRestore) {
> - if (BufLoc + 8 > BufEnd || read32(BufLoc + 4) != 0x60000000) {
> - error(getErrorLocation(BufLoc) + "call lacks nop, can't
> restore toc");
> + if (rel.sym->needsTocRestore) {
> + if (bufLoc + 8 > bufEnd || read32(bufLoc + 4) != 0x60000000) {
> + error(getErrorLocation(bufLoc) + "call lacks nop, can't
> restore toc");
> break;
> }
> - write32(BufLoc + 4, 0xe8410018); // ld %r2, 24(%r1)
> + write32(bufLoc + 4, 0xe8410018); // ld %r2, 24(%r1)
> }
> - Target->relocateOne(BufLoc, Type, TargetVA);
> + target->relocateOne(bufLoc, type, targetVA);
> break;
> default:
> - Target->relocateOne(BufLoc, Type, TargetVA);
> + target->relocateOne(bufLoc, type, targetVA);
> break;
> }
> }
> @@ -979,44 +979,44 @@ void InputSectionBase::relocateAlloc(uin
> // For each function-defining prologue, find any calls to __morestack,
> // and replace them with calls to __morestack_non_split.
> static void switchMorestackCallsToMorestackNonSplit(
> - DenseSet<Defined *> &Prologues, std::vector<Relocation *>
> &MorestackCalls) {
> + DenseSet<Defined *> &prologues, std::vector<Relocation *>
> &morestackCalls) {
>
> // If the target adjusted a function's prologue, all calls to
> // __morestack inside that function should be switched to
> // __morestack_non_split.
> - Symbol *MoreStackNonSplit = Symtab->find("__morestack_non_split");
> - if (!MoreStackNonSplit) {
> + Symbol *moreStackNonSplit = symtab->find("__morestack_non_split");
> + if (!moreStackNonSplit) {
> error("Mixing split-stack objects requires a definition of "
> "__morestack_non_split");
> return;
> }
>
> // Sort both collections to compare addresses efficiently.
> - llvm::sort(MorestackCalls, [](const Relocation *L, const Relocation
> *R) {
> - return L->Offset < R->Offset;
> + llvm::sort(morestackCalls, [](const Relocation *l, const Relocation
> *r) {
> + return l->offset < r->offset;
> });
> - std::vector<Defined *> Functions(Prologues.begin(),
> Prologues.end());
> - llvm::sort(Functions, [](const Defined *L, const Defined *R) {
> - return L->Value < R->Value;
> + std::vector<Defined *> functions(prologues.begin(),
> prologues.end());
> + llvm::sort(functions, [](const Defined *l, const Defined *r) {
> + return l->value < r->value;
> });
>
> - auto It = MorestackCalls.begin();
> - for (Defined *F : Functions) {
> + auto it = morestackCalls.begin();
> + for (Defined *f : functions) {
> // Find the first call to __morestack within the function.
> - while (It != MorestackCalls.end() && (*It)->Offset < F->Value)
> - ++It;
> + while (it != morestackCalls.end() && (*it)->offset < f->value)
> + ++it;
> // Adjust all calls inside the function.
> - while (It != MorestackCalls.end() && (*It)->Offset < F->Value +
> F->Size) {
> - (*It)->Sym = MoreStackNonSplit;
> - ++It;
> + while (it != morestackCalls.end() && (*it)->offset < f->value +
> f->size) {
> + (*it)->sym = moreStackNonSplit;
> + ++it;
> }
> }
> }
>
> -static bool enclosingPrologueAttempted(uint64_t Offset,
> - const DenseSet<Defined *>
> &Prologues) {
> - for (Defined *F : Prologues)
> - if (F->Value <= Offset && Offset < F->Value + F->Size)
> +static bool enclosingPrologueAttempted(uint64_t offset,
> + const DenseSet<Defined *>
> &prologues) {
> + for (Defined *f : prologues)
> + if (f->value <= offset && offset < f->value + f->size)
> return true;
> return false;
> }
> @@ -1026,30 +1026,30 @@ static bool enclosingPrologueAttempted(u
> // adjusted to ensure that the called function will have enough stack
> // available. Find those functions, and adjust their prologues.
> template <class ELFT>
> -void InputSectionBase::adjustSplitStackFunctionPrologues(uint8_t *Buf,
> - uint8_t
> *End) {
> - if (!getFile<ELFT>()->SplitStack)
> +void InputSectionBase::adjustSplitStackFunctionPrologues(uint8_t *buf,
> + uint8_t
> *end) {
> + if (!getFile<ELFT>()->splitStack)
> return;
> - DenseSet<Defined *> Prologues;
> - std::vector<Relocation *> MorestackCalls;
> + DenseSet<Defined *> prologues;
> + std::vector<Relocation *> morestackCalls;
>
> - for (Relocation &Rel : Relocations) {
> + for (Relocation &rel : relocations) {
> // Local symbols can't possibly be cross-calls, and should have
> been
> // resolved long before this line.
> - if (Rel.Sym->isLocal())
> + if (rel.sym->isLocal())
> continue;
>
> // Ignore calls into the split-stack api.
> - if (Rel.Sym->getName().startswith("__morestack")) {
> - if (Rel.Sym->getName().equals("__morestack"))
> - MorestackCalls.push_back(&Rel);
> + if (rel.sym->getName().startswith("__morestack")) {
> + if (rel.sym->getName().equals("__morestack"))
> + morestackCalls.push_back(&rel);
> continue;
> }
>
> // A relocation to non-function isn't relevant. Sometimes
> // __morestack is not marked as a function, so this check comes
> // after the name check.
> - if (Rel.Sym->Type != STT_FUNC)
> + if (rel.sym->type != STT_FUNC)
> continue;
>
> // If the callee's-file was compiled with split stack, nothing to
> do. In
> @@ -1057,117 +1057,117 @@ void InputSectionBase::adjustSplitStackF
> // being produced". So an "undefined" symbol might be provided by
> a shared
> // library. It is not possible to tell how such symbols were
> compiled, so be
> // conservative.
> - if (Defined *D = dyn_cast<Defined>(Rel.Sym))
> - if (InputSection *IS = cast_or_null<InputSection>(D->Section))
> - if (!IS || !IS->getFile<ELFT>() ||
> IS->getFile<ELFT>()->SplitStack)
> + if (Defined *d = dyn_cast<Defined>(rel.sym))
> + if (InputSection *isec = cast_or_null<InputSection>(d->section))
> + if (!isec || !isec->getFile<ELFT>() ||
> isec->getFile<ELFT>()->splitStack)
> continue;
>
> - if (enclosingPrologueAttempted(Rel.Offset, Prologues))
> + if (enclosingPrologueAttempted(rel.offset, prologues))
> continue;
>
> - if (Defined *F = getEnclosingFunction<ELFT>(Rel.Offset)) {
> - Prologues.insert(F);
> - if (Target->adjustPrologueForCrossSplitStack(Buf +
> getOffset(F->Value),
> - End, F->StOther))
> + if (Defined *f = getEnclosingFunction<ELFT>(rel.offset)) {
> + prologues.insert(f);
> + if (target->adjustPrologueForCrossSplitStack(buf +
> getOffset(f->value),
> + end, f->stOther))
> continue;
> - if (!getFile<ELFT>()->SomeNoSplitStack)
> - error(lld::toString(this) + ": " + F->getName() +
> - " (with -fsplit-stack) calls " + Rel.Sym->getName() +
> + if (!getFile<ELFT>()->someNoSplitStack)
> + error(lld::toString(this) + ": " + f->getName() +
> + " (with -fsplit-stack) calls " + rel.sym->getName() +
> " (without -fsplit-stack), but couldn't adjust its
> prologue");
> }
> }
>
> - if (Target->NeedsMoreStackNonSplit)
> - switchMorestackCallsToMorestackNonSplit(Prologues,
> MorestackCalls);
> + if (target->needsMoreStackNonSplit)
> + switchMorestackCallsToMorestackNonSplit(prologues,
> morestackCalls);
> }
>
> -template <class ELFT> void InputSection::writeTo(uint8_t *Buf) {
> - if (Type == SHT_NOBITS)
> +template <class ELFT> void InputSection::writeTo(uint8_t *buf) {
> + if (type == SHT_NOBITS)
> return;
>
> - if (auto *S = dyn_cast<SyntheticSection>(this)) {
> - S->writeTo(Buf + OutSecOff);
> + if (auto *s = dyn_cast<SyntheticSection>(this)) {
> + s->writeTo(buf + outSecOff);
> return;
> }
>
> // If -r or --emit-relocs is given, then an InputSection
> // may be a relocation section.
> - if (Type == SHT_RELA) {
> - copyRelocations<ELFT>(Buf + OutSecOff, getDataAs<typename
> ELFT::Rela>());
> + if (type == SHT_RELA) {
> + copyRelocations<ELFT>(buf + outSecOff, getDataAs<typename
> ELFT::Rela>());
> return;
> }
> - if (Type == SHT_REL) {
> - copyRelocations<ELFT>(Buf + OutSecOff, getDataAs<typename
> ELFT::Rel>());
> + if (type == SHT_REL) {
> + copyRelocations<ELFT>(buf + outSecOff, getDataAs<typename
> ELFT::Rel>());
> return;
> }
>
> // If -r is given, we may have a SHT_GROUP section.
> - if (Type == SHT_GROUP) {
> - copyShtGroup<ELFT>(Buf + OutSecOff);
> + if (type == SHT_GROUP) {
> + copyShtGroup<ELFT>(buf + outSecOff);
> return;
> }
>
> // If this is a compressed section, uncompress section contents
> directly
> // to the buffer.
> - if (UncompressedSize >= 0) {
> - size_t Size = UncompressedSize;
> - if (Error E = zlib::uncompress(toStringRef(RawData),
> - (char *)(Buf + OutSecOff), Size))
> + if (uncompressedSize >= 0) {
> + size_t size = uncompressedSize;
> + if (Error e = zlib::uncompress(toStringRef(rawData),
> + (char *)(buf + outSecOff), size))
> fatal(toString(this) +
> - ": uncompress failed: " + llvm::toString(std::move(E)));
> - uint8_t *BufEnd = Buf + OutSecOff + Size;
> - relocate<ELFT>(Buf, BufEnd);
> + ": uncompress failed: " + llvm::toString(std::move(e)));
> + uint8_t *bufEnd = buf + outSecOff + size;
> + relocate<ELFT>(buf, bufEnd);
> return;
> }
>
> // Copy section contents from source object file to output file
> // and then apply relocations.
> - memcpy(Buf + OutSecOff, data().data(), data().size());
> - uint8_t *BufEnd = Buf + OutSecOff + data().size();
> - relocate<ELFT>(Buf, BufEnd);
> + memcpy(buf + outSecOff, data().data(), data().size());
> + uint8_t *bufEnd = buf + outSecOff + data().size();
> + relocate<ELFT>(buf, bufEnd);
> }
>
> -void InputSection::replace(InputSection *Other) {
> - Alignment = std::max(Alignment, Other->Alignment);
> +void InputSection::replace(InputSection *other) {
> + alignment = std::max(alignment, other->alignment);
>
> // When a section is replaced with another section that was
> allocated to
> // another partition, the replacement section (and its associated
> sections)
> // need to be placed in the main partition so that both partitions
> will be
> // able to access it.
> - if (Partition != Other->Partition) {
> - Partition = 1;
> - for (InputSection *IS : DependentSections)
> - IS->Partition = 1;
> + if (partition != other->partition) {
> + partition = 1;
> + for (InputSection *isec : dependentSections)
> + isec->partition = 1;
> }
>
> - Other->Repl = Repl;
> - Other->markDead();
> + other->repl = repl;
> + other->markDead();
> }
>
> template <class ELFT>
> -EhInputSection::EhInputSection(ObjFile<ELFT> &F,
> - const typename ELFT::Shdr &Header,
> - StringRef Name)
> - : InputSectionBase(F, Header, Name, InputSectionBase::EHFrame) {}
> +EhInputSection::EhInputSection(ObjFile<ELFT> &f,
> + const typename ELFT::Shdr &header,
> + StringRef name)
> + : InputSectionBase(f, header, name, InputSectionBase::EHFrame) {}
>
> SyntheticSection *EhInputSection::getParent() const {
> - return cast_or_null<SyntheticSection>(Parent);
> + return cast_or_null<SyntheticSection>(parent);
> }
>
> // Returns the index of the first relocation that points to a region
> between
> // Begin and Begin+Size.
> template <class IntTy, class RelTy>
> -static unsigned getReloc(IntTy Begin, IntTy Size, const
> ArrayRef<RelTy> &Rels,
> - unsigned &RelocI) {
> +static unsigned getReloc(IntTy begin, IntTy size, const
> ArrayRef<RelTy> &rels,
> + unsigned &relocI) {
> // Start search from RelocI for fast access. That works because the
> // relocations are sorted in .eh_frame.
> - for (unsigned N = Rels.size(); RelocI < N; ++RelocI) {
> - const RelTy &Rel = Rels[RelocI];
> - if (Rel.r_offset < Begin)
> + for (unsigned n = rels.size(); relocI < n; ++relocI) {
> + const RelTy &rel = rels[relocI];
> + if (rel.r_offset < begin)
> continue;
>
> - if (Rel.r_offset < Begin + Size)
> - return RelocI;
> + if (rel.r_offset < begin + size)
> + return relocI;
> return -1;
> }
> return -1;
> @@ -1176,84 +1176,84 @@ static unsigned getReloc(IntTy Begin, In
> // .eh_frame is a sequence of CIE or FDE records.
> // This function splits an input section into records and returns
> them.
> template <class ELFT> void EhInputSection::split() {
> - if (AreRelocsRela)
> + if (areRelocsRela)
> split<ELFT>(relas<ELFT>());
> else
> split<ELFT>(rels<ELFT>());
> }
>
> template <class ELFT, class RelTy>
> -void EhInputSection::split(ArrayRef<RelTy> Rels) {
> - unsigned RelI = 0;
> - for (size_t Off = 0, End = data().size(); Off != End;) {
> - size_t Size = readEhRecordSize(this, Off);
> - Pieces.emplace_back(Off, this, Size, getReloc(Off, Size, Rels,
> RelI));
> +void EhInputSection::split(ArrayRef<RelTy> rels) {
> + unsigned relI = 0;
> + for (size_t off = 0, end = data().size(); off != end;) {
> + size_t size = readEhRecordSize(this, off);
> + pieces.emplace_back(off, this, size, getReloc(off, size, rels,
> relI));
> // The empty record is the end marker.
> - if (Size == 4)
> + if (size == 4)
> break;
> - Off += Size;
> + off += size;
> }
> }
>
> -static size_t findNull(StringRef S, size_t EntSize) {
> +static size_t findNull(StringRef s, size_t entSize) {
> // Optimize the common case.
> - if (EntSize == 1)
> - return S.find(0);
> + if (entSize == 1)
> + return s.find(0);
>
> - for (unsigned I = 0, N = S.size(); I != N; I += EntSize) {
> - const char *B = S.begin() + I;
> - if (std::all_of(B, B + EntSize, [](char C) { return C == 0; }))
> - return I;
> + for (unsigned i = 0, n = s.size(); i != n; i += entSize) {
> + const char *b = s.begin() + i;
> + if (std::all_of(b, b + entSize, [](char c) { return c == 0; }))
> + return i;
> }
> return StringRef::npos;
> }
>
> SyntheticSection *MergeInputSection::getParent() const {
> - return cast_or_null<SyntheticSection>(Parent);
> + return cast_or_null<SyntheticSection>(parent);
> }
>
> // Split SHF_STRINGS section. Such section is a sequence of
> // null-terminated strings.
> -void MergeInputSection::splitStrings(ArrayRef<uint8_t> Data, size_t
> EntSize) {
> - size_t Off = 0;
> - bool IsAlloc = Flags & SHF_ALLOC;
> - StringRef S = toStringRef(Data);
> -
> - while (!S.empty()) {
> - size_t End = findNull(S, EntSize);
> - if (End == StringRef::npos)
> +void MergeInputSection::splitStrings(ArrayRef<uint8_t> data, size_t
> entSize) {
> + size_t off = 0;
> + bool isAlloc = flags & SHF_ALLOC;
> + StringRef s = toStringRef(data);
> +
> + while (!s.empty()) {
> + size_t end = findNull(s, entSize);
> + if (end == StringRef::npos)
> fatal(toString(this) + ": string is not null terminated");
> - size_t Size = End + EntSize;
> + size_t size = end + entSize;
>
> - Pieces.emplace_back(Off, xxHash64(S.substr(0, Size)), !IsAlloc);
> - S = S.substr(Size);
> - Off += Size;
> + pieces.emplace_back(off, xxHash64(s.substr(0, size)), !isAlloc);
> + s = s.substr(size);
> + off += size;
> }
> }
>
> // Split non-SHF_STRINGS section. Such section is a sequence of
> // fixed size records.
> -void MergeInputSection::splitNonStrings(ArrayRef<uint8_t> Data,
> - size_t EntSize) {
> - size_t Size = Data.size();
> - assert((Size % EntSize) == 0);
> - bool IsAlloc = Flags & SHF_ALLOC;
> +void MergeInputSection::splitNonStrings(ArrayRef<uint8_t> data,
> + size_t entSize) {
> + size_t size = data.size();
> + assert((size % entSize) == 0);
> + bool isAlloc = flags & SHF_ALLOC;
>
> - for (size_t I = 0; I != Size; I += EntSize)
> - Pieces.emplace_back(I, xxHash64(Data.slice(I, EntSize)),
> !IsAlloc);
> + for (size_t i = 0; i != size; i += entSize)
> + pieces.emplace_back(i, xxHash64(data.slice(i, entSize)),
> !isAlloc);
> }
>
> template <class ELFT>
> -MergeInputSection::MergeInputSection(ObjFile<ELFT> &F,
> - const typename ELFT::Shdr
> &Header,
> - StringRef Name)
> - : InputSectionBase(F, Header, Name, InputSectionBase::Merge) {}
> -
> -MergeInputSection::MergeInputSection(uint64_t Flags, uint32_t Type,
> - uint64_t Entsize,
> ArrayRef<uint8_t> Data,
> - StringRef Name)
> - : InputSectionBase(nullptr, Flags, Type, Entsize, /*Link*/ 0,
> /*Info*/ 0,
> - /*Alignment*/ Entsize, Data, Name,
> SectionBase::Merge) {}
> +MergeInputSection::MergeInputSection(ObjFile<ELFT> &f,
> + const typename ELFT::Shdr
> &header,
> + StringRef name)
> + : InputSectionBase(f, header, name, InputSectionBase::Merge) {}
> +
> +MergeInputSection::MergeInputSection(uint64_t flags, uint32_t type,
> + uint64_t entsize,
> ArrayRef<uint8_t> data,
> + StringRef name)
> + : InputSectionBase(nullptr, flags, type, entsize, /*Link*/ 0,
> /*Info*/ 0,
> + /*Alignment*/ entsize, data, name,
> SectionBase::Merge) {}
>
> // This function is called after we obtain a complete list of input
> sections
> // that need to be linked. This is responsible to split section
> contents
> @@ -1262,35 +1262,35 @@ MergeInputSection::MergeInputSection(uin
> // Note that this function is called from parallelForEach. This must
> be
> // thread-safe (i.e. no memory allocation from the pools).
> void MergeInputSection::splitIntoPieces() {
> - assert(Pieces.empty());
> + assert(pieces.empty());
>
> - if (Flags & SHF_STRINGS)
> - splitStrings(data(), Entsize);
> + if (flags & SHF_STRINGS)
> + splitStrings(data(), entsize);
> else
> - splitNonStrings(data(), Entsize);
> + splitNonStrings(data(), entsize);
> }
>
> -SectionPiece *MergeInputSection::getSectionPiece(uint64_t Offset) {
> - if (this->data().size() <= Offset)
> +SectionPiece *MergeInputSection::getSectionPiece(uint64_t offset) {
> + if (this->data().size() <= offset)
> fatal(toString(this) + ": offset is outside the section");
>
> // If Offset is not at beginning of a section piece, it is not in
> the map.
> // In that case we need to do a binary search of the original
> section piece vector.
> - auto It = partition_point(
> - Pieces, [=](SectionPiece P) { return P.InputOff <= Offset; });
> - return &It[-1];
> + auto it = partition_point(
> + pieces, [=](SectionPiece p) { return p.inputOff <= offset; });
> + return &it[-1];
> }
>
> // Returns the offset in an output section for a given input offset.
> // Because contents of a mergeable section is not contiguous in
> output,
> // it is not just an addition to a base output offset.
> -uint64_t MergeInputSection::getParentOffset(uint64_t Offset) const {
> +uint64_t MergeInputSection::getParentOffset(uint64_t offset) const {
> // If Offset is not at beginning of a section piece, it is not in
> the map.
> // In that case we need to search from the original section piece
> vector.
> - const SectionPiece &Piece =
> - *(const_cast<MergeInputSection *>(this)->getSectionPiece
> (Offset));
> - uint64_t Addend = Offset - Piece.InputOff;
> - return Piece.OutputOff + Addend;
> + const SectionPiece &piece =
> + *(const_cast<MergeInputSection *>(this)->getSectionPiece
> (offset));
> + uint64_t addend = offset - piece.inputOff;
> + return piece.outputOff + addend;
> }
>
> template InputSection::InputSection(ObjFile<ELF32LE> &, const
> ELF32LE::Shdr &,
>
> Modified: lld/trunk/ELF/InputSection.h
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_InputSection.h-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=U1bo6cxsqKIfaBAaPZKJZGg_AjRoMj8NDFVsNavasVA&e=
>
> ==============================================================================
> --- lld/trunk/ELF/InputSection.h (original)
> +++ lld/trunk/ELF/InputSection.h Tue Jul 9 22:00:37 2019
> @@ -31,7 +31,7 @@ class MergeSyntheticSection;
> template <class ELFT> class ObjFile;
> class OutputSection;
>
> -extern std::vector<Partition> Partitions;
> +extern std::vector<Partition> partitions;
>
> // This is the base class of all sections that lld handles. Some are
> sections in
> // input files, some are sections in the produced output file and
> some exist
> @@ -41,18 +41,18 @@ class SectionBase {
> public:
> enum Kind { Regular, EHFrame, Merge, Synthetic, Output };
>
> - Kind kind() const { return (Kind)SectionKind; }
> + Kind kind() const { return (Kind)sectionKind; }
>
> - StringRef Name;
> + StringRef name;
>
> // This pointer points to the "real" instance of this instance.
> // Usually Repl == this. However, if ICF merges two sections,
> // Repl pointer of one section points to another section. So,
> // if you need to get a pointer to this instance, do not use
> // this but instead this->Repl.
> - SectionBase *Repl;
> + SectionBase *repl;
>
> - unsigned SectionKind : 3;
> + unsigned sectionKind : 3;
>
> // The next three bit fields are only used by InputSectionBase, but
> we
> // put them here so the struct packs better.
> @@ -68,26 +68,26 @@ public:
> // .foo takes all .text sections, and .bar becomes empty. To achieve
> // this, we need to memorize whether a section has been placed or
> // not for each input section.
> - unsigned Assigned : 1;
> + unsigned assigned : 1;
>
> - unsigned Bss : 1;
> + unsigned bss : 1;
>
> // Set for sections that should not be folded by ICF.
> - unsigned KeepUnique : 1;
> + unsigned keepUnique : 1;
>
> // The 1-indexed partition that this section is assigned to by the
> garbage
> // collector, or 0 if this section is dead. Normally there is only
> one
> // partition, so this will either be 0 or 1.
> - uint8_t Partition;
> + uint8_t partition;
> elf::Partition &getPartition() const;
>
> // These corresponds to the fields in Elf_Shdr.
> - uint32_t Alignment;
> - uint64_t Flags;
> - uint64_t Entsize;
> - uint32_t Type;
> - uint32_t Link;
> - uint32_t Info;
> + uint32_t alignment;
> + uint64_t flags;
> + uint64_t entsize;
> + uint32_t type;
> + uint32_t link;
> + uint32_t info;
>
> OutputSection *getOutputSection();
> const OutputSection *getOutputSection() const {
> @@ -96,55 +96,55 @@ public:
>
> // Translate an offset in the input section to an offset in the
> output
> // section.
> - uint64_t getOffset(uint64_t Offset) const;
> + uint64_t getOffset(uint64_t offset) const;
>
> - uint64_t getVA(uint64_t Offset = 0) const;
> + uint64_t getVA(uint64_t offset = 0) const;
>
> - bool isLive() const { return Partition != 0; }
> - void markLive() { Partition = 1; }
> - void markDead() { Partition = 0; }
> + bool isLive() const { return partition != 0; }
> + void markLive() { partition = 1; }
> + void markDead() { partition = 0; }
>
> protected:
> - SectionBase(Kind SectionKind, StringRef Name, uint64_t Flags,
> - uint64_t Entsize, uint64_t Alignment, uint32_t Type,
> - uint32_t Info, uint32_t Link)
> - : Name(Name), Repl(this), SectionKind(SectionKind),
> Assigned(false),
> - Bss(false), KeepUnique(false), Partition(0),
> Alignment(Alignment),
> - Flags(Flags), Entsize(Entsize), Type(Type), Link(Link),
> Info(Info) {}
> + SectionBase(Kind sectionKind, StringRef name, uint64_t flags,
> + uint64_t entsize, uint64_t alignment, uint32_t type,
> + uint32_t info, uint32_t link)
> + : name(name), repl(this), sectionKind(sectionKind),
> assigned(false),
> + bss(false), keepUnique(false), partition(0),
> alignment(alignment),
> + flags(flags), entsize(entsize), type(type), link(link),
> info(info) {}
> };
>
> // This corresponds to a section of an input file.
> class InputSectionBase : public SectionBase {
> public:
> template <class ELFT>
> - InputSectionBase(ObjFile<ELFT> &File, const typename ELFT::Shdr
> &Header,
> - StringRef Name, Kind SectionKind);
> + InputSectionBase(ObjFile<ELFT> &file, const typename ELFT::Shdr
> &header,
> + StringRef name, Kind sectionKind);
>
> - InputSectionBase(InputFile *File, uint64_t Flags, uint32_t Type,
> - uint64_t Entsize, uint32_t Link, uint32_t Info,
> - uint32_t Alignment, ArrayRef<uint8_t> Data,
> StringRef Name,
> - Kind SectionKind);
> + InputSectionBase(InputFile *file, uint64_t flags, uint32_t type,
> + uint64_t entsize, uint32_t link, uint32_t info,
> + uint32_t alignment, ArrayRef<uint8_t> data,
> StringRef name,
> + Kind sectionKind);
>
> - static bool classof(const SectionBase *S) { return S->kind() !=
> Output; }
> + static bool classof(const SectionBase *s) { return s->kind() !=
> Output; }
>
> // Relocations that refer to this section.
> - unsigned NumRelocations : 31;
> - unsigned AreRelocsRela : 1;
> - const void *FirstRelocation = nullptr;
> + unsigned numRelocations : 31;
> + unsigned areRelocsRela : 1;
> + const void *firstRelocation = nullptr;
>
> // The file which contains this section. Its dynamic type is always
> // ObjFile<ELFT>, but in order to avoid ELFT, we use InputFile as
> // its static type.
> - InputFile *File;
> + InputFile *file;
>
> template <class ELFT> ObjFile<ELFT> *getFile() const {
> - return cast_or_null<ObjFile<ELFT>>(File);
> + return cast_or_null<ObjFile<ELFT>>(file);
> }
>
> ArrayRef<uint8_t> data() const {
> - if (UncompressedSize >= 0)
> + if (uncompressedSize >= 0)
> uncompress();
> - return RawData;
> + return rawData;
> }
>
> uint64_t getOffsetInFile() const;
> @@ -153,24 +153,24 @@ public:
> // like .eh_frame and merge sections are first combined into a
> // synthetic section that is then added to an output section. In all
> // cases this points one level up.
> - SectionBase *Parent = nullptr;
> + SectionBase *parent = nullptr;
>
> template <class ELFT> ArrayRef<typename ELFT::Rel> rels() const {
> - assert(!AreRelocsRela);
> + assert(!areRelocsRela);
> return llvm::makeArrayRef(
> - static_cast<const typename ELFT::Rel *>(FirstRelocation),
> - NumRelocations);
> + static_cast<const typename ELFT::Rel *>(firstRelocation),
> + numRelocations);
> }
>
> template <class ELFT> ArrayRef<typename ELFT::Rela> relas() const {
> - assert(AreRelocsRela);
> + assert(areRelocsRela);
> return llvm::makeArrayRef(
> - static_cast<const typename ELFT::Rela *>(FirstRelocation),
> - NumRelocations);
> + static_cast<const typename ELFT::Rela *>(firstRelocation),
> + numRelocations);
> }
>
> // InputSections that are dependent on us (reverse dependency for
> GC)
> - llvm::TinyPtrVector<InputSection *> DependentSections;
> + llvm::TinyPtrVector<InputSection *> dependentSections;
>
> // Returns the size of this section (even if this is a common or
> BSS.)
> size_t getSize() const;
> @@ -180,23 +180,23 @@ public:
> // Get the function symbol that encloses this offset from within the
> // section.
> template <class ELFT>
> - Defined *getEnclosingFunction(uint64_t Offset);
> + Defined *getEnclosingFunction(uint64_t offset);
>
> // Returns a source location string. Used to construct an error
> message.
> - template <class ELFT> std::string getLocation(uint64_t Offset);
> - std::string getSrcMsg(const Symbol &Sym, uint64_t Offset);
> - std::string getObjMsg(uint64_t Offset);
> + template <class ELFT> std::string getLocation(uint64_t offset);
> + std::string getSrcMsg(const Symbol &sym, uint64_t offset);
> + std::string getObjMsg(uint64_t offset);
>
> // Each section knows how to relocate itself. These functions apply
> // relocations, assuming that Buf points to this section's copy in
> // the mmap'ed output buffer.
> - template <class ELFT> void relocate(uint8_t *Buf, uint8_t *BufEnd);
> - void relocateAlloc(uint8_t *Buf, uint8_t *BufEnd);
> + template <class ELFT> void relocate(uint8_t *buf, uint8_t *bufEnd);
> + void relocateAlloc(uint8_t *buf, uint8_t *bufEnd);
>
> // The native ELF reloc data type is not very convenient to handle.
> // So we convert ELF reloc records to our own records in
> Relocations.cpp.
> // This vector contains such "cooked" relocations.
> - std::vector<Relocation> Relocations;
> + std::vector<Relocation> relocations;
>
> // A function compiled with -fsplit-stack calling a function
> // compiled without -fsplit-stack needs its prologue adjusted. Find
> @@ -204,26 +204,26 @@ public:
> // to relocation. See https://gcc.gnu.org/wiki/SplitStacks for more
> // information.
> template <typename ELFT>
> - void adjustSplitStackFunctionPrologues(uint8_t *Buf, uint8_t *End);
> + void adjustSplitStackFunctionPrologues(uint8_t *buf, uint8_t *end);
>
>
> template <typename T> llvm::ArrayRef<T> getDataAs() const {
> - size_t S = data().size();
> - assert(S % sizeof(T) == 0);
> - return llvm::makeArrayRef<T>((const T *)data().data(), S /
> sizeof(T));
> + size_t s = data().size();
> + assert(s % sizeof(T) == 0);
> + return llvm::makeArrayRef<T>((const T *)data().data(), s /
> sizeof(T));
> }
>
> protected:
> void parseCompressedHeader();
> void uncompress() const;
>
> - mutable ArrayRef<uint8_t> RawData;
> + mutable ArrayRef<uint8_t> rawData;
>
> // This field stores the uncompressed size of the compressed data
> in RawData,
> // or -1 if RawData is not compressed (either because the section
> wasn't
> // compressed in the first place, or because we ended up
> uncompressing it).
> // Since the feature is not used often, this is usually -1.
> - mutable int64_t UncompressedSize = -1;
> + mutable int64_t uncompressedSize = -1;
> };
>
> // SectionPiece represents a piece of splittable section contents.
> @@ -231,13 +231,13 @@ protected:
> // have to be as compact as possible, which is why we don't store the
> size (can
> // be found by looking at the next one).
> struct SectionPiece {
> - SectionPiece(size_t Off, uint32_t Hash, bool Live)
> - : InputOff(Off), Live(Live || !Config->GcSections), Hash(Hash
> >> 1) {}
> + SectionPiece(size_t off, uint32_t hash, bool live)
> + : inputOff(off), live(live || !config->gcSections), hash(hash
> >> 1) {}
>
> - uint32_t InputOff;
> - uint32_t Live : 1;
> - uint32_t Hash : 31;
> - uint64_t OutputOff = 0;
> + uint32_t inputOff;
> + uint32_t live : 1;
> + uint32_t hash : 31;
> + uint64_t outputOff = 0;
> };
>
> static_assert(sizeof(SectionPiece) == 16, "SectionPiece is too big");
> @@ -246,74 +246,74 @@ static_assert(sizeof(SectionPiece) == 16
> class MergeInputSection : public InputSectionBase {
> public:
> template <class ELFT>
> - MergeInputSection(ObjFile<ELFT> &F, const typename ELFT::Shdr
> &Header,
> - StringRef Name);
> - MergeInputSection(uint64_t Flags, uint32_t Type, uint64_t Entsize,
> - ArrayRef<uint8_t> Data, StringRef Name);
> + MergeInputSection(ObjFile<ELFT> &f, const typename ELFT::Shdr
> &header,
> + StringRef name);
> + MergeInputSection(uint64_t flags, uint32_t type, uint64_t entsize,
> + ArrayRef<uint8_t> data, StringRef name);
>
> - static bool classof(const SectionBase *S) { return S->kind() ==
> Merge; }
> + static bool classof(const SectionBase *s) { return s->kind() ==
> Merge; }
> void splitIntoPieces();
>
> // Translate an offset in the input section to an offset in the
> parent
> // MergeSyntheticSection.
> - uint64_t getParentOffset(uint64_t Offset) const;
> + uint64_t getParentOffset(uint64_t offset) const;
>
> // Splittable sections are handled as a sequence of data
> // rather than a single large blob of data.
> - std::vector<SectionPiece> Pieces;
> + std::vector<SectionPiece> pieces;
>
> // Returns I'th piece's data. This function is very hot when
> // string merging is enabled, so we want to inline.
> LLVM_ATTRIBUTE_ALWAYS_INLINE
> - llvm::CachedHashStringRef getData(size_t I) const {
> - size_t Begin = Pieces[I].InputOff;
> - size_t End =
> - (Pieces.size() - 1 == I) ? data().size() : Pieces[I +
> 1].InputOff;
> - return {toStringRef(data().slice(Begin, End - Begin)),
> Pieces[I].Hash};
> + llvm::CachedHashStringRef getData(size_t i) const {
> + size_t begin = pieces[i].inputOff;
> + size_t end =
> + (pieces.size() - 1 == i) ? data().size() : pieces[i +
> 1].inputOff;
> + return {toStringRef(data().slice(begin, end - begin)),
> pieces[i].hash};
> }
>
> // Returns the SectionPiece at a given input section offset.
> - SectionPiece *getSectionPiece(uint64_t Offset);
> - const SectionPiece *getSectionPiece(uint64_t Offset) const {
> - return const_cast<MergeInputSection
> *>(this)->getSectionPiece(Offset);
> + SectionPiece *getSectionPiece(uint64_t offset);
> + const SectionPiece *getSectionPiece(uint64_t offset) const {
> + return const_cast<MergeInputSection
> *>(this)->getSectionPiece(offset);
> }
>
> SyntheticSection *getParent() const;
>
> private:
> - void splitStrings(ArrayRef<uint8_t> A, size_t Size);
> - void splitNonStrings(ArrayRef<uint8_t> A, size_t Size);
> + void splitStrings(ArrayRef<uint8_t> a, size_t size);
> + void splitNonStrings(ArrayRef<uint8_t> a, size_t size);
> };
>
> struct EhSectionPiece {
> - EhSectionPiece(size_t Off, InputSectionBase *Sec, uint32_t Size,
> - unsigned FirstRelocation)
> - : InputOff(Off), Sec(Sec), Size(Size),
> FirstRelocation(FirstRelocation) {}
> + EhSectionPiece(size_t off, InputSectionBase *sec, uint32_t size,
> + unsigned firstRelocation)
> + : inputOff(off), sec(sec), size(size),
> firstRelocation(firstRelocation) {}
>
> ArrayRef<uint8_t> data() {
> - return {Sec->data().data() + this->InputOff, Size};
> + return {sec->data().data() + this->inputOff, size};
> }
>
> - size_t InputOff;
> - ssize_t OutputOff = -1;
> - InputSectionBase *Sec;
> - uint32_t Size;
> - unsigned FirstRelocation;
> + size_t inputOff;
> + ssize_t outputOff = -1;
> + InputSectionBase *sec;
> + uint32_t size;
> + unsigned firstRelocation;
> };
>
> // This corresponds to a .eh_frame section of an input file.
> class EhInputSection : public InputSectionBase {
> public:
> template <class ELFT>
> - EhInputSection(ObjFile<ELFT> &F, const typename ELFT::Shdr &Header,
> - StringRef Name);
> - static bool classof(const SectionBase *S) { return S->kind() ==
> EHFrame; }
> + EhInputSection(ObjFile<ELFT> &f, const typename ELFT::Shdr &header,
> + StringRef name);
> + static bool classof(const SectionBase *s) { return s->kind() ==
> EHFrame; }
> template <class ELFT> void split();
> - template <class ELFT, class RelTy> void split(ArrayRef<RelTy> Rels);
> + template <class ELFT, class RelTy> void split(ArrayRef<RelTy> rels);
>
> // Splittable sections are handled as a sequence of data
> // rather than a single large blob of data.
> - std::vector<EhSectionPiece> Pieces;
> + std::vector<EhSectionPiece> pieces;
>
> SyntheticSection *getParent() const;
> };
> @@ -324,17 +324,17 @@ public:
> // .eh_frame. It also includes the synthetic sections themselves.
> class InputSection : public InputSectionBase {
> public:
> - InputSection(InputFile *F, uint64_t Flags, uint32_t Type, uint32_t
> Alignment,
> - ArrayRef<uint8_t> Data, StringRef Name, Kind K =
> Regular);
> + InputSection(InputFile *f, uint64_t flags, uint32_t type, uint32_t
> alignment,
> + ArrayRef<uint8_t> data, StringRef name, Kind k =
> Regular);
> template <class ELFT>
> - InputSection(ObjFile<ELFT> &F, const typename ELFT::Shdr &Header,
> - StringRef Name);
> + InputSection(ObjFile<ELFT> &f, const typename ELFT::Shdr &header,
> + StringRef name);
>
> // Write this section to a mmap'ed file, assuming Buf is pointing to
> // beginning of the output section.
> - template <class ELFT> void writeTo(uint8_t *Buf);
> + template <class ELFT> void writeTo(uint8_t *buf);
>
> - uint64_t getOffset(uint64_t Offset) const { return OutSecOff +
> Offset; }
> + uint64_t getOffset(uint64_t offset) const { return outSecOff +
> offset; }
>
> OutputSection *getParent() const;
>
> @@ -342,32 +342,32 @@ public:
> // OutputSection's InputSection list, and is used when ordering
> SHF_LINK_ORDER
> // sections. After assignAddresses is called, it represents the
> offset from
> // the beginning of the output section this section was assigned to.
> - uint64_t OutSecOff = 0;
> + uint64_t outSecOff = 0;
>
> - static bool classof(const SectionBase *S);
> + static bool classof(const SectionBase *s);
>
> InputSectionBase *getRelocatedSection() const;
>
> template <class ELFT, class RelTy>
> - void relocateNonAlloc(uint8_t *Buf, llvm::ArrayRef<RelTy> Rels);
> + void relocateNonAlloc(uint8_t *buf, llvm::ArrayRef<RelTy> rels);
>
> // Used by ICF.
> - uint32_t Class[2] = {0, 0};
> + uint32_t eqClass[2] = {0, 0};
>
> // Called by ICF to merge two input sections.
> - void replace(InputSection *Other);
> + void replace(InputSection *other);
>
> - static InputSection Discarded;
> + static InputSection discarded;
>
> private:
> template <class ELFT, class RelTy>
> - void copyRelocations(uint8_t *Buf, llvm::ArrayRef<RelTy> Rels);
> + void copyRelocations(uint8_t *buf, llvm::ArrayRef<RelTy> rels);
>
> - template <class ELFT> void copyShtGroup(uint8_t *Buf);
> + template <class ELFT> void copyShtGroup(uint8_t *buf);
> };
>
> // The list of all input sections.
> -extern std::vector<InputSectionBase *> InputSections;
> +extern std::vector<InputSectionBase *> inputSections;
>
> } // namespace elf
>
>
> Modified: lld/trunk/ELF/LTO.cpp
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_LTO.cpp-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=kWO89q-63tIMsJ1yeTt9RdnxdsWktkbPp3oNiQlj-zI&e=
>
> ==============================================================================
> --- lld/trunk/ELF/LTO.cpp (original)
> +++ lld/trunk/ELF/LTO.cpp Tue Jul 9 22:00:37 2019
> @@ -47,135 +47,135 @@ using namespace lld::elf;
>
> // Creates an empty file to store a list of object files for final
> // linking of distributed ThinLTO.
> -static std::unique_ptr<raw_fd_ostream> openFile(StringRef File) {
> - std::error_code EC;
> - auto Ret =
> - llvm::make_unique<raw_fd_ostream>(File, EC,
> sys::fs::OpenFlags::F_None);
> - if (EC) {
> - error("cannot open " + File + ": " + EC.message());
> +static std::unique_ptr<raw_fd_ostream> openFile(StringRef file) {
> + std::error_code ec;
> + auto ret =
> + llvm::make_unique<raw_fd_ostream>(file, ec,
> sys::fs::OpenFlags::F_None);
> + if (ec) {
> + error("cannot open " + file + ": " + ec.message());
> return nullptr;
> }
> - return Ret;
> + return ret;
> }
>
> -static std::string getThinLTOOutputFile(StringRef ModulePath) {
> - return lto::getThinLTOOutputFile(ModulePath,
> - Config->ThinLTOPrefixReplace.first,
> -
> Config->ThinLTOPrefixReplace.second);
> +static std::string getThinLTOOutputFile(StringRef modulePath) {
> + return lto::getThinLTOOutputFile(modulePath,
> + config->thinLTOPrefixReplace.first,
> +
> config->thinLTOPrefixReplace.second);
> }
>
> static lto::Config createConfig() {
> - lto::Config C;
> + lto::Config c;
>
> // LLD supports the new relocations and address-significance tables.
> - C.Options = initTargetOptionsFromCodeGenFlags();
> - C.Options.RelaxELFRelocations = true;
> - C.Options.EmitAddrsig = true;
> + c.Options = initTargetOptionsFromCodeGenFlags();
> + c.Options.RelaxELFRelocations = true;
> + c.Options.EmitAddrsig = true;
>
> // Always emit a section per function/datum with LTO.
> - C.Options.FunctionSections = true;
> - C.Options.DataSections = true;
> + c.Options.FunctionSections = true;
> + c.Options.DataSections = true;
>
> - if (Config->Relocatable)
> - C.RelocModel = None;
> - else if (Config->Pic)
> - C.RelocModel = Reloc::PIC_;
> + if (config->relocatable)
> + c.RelocModel = None;
> + else if (config->isPic)
> + c.RelocModel = Reloc::PIC_;
> else
> - C.RelocModel = Reloc::Static;
> + c.RelocModel = Reloc::Static;
>
> - C.CodeModel = getCodeModelFromCMModel();
> - C.DisableVerify = Config->DisableVerify;
> - C.DiagHandler = diagnosticHandler;
> - C.OptLevel = Config->LTOO;
> - C.CPU = getCPUStr();
> - C.MAttrs = getMAttrs();
> - C.CGOptLevel = args::getCGOptLevel(Config->LTOO);
> + c.CodeModel = getCodeModelFromCMModel();
> + c.DisableVerify = config->disableVerify;
> + c.DiagHandler = diagnosticHandler;
> + c.OptLevel = config->ltoo;
> + c.CPU = getCPUStr();
> + c.MAttrs = getMAttrs();
> + c.CGOptLevel = args::getCGOptLevel(config->ltoo);
>
> // Set up a custom pipeline if we've been asked to.
> - C.OptPipeline = Config->LTONewPmPasses;
> - C.AAPipeline = Config->LTOAAPipeline;
> + c.OptPipeline = config->ltoNewPmPasses;
> + c.AAPipeline = config->ltoAAPipeline;
>
> // Set up optimization remarks if we've been asked to.
> - C.RemarksFilename = Config->OptRemarksFilename;
> - C.RemarksPasses = Config->OptRemarksPasses;
> - C.RemarksWithHotness = Config->OptRemarksWithHotness;
> - C.RemarksFormat = Config->OptRemarksFormat;
> -
> - C.SampleProfile = Config->LTOSampleProfile;
> - C.UseNewPM = Config->LTONewPassManager;
> - C.DebugPassManager = Config->LTODebugPassManager;
> - C.DwoDir = Config->DwoDir;
> -
> - C.CSIRProfile = Config->LTOCSProfileFile;
> - C.RunCSIRInstr = Config->LTOCSProfileGenerate;
> -
> - if (Config->EmitLLVM) {
> - C.PostInternalizeModuleHook = [](size_t Task, const Module &M) {
> - if (std::unique_ptr<raw_fd_ostream> OS =
> openFile(Config->OutputFile))
> - WriteBitcodeToFile(M, *OS, false);
> + c.RemarksFilename = config->optRemarksFilename;
> + c.RemarksPasses = config->optRemarksPasses;
> + c.RemarksWithHotness = config->optRemarksWithHotness;
> + c.RemarksFormat = config->optRemarksFormat;
> +
> + c.SampleProfile = config->ltoSampleProfile;
> + c.UseNewPM = config->ltoNewPassManager;
> + c.DebugPassManager = config->ltoDebugPassManager;
> + c.DwoDir = config->dwoDir;
> +
> + c.CSIRProfile = config->ltoCSProfileFile;
> + c.RunCSIRInstr = config->ltoCSProfileGenerate;
> +
> + if (config->emitLLVM) {
> + c.PostInternalizeModuleHook = [](size_t task, const Module &m) {
> + if (std::unique_ptr<raw_fd_ostream> os =
> openFile(config->outputFile))
> + WriteBitcodeToFile(m, *os, false);
> return false;
> };
> }
>
> - if (Config->SaveTemps)
> - checkError(C.addSaveTemps(Config->OutputFile.str() + ".",
> + if (config->saveTemps)
> + checkError(c.addSaveTemps(config->outputFile.str() + ".",
> /*UseInputModulePath*/ true));
> - return C;
> + return c;
> }
>
> BitcodeCompiler::BitcodeCompiler() {
> // Initialize IndexFile.
> - if (!Config->ThinLTOIndexOnlyArg.empty())
> - IndexFile = openFile(Config->ThinLTOIndexOnlyArg);
> + if (!config->thinLTOIndexOnlyArg.empty())
> + indexFile = openFile(config->thinLTOIndexOnlyArg);
>
> // Initialize LTOObj.
> - lto::ThinBackend Backend;
> - if (Config->ThinLTOIndexOnly) {
> - auto OnIndexWrite = [&](StringRef S) { ThinIndices.erase(S); };
> - Backend = lto::createWriteIndexesThinBackend(
> - Config->ThinLTOPrefixReplace.first,
> Config->ThinLTOPrefixReplace.second,
> - Config->ThinLTOEmitImportsFiles, IndexFile.get(),
> OnIndexWrite);
> - } else if (Config->ThinLTOJobs != -1U) {
> - Backend = lto::createInProcessThinBackend(Config->ThinLTOJobs);
> + lto::ThinBackend backend;
> + if (config->thinLTOIndexOnly) {
> + auto onIndexWrite = [&](StringRef s) { thinIndices.erase(s); };
> + backend = lto::createWriteIndexesThinBackend(
> + config->thinLTOPrefixReplace.first,
> config->thinLTOPrefixReplace.second,
> + config->thinLTOEmitImportsFiles, indexFile.get(),
> onIndexWrite);
> + } else if (config->thinLTOJobs != -1U) {
> + backend = lto::createInProcessThinBackend(config->thinLTOJobs);
> }
>
> - LTOObj = llvm::make_unique<lto::LTO>(createConfig(), Backend,
> - Config->LTOPartitions);
> + ltoObj = llvm::make_unique<lto::LTO>(createConfig(), backend,
> + config->ltoPartitions);
>
> // Initialize UsedStartStop.
> - Symtab->forEachSymbol([&](Symbol *Sym) {
> - StringRef S = Sym->getName();
> - for (StringRef Prefix : {"__start_", "__stop_"})
> - if (S.startswith(Prefix))
> - UsedStartStop.insert(S.substr(Prefix.size()));
> + symtab->forEachSymbol([&](Symbol *sym) {
> + StringRef s = sym->getName();
> + for (StringRef prefix : {"__start_", "__stop_"})
> + if (s.startswith(prefix))
> + usedStartStop.insert(s.substr(prefix.size()));
> });
> }
>
> BitcodeCompiler::~BitcodeCompiler() = default;
>
> -void BitcodeCompiler::add(BitcodeFile &F) {
> - lto::InputFile &Obj = *F.Obj;
> - bool IsExec = !Config->Shared && !Config->Relocatable;
> -
> - if (Config->ThinLTOIndexOnly)
> - ThinIndices.insert(Obj.getName());
> -
> - ArrayRef<Symbol *> Syms = F.getSymbols();
> - ArrayRef<lto::InputFile::Symbol> ObjSyms = Obj.symbols();
> - std::vector<lto::SymbolResolution> Resols(Syms.size());
> +void BitcodeCompiler::add(BitcodeFile &f) {
> + lto::InputFile &obj = *f.obj;
> + bool isExec = !config->shared && !config->relocatable;
> +
> + if (config->thinLTOIndexOnly)
> + thinIndices.insert(obj.getName());
> +
> + ArrayRef<Symbol *> syms = f.getSymbols();
> + ArrayRef<lto::InputFile::Symbol> objSyms = obj.symbols();
> + std::vector<lto::SymbolResolution> resols(syms.size());
>
> // Provide a resolution to the LTO API for each symbol.
> - for (size_t I = 0, E = Syms.size(); I != E; ++I) {
> - Symbol *Sym = Syms[I];
> - const lto::InputFile::Symbol &ObjSym = ObjSyms[I];
> - lto::SymbolResolution &R = Resols[I];
> + for (size_t i = 0, e = syms.size(); i != e; ++i) {
> + Symbol *sym = syms[i];
> + const lto::InputFile::Symbol &objSym = objSyms[i];
> + lto::SymbolResolution &r = resols[i];
>
> // Ideally we shouldn't check for SF_Undefined but currently
> IRObjectFile
> // reports two symbols for module ASM defined. Without this
> check, lld
> // flags an undefined in IR with a definition in ASM as
> prevailing.
> // Once IRObjectFile is fixed to report only one symbol this hack
> can
> // be removed.
> - R.Prevailing = !ObjSym.isUndefined() && Sym->File == &F;
> + r.Prevailing = !objSym.isUndefined() && sym->file == &f;
>
> // We ask LTO to preserve following global symbols:
> // 1) All symbols when doing relocatable link, so that them can
> be used
> @@ -183,121 +183,121 @@ void BitcodeCompiler::add(BitcodeFile &F
> // 2) Symbols that are used in regular objects.
> // 3) C named sections if we have corresponding __start_/__stop_
> symbol.
> // 4) Symbols that are defined in bitcode files and used for
> dynamic linking.
> - R.VisibleToRegularObj = Config->Relocatable ||
> Sym->IsUsedInRegularObj ||
> - (R.Prevailing && Sym->includeInDynsym())
> ||
> -
> UsedStartStop.count(ObjSym.getSectionName());
> - const auto *DR = dyn_cast<Defined>(Sym);
> - R.FinalDefinitionInLinkageUnit =
> - (IsExec || Sym->Visibility != STV_DEFAULT) && DR &&
> + r.VisibleToRegularObj = config->relocatable ||
> sym->isUsedInRegularObj ||
> + (r.Prevailing && sym->includeInDynsym())
> ||
> +
> usedStartStop.count(objSym.getSectionName());
> + const auto *dr = dyn_cast<Defined>(sym);
> + r.FinalDefinitionInLinkageUnit =
> + (isExec || sym->visibility != STV_DEFAULT) && dr &&
> // Skip absolute symbols from ELF objects, otherwise PC-rel
> relocations
> // will be generated by for them, triggering linker errors.
> // Symbol section is always null for bitcode symbols, hence
> the check
> // for isElf(). Skip linker script defined symbols as well:
> they have
> // no File defined.
> - !(DR->Section == nullptr && (!Sym->File ||
> Sym->File->isElf()));
> + !(dr->section == nullptr && (!sym->file ||
> sym->file->isElf()));
>
> - if (R.Prevailing)
> - Sym->replace(Undefined{nullptr, Sym->getName(), STB_GLOBAL,
> STV_DEFAULT,
> - Sym->Type});
> + if (r.Prevailing)
> + sym->replace(Undefined{nullptr, sym->getName(), STB_GLOBAL,
> STV_DEFAULT,
> + sym->type});
>
> // We tell LTO to not apply interprocedural optimization for
> wrapped
> // (with --wrap) symbols because otherwise LTO would inline them
> while
> // their values are still not final.
> - R.LinkerRedefined = !Sym->CanInline;
> + r.LinkerRedefined = !sym->canInline;
> }
> - checkError(LTOObj->add(std::move(F.Obj), Resols));
> + checkError(ltoObj->add(std::move(f.obj), resols));
> }
>
> // If LazyObjFile has not been added to link, emit empty index files.
> // This is needed because this is what GNU gold plugin does and we
> have a
> // distributed build system that depends on that behavior.
> static void thinLTOCreateEmptyIndexFiles() {
> - for (LazyObjFile *F : LazyObjFiles) {
> - if (!isBitcode(F->MB))
> + for (LazyObjFile *f : lazyObjFiles) {
> + if (!isBitcode(f->mb))
> continue;
> - std::string Path =
> replaceThinLTOSuffix(getThinLTOOutputFile(F->getName()));
> - std::unique_ptr<raw_fd_ostream> OS = openFile(Path +
> ".thinlto.bc");
> - if (!OS)
> + std::string path =
> replaceThinLTOSuffix(getThinLTOOutputFile(f->getName()));
> + std::unique_ptr<raw_fd_ostream> os = openFile(path +
> ".thinlto.bc");
> + if (!os)
> continue;
>
> - ModuleSummaryIndex M(/*HaveGVs*/ false);
> - M.setSkipModuleByDistributedBackend();
> - WriteIndexToFile(M, *OS);
> - if (Config->ThinLTOEmitImportsFiles)
> - openFile(Path + ".imports");
> + ModuleSummaryIndex m(/*HaveGVs*/ false);
> + m.setSkipModuleByDistributedBackend();
> + WriteIndexToFile(m, *os);
> + if (config->thinLTOEmitImportsFiles)
> + openFile(path + ".imports");
> }
> }
>
> // Merge all the bitcode files we have seen, codegen the result
> // and return the resulting ObjectFile(s).
> std::vector<InputFile *> BitcodeCompiler::compile() {
> - unsigned MaxTasks = LTOObj->getMaxTasks();
> - Buf.resize(MaxTasks);
> - Files.resize(MaxTasks);
> + unsigned maxTasks = ltoObj->getMaxTasks();
> + buf.resize(maxTasks);
> + files.resize(maxTasks);
>
> // The --thinlto-cache-dir option specifies the path to a directory
> in which
> // to cache native object files for ThinLTO incremental builds. If
> a path was
> // specified, configure LTO to use it as the cache directory.
> - lto::NativeObjectCache Cache;
> - if (!Config->ThinLTOCacheDir.empty())
> - Cache = check(
> - lto::localCache(Config->ThinLTOCacheDir,
> - [&](size_t Task,
> std::unique_ptr<MemoryBuffer> MB) {
> - Files[Task] = std::move(MB);
> + lto::NativeObjectCache cache;
> + if (!config->thinLTOCacheDir.empty())
> + cache = check(
> + lto::localCache(config->thinLTOCacheDir,
> + [&](size_t task,
> std::unique_ptr<MemoryBuffer> mb) {
> + files[task] = std::move(mb);
> }));
>
> - if (!BitcodeFiles.empty())
> - checkError(LTOObj->run(
> - [&](size_t Task) {
> + if (!bitcodeFiles.empty())
> + checkError(ltoObj->run(
> + [&](size_t task) {
> return llvm::make_unique<lto::NativeObjectStream>(
> - llvm::make_unique<raw_svector_ostream>(Buf[Task]));
> + llvm::make_unique<raw_svector_ostream>(buf[task]));
> },
> - Cache));
> + cache));
>
> // Emit empty index files for non-indexed files
> - for (StringRef S : ThinIndices) {
> - std::string Path = getThinLTOOutputFile(S);
> - openFile(Path + ".thinlto.bc");
> - if (Config->ThinLTOEmitImportsFiles)
> - openFile(Path + ".imports");
> + for (StringRef s : thinIndices) {
> + std::string path = getThinLTOOutputFile(s);
> + openFile(path + ".thinlto.bc");
> + if (config->thinLTOEmitImportsFiles)
> + openFile(path + ".imports");
> }
>
> - if (Config->ThinLTOIndexOnly) {
> + if (config->thinLTOIndexOnly) {
> thinLTOCreateEmptyIndexFiles();
>
> - if (!Config->LTOObjPath.empty())
> - saveBuffer(Buf[0], Config->LTOObjPath);
> + if (!config->ltoObjPath.empty())
> + saveBuffer(buf[0], config->ltoObjPath);
>
> // ThinLTO with index only option is required to generate only
> the index
> // files. After that, we exit from linker and ThinLTO backend
> runs in a
> // distributed environment.
> - if (IndexFile)
> - IndexFile->close();
> + if (indexFile)
> + indexFile->close();
> return {};
> }
>
> - if (!Config->ThinLTOCacheDir.empty())
> - pruneCache(Config->ThinLTOCacheDir, Config->ThinLTOCachePolicy);
> + if (!config->thinLTOCacheDir.empty())
> + pruneCache(config->thinLTOCacheDir, config->thinLTOCachePolicy);
>
> - if (!Config->LTOObjPath.empty()) {
> - saveBuffer(Buf[0], Config->LTOObjPath);
> - for (unsigned I = 1; I != MaxTasks; ++I)
> - saveBuffer(Buf[I], Config->LTOObjPath + Twine(I));
> + if (!config->ltoObjPath.empty()) {
> + saveBuffer(buf[0], config->ltoObjPath);
> + for (unsigned i = 1; i != maxTasks; ++i)
> + saveBuffer(buf[i], config->ltoObjPath + Twine(i));
> }
>
> - if (Config->SaveTemps) {
> - saveBuffer(Buf[0], Config->OutputFile + ".lto.o");
> - for (unsigned I = 1; I != MaxTasks; ++I)
> - saveBuffer(Buf[I], Config->OutputFile + Twine(I) + ".lto.o");
> + if (config->saveTemps) {
> + saveBuffer(buf[0], config->outputFile + ".lto.o");
> + for (unsigned i = 1; i != maxTasks; ++i)
> + saveBuffer(buf[i], config->outputFile + Twine(i) + ".lto.o");
> }
>
> - std::vector<InputFile *> Ret;
> - for (unsigned I = 0; I != MaxTasks; ++I)
> - if (!Buf[I].empty())
> - Ret.push_back(createObjectFile(MemoryBufferRef(Buf[I],
> "lto.tmp")));
> -
> - for (std::unique_ptr<MemoryBuffer> &File : Files)
> - if (File)
> - Ret.push_back(createObjectFile(*File));
> - return Ret;
> + std::vector<InputFile *> ret;
> + for (unsigned i = 0; i != maxTasks; ++i)
> + if (!buf[i].empty())
> + ret.push_back(createObjectFile(MemoryBufferRef(buf[i],
> "lto.tmp")));
> +
> + for (std::unique_ptr<MemoryBuffer> &file : files)
> + if (file)
> + ret.push_back(createObjectFile(*file));
> + return ret;
> }
>
> Modified: lld/trunk/ELF/LTO.h
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_LTO.h-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=9YTjz9F8XG-rZnruLltG9-kLRSWWeUusJ07mHHyEEcM&e=
>
> ==============================================================================
> --- lld/trunk/ELF/LTO.h (original)
> +++ lld/trunk/ELF/LTO.h Tue Jul 9 22:00:37 2019
> @@ -45,16 +45,16 @@ public:
> BitcodeCompiler();
> ~BitcodeCompiler();
>
> - void add(BitcodeFile &F);
> + void add(BitcodeFile &f);
> std::vector<InputFile *> compile();
>
> private:
> - std::unique_ptr<llvm::lto::LTO> LTOObj;
> - std::vector<SmallString<0>> Buf;
> - std::vector<std::unique_ptr<MemoryBuffer>> Files;
> - llvm::DenseSet<StringRef> UsedStartStop;
> - std::unique_ptr<llvm::raw_fd_ostream> IndexFile;
> - llvm::DenseSet<StringRef> ThinIndices;
> + std::unique_ptr<llvm::lto::LTO> ltoObj;
> + std::vector<SmallString<0>> buf;
> + std::vector<std::unique_ptr<MemoryBuffer>> files;
> + llvm::DenseSet<StringRef> usedStartStop;
> + std::unique_ptr<llvm::raw_fd_ostream> indexFile;
> + llvm::DenseSet<StringRef> thinIndices;
> };
> } // namespace elf
> } // namespace lld
>
> Modified: lld/trunk/ELF/LinkerScript.cpp
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_LinkerScript.cpp-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=4SrLmLJ48YJv5Bg637lCBWPd4XPXgNSzzzG5xRKgd_A&e=
>
> ==============================================================================
> --- lld/trunk/ELF/LinkerScript.cpp (original)
> +++ lld/trunk/ELF/LinkerScript.cpp Tue Jul 9 22:00:37 2019
> @@ -46,26 +46,26 @@ using namespace llvm::support::endian;
> using namespace lld;
> using namespace lld::elf;
>
> -LinkerScript *elf::Script;
> +LinkerScript *elf::script;
>
> -static uint64_t getOutputSectionVA(SectionBase *InputSec, StringRef
> Loc) {
> - if (OutputSection *OS = InputSec->getOutputSection())
> - return OS->Addr;
> - error(Loc + ": unable to evaluate expression: input section " +
> - InputSec->Name + " has no output section assigned");
> +static uint64_t getOutputSectionVA(SectionBase *inputSec, StringRef
> loc) {
> + if (OutputSection *os = inputSec->getOutputSection())
> + return os->addr;
> + error(loc + ": unable to evaluate expression: input section " +
> + inputSec->name + " has no output section assigned");
> return 0;
> }
>
> uint64_t ExprValue::getValue() const {
> - if (Sec)
> - return alignTo(Sec->getOffset(Val) + getOutputSectionVA(Sec, Loc),
> - Alignment);
> - return alignTo(Val, Alignment);
> + if (sec)
> + return alignTo(sec->getOffset(val) + getOutputSectionVA(sec, loc),
> + alignment);
> + return alignTo(val, alignment);
> }
>
> uint64_t ExprValue::getSecAddr() const {
> - if (Sec)
> - return Sec->getOffset(0) + getOutputSectionVA(Sec, Loc);
> + if (sec)
> + return sec->getOffset(0) + getOutputSectionVA(sec, loc);
> return 0;
> }
>
> @@ -73,100 +73,100 @@ uint64_t ExprValue::getSectionOffset() c
> // If the alignment is trivial, we don't have to compute the full
> // value to know the offset. This allows this function to succeed in
> // cases where the output section is not yet known.
> - if (Alignment == 1 && (!Sec || !Sec->getOutputSection()))
> - return Val;
> + if (alignment == 1 && (!sec || !sec->getOutputSection()))
> + return val;
> return getValue() - getSecAddr();
> }
>
> -OutputSection *LinkerScript::createOutputSection(StringRef Name,
> - StringRef Location) {
> - OutputSection *&SecRef = NameToOutputSection[Name];
> - OutputSection *Sec;
> - if (SecRef && SecRef->Location.empty()) {
> +OutputSection *LinkerScript::createOutputSection(StringRef name,
> + StringRef location) {
> + OutputSection *&secRef = nameToOutputSection[name];
> + OutputSection *sec;
> + if (secRef && secRef->location.empty()) {
> // There was a forward reference.
> - Sec = SecRef;
> + sec = secRef;
> } else {
> - Sec = make<OutputSection>(Name, SHT_PROGBITS, 0);
> - if (!SecRef)
> - SecRef = Sec;
> - }
> - Sec->Location = Location;
> - return Sec;
> + sec = make<OutputSection>(name, SHT_PROGBITS, 0);
> + if (!secRef)
> + secRef = sec;
> + }
> + sec->location = location;
> + return sec;
> }
>
> -OutputSection *LinkerScript::getOrCreateOutputSection(StringRef Name)
> {
> - OutputSection *&CmdRef = NameToOutputSection[Name];
> - if (!CmdRef)
> - CmdRef = make<OutputSection>(Name, SHT_PROGBITS, 0);
> - return CmdRef;
> +OutputSection *LinkerScript::getOrCreateOutputSection(StringRef name)
> {
> + OutputSection *&cmdRef = nameToOutputSection[name];
> + if (!cmdRef)
> + cmdRef = make<OutputSection>(name, SHT_PROGBITS, 0);
> + return cmdRef;
> }
>
> // Expands the memory region by the specified size.
> -static void expandMemoryRegion(MemoryRegion *MemRegion, uint64_t Size,
> - StringRef RegionName, StringRef
> SecName) {
> - MemRegion->CurPos += Size;
> - uint64_t NewSize = MemRegion->CurPos - MemRegion->Origin;
> - if (NewSize > MemRegion->Length)
> - error("section '" + SecName + "' will not fit in region '" +
> RegionName +
> - "': overflowed by " + Twine(NewSize - MemRegion->Length) +
> " bytes");
> +static void expandMemoryRegion(MemoryRegion *memRegion, uint64_t size,
> + StringRef regionName, StringRef
> secName) {
> + memRegion->curPos += size;
> + uint64_t newSize = memRegion->curPos - memRegion->origin;
> + if (newSize > memRegion->length)
> + error("section '" + secName + "' will not fit in region '" +
> regionName +
> + "': overflowed by " + Twine(newSize - memRegion->length) +
> " bytes");
> }
>
> -void LinkerScript::expandMemoryRegions(uint64_t Size) {
> - if (Ctx->MemRegion)
> - expandMemoryRegion(Ctx->MemRegion, Size, Ctx->MemRegion->Name,
> - Ctx->OutSec->Name);
> +void LinkerScript::expandMemoryRegions(uint64_t size) {
> + if (ctx->memRegion)
> + expandMemoryRegion(ctx->memRegion, size, ctx->memRegion->name,
> + ctx->outSec->name);
> // Only expand the LMARegion if it is different from MemRegion.
> - if (Ctx->LMARegion && Ctx->MemRegion != Ctx->LMARegion)
> - expandMemoryRegion(Ctx->LMARegion, Size, Ctx->LMARegion->Name,
> - Ctx->OutSec->Name);
> + if (ctx->lmaRegion && ctx->memRegion != ctx->lmaRegion)
> + expandMemoryRegion(ctx->lmaRegion, size, ctx->lmaRegion->name,
> + ctx->outSec->name);
> }
>
> -void LinkerScript::expandOutputSection(uint64_t Size) {
> - Ctx->OutSec->Size += Size;
> - expandMemoryRegions(Size);
> +void LinkerScript::expandOutputSection(uint64_t size) {
> + ctx->outSec->size += size;
> + expandMemoryRegions(size);
> }
>
> -void LinkerScript::setDot(Expr E, const Twine &Loc, bool InSec) {
> - uint64_t Val = E().getValue();
> - if (Val < Dot && InSec)
> - error(Loc + ": unable to move location counter backward for: " +
> - Ctx->OutSec->Name);
> +void LinkerScript::setDot(Expr e, const Twine &loc, bool inSec) {
> + uint64_t val = e().getValue();
> + if (val < dot && inSec)
> + error(loc + ": unable to move location counter backward for: " +
> + ctx->outSec->name);
>
> // Update to location counter means update to section size.
> - if (InSec)
> - expandOutputSection(Val - Dot);
> + if (inSec)
> + expandOutputSection(val - dot);
>
> - Dot = Val;
> + dot = val;
> }
>
> // Used for handling linker symbol assignments, for both finalizing
> // their values and doing early declarations. Returns true if symbol
> // should be defined from linker script.
> -static bool shouldDefineSym(SymbolAssignment *Cmd) {
> - if (Cmd->Name == ".")
> +static bool shouldDefineSym(SymbolAssignment *cmd) {
> + if (cmd->name == ".")
> return false;
>
> - if (!Cmd->Provide)
> + if (!cmd->provide)
> return true;
>
> // If a symbol was in PROVIDE(), we need to define it only
> // when it is a referenced undefined symbol.
> - Symbol *B = Symtab->find(Cmd->Name);
> - if (B && !B->isDefined())
> + Symbol *b = symtab->find(cmd->name);
> + if (b && !b->isDefined())
> return true;
> return false;
> }
>
> // This function is called from processSectionCommands,
> // while we are fixing the output section layout.
> -void LinkerScript::addSymbol(SymbolAssignment *Cmd) {
> - if (!shouldDefineSym(Cmd))
> +void LinkerScript::addSymbol(SymbolAssignment *cmd) {
> + if (!shouldDefineSym(cmd))
> return;
>
> // Define a symbol.
> - ExprValue Value = Cmd->Expression();
> - SectionBase *Sec = Value.isAbsolute() ? nullptr : Value.Sec;
> - uint8_t Visibility = Cmd->Hidden ? STV_HIDDEN : STV_DEFAULT;
> + ExprValue value = cmd->expression();
> + SectionBase *sec = value.isAbsolute() ? nullptr : value.sec;
> + uint8_t visibility = cmd->hidden ? STV_HIDDEN : STV_DEFAULT;
>
> // When this function is called, section addresses have not been
> // fixed yet. So, we may or may not know the value of the RHS
> @@ -179,73 +179,73 @@ void LinkerScript::addSymbol(SymbolAssig
> // We want to set symbol values early if we can. This allows us to
> // use symbols as variables in linker scripts. Doing so allows us to
> // write expressions like this: `alignment = 16; . = ALIGN(.,
> alignment)`.
> - uint64_t SymValue = Value.Sec ? 0 : Value.getValue();
> + uint64_t symValue = value.sec ? 0 : value.getValue();
>
> - Defined New(nullptr, Cmd->Name, STB_GLOBAL, Visibility, STT_NOTYPE,
> SymValue,
> - 0, Sec);
> + Defined New(nullptr, cmd->name, STB_GLOBAL, visibility, STT_NOTYPE,
> symValue,
> + 0, sec);
>
> - Symbol *Sym = Symtab->insert(Cmd->Name);
> - Sym->mergeProperties(New);
> - Sym->replace(New);
> - Cmd->Sym = cast<Defined>(Sym);
> + Symbol *sym = symtab->insert(cmd->name);
> + sym->mergeProperties(New);
> + sym->replace(New);
> + cmd->sym = cast<Defined>(sym);
> }
>
> // This function is called from LinkerScript::declareSymbols.
> // It creates a placeholder symbol if needed.
> -static void declareSymbol(SymbolAssignment *Cmd) {
> - if (!shouldDefineSym(Cmd))
> +static void declareSymbol(SymbolAssignment *cmd) {
> + if (!shouldDefineSym(cmd))
> return;
>
> - uint8_t Visibility = Cmd->Hidden ? STV_HIDDEN : STV_DEFAULT;
> - Defined New(nullptr, Cmd->Name, STB_GLOBAL, Visibility, STT_NOTYPE,
> 0, 0,
> + uint8_t visibility = cmd->hidden ? STV_HIDDEN : STV_DEFAULT;
> + Defined New(nullptr, cmd->name, STB_GLOBAL, visibility, STT_NOTYPE,
> 0, 0,
> nullptr);
>
> // We can't calculate final value right now.
> - Symbol *Sym = Symtab->insert(Cmd->Name);
> - Sym->mergeProperties(New);
> - Sym->replace(New);
> -
> - Cmd->Sym = cast<Defined>(Sym);
> - Cmd->Provide = false;
> - Sym->ScriptDefined = true;
> + Symbol *sym = symtab->insert(cmd->name);
> + sym->mergeProperties(New);
> + sym->replace(New);
> +
> + cmd->sym = cast<Defined>(sym);
> + cmd->provide = false;
> + sym->scriptDefined = true;
> }
>
> // This method is used to handle INSERT AFTER statement. Here we
> rebuild
> // the list of script commands to mix sections inserted into.
> void LinkerScript::processInsertCommands() {
> - std::vector<BaseCommand *> V;
> - auto Insert = [&](std::vector<BaseCommand *> &From) {
> - V.insert(V.end(), From.begin(), From.end());
> - From.clear();
> + std::vector<BaseCommand *> v;
> + auto insert = [&](std::vector<BaseCommand *> &from) {
> + v.insert(v.end(), from.begin(), from.end());
> + from.clear();
> };
>
> - for (BaseCommand *Base : SectionCommands) {
> - if (auto *OS = dyn_cast<OutputSection>(Base)) {
> - Insert(InsertBeforeCommands[OS->Name]);
> - V.push_back(Base);
> - Insert(InsertAfterCommands[OS->Name]);
> + for (BaseCommand *base : sectionCommands) {
> + if (auto *os = dyn_cast<OutputSection>(base)) {
> + insert(insertBeforeCommands[os->name]);
> + v.push_back(base);
> + insert(insertAfterCommands[os->name]);
> continue;
> }
> - V.push_back(Base);
> + v.push_back(base);
> }
>
> - for (auto &Cmds : {InsertBeforeCommands, InsertAfterCommands})
> - for (const std::pair<StringRef, std::vector<BaseCommand *>> &P :
> Cmds)
> - if (!P.second.empty())
> - error("unable to INSERT AFTER/BEFORE " + P.first +
> + for (auto &cmds : {insertBeforeCommands, insertAfterCommands})
> + for (const std::pair<StringRef, std::vector<BaseCommand *>> &p :
> cmds)
> + if (!p.second.empty())
> + error("unable to INSERT AFTER/BEFORE " + p.first +
> ": section not defined");
>
> - SectionCommands = std::move(V);
> + sectionCommands = std::move(v);
> }
>
> // Symbols defined in script should not be inlined by LTO. At the
> same time
> // we don't know their final values until late stages of link. Here
> we scan
> // over symbol assignment commands and create placeholder symbols if
> needed.
> void LinkerScript::declareSymbols() {
> - assert(!Ctx);
> - for (BaseCommand *Base : SectionCommands) {
> - if (auto *Cmd = dyn_cast<SymbolAssignment>(Base)) {
> - declareSymbol(Cmd);
> + assert(!ctx);
> + for (BaseCommand *base : sectionCommands) {
> + if (auto *cmd = dyn_cast<SymbolAssignment>(base)) {
> + declareSymbol(cmd);
> continue;
> }
>
> @@ -253,75 +253,75 @@ void LinkerScript::declareSymbols() {
> // we can't say for sure if it is going to be included or not.
> // Skip such sections for now. Improve the checks if we ever
> // need symbols from that sections to be declared early.
> - auto *Sec = cast<OutputSection>(Base);
> - if (Sec->Constraint != ConstraintKind::NoConstraint)
> + auto *sec = cast<OutputSection>(base);
> + if (sec->constraint != ConstraintKind::NoConstraint)
> continue;
> - for (BaseCommand *Base2 : Sec->SectionCommands)
> - if (auto *Cmd = dyn_cast<SymbolAssignment>(Base2))
> - declareSymbol(Cmd);
> + for (BaseCommand *base2 : sec->sectionCommands)
> + if (auto *cmd = dyn_cast<SymbolAssignment>(base2))
> + declareSymbol(cmd);
> }
> }
>
> // This function is called from assignAddresses, while we are
> // fixing the output section addresses. This function is supposed
> // to set the final value for a given symbol assignment.
> -void LinkerScript::assignSymbol(SymbolAssignment *Cmd, bool InSec) {
> - if (Cmd->Name == ".") {
> - setDot(Cmd->Expression, Cmd->Location, InSec);
> +void LinkerScript::assignSymbol(SymbolAssignment *cmd, bool inSec) {
> + if (cmd->name == ".") {
> + setDot(cmd->expression, cmd->location, inSec);
> return;
> }
>
> - if (!Cmd->Sym)
> + if (!cmd->sym)
> return;
>
> - ExprValue V = Cmd->Expression();
> - if (V.isAbsolute()) {
> - Cmd->Sym->Section = nullptr;
> - Cmd->Sym->Value = V.getValue();
> + ExprValue v = cmd->expression();
> + if (v.isAbsolute()) {
> + cmd->sym->section = nullptr;
> + cmd->sym->value = v.getValue();
> } else {
> - Cmd->Sym->Section = V.Sec;
> - Cmd->Sym->Value = V.getSectionOffset();
> + cmd->sym->section = v.sec;
> + cmd->sym->value = v.getSectionOffset();
> }
> }
>
> -static std::string getFilename(InputFile *File) {
> - if (!File)
> +static std::string getFilename(InputFile *file) {
> + if (!file)
> return "";
> - if (File->ArchiveName.empty())
> - return File->getName();
> - return (File->ArchiveName + "(" + File->getName() + ")").str();
> + if (file->archiveName.empty())
> + return file->getName();
> + return (file->archiveName + "(" + file->getName() + ")").str();
> }
>
> -bool LinkerScript::shouldKeep(InputSectionBase *S) {
> - if (KeptSections.empty())
> +bool LinkerScript::shouldKeep(InputSectionBase *s) {
> + if (keptSections.empty())
> return false;
> - std::string Filename = getFilename(S->File);
> - for (InputSectionDescription *ID : KeptSections)
> - if (ID->FilePat.match(Filename))
> - for (SectionPattern &P : ID->SectionPatterns)
> - if (P.SectionPat.match(S->Name))
> + std::string filename = getFilename(s->file);
> + for (InputSectionDescription *id : keptSections)
> + if (id->filePat.match(filename))
> + for (SectionPattern &p : id->sectionPatterns)
> + if (p.sectionPat.match(s->name))
> return true;
> return false;
> }
>
> // A helper function for the SORT() command.
> static std::function<bool(InputSectionBase *, InputSectionBase *)>
> -getComparator(SortSectionPolicy K) {
> - switch (K) {
> +getComparator(SortSectionPolicy k) {
> + switch (k) {
> case SortSectionPolicy::Alignment:
> - return [](InputSectionBase *A, InputSectionBase *B) {
> + return [](InputSectionBase *a, InputSectionBase *b) {
> // ">" is not a mistake. Sections with larger alignments are
> placed
> // before sections with smaller alignments in order to reduce
> the
> // amount of padding necessary. This is compatible with GNU.
> - return A->Alignment > B->Alignment;
> + return a->alignment > b->alignment;
> };
> case SortSectionPolicy::Name:
> - return [](InputSectionBase *A, InputSectionBase *B) {
> - return A->Name < B->Name;
> + return [](InputSectionBase *a, InputSectionBase *b) {
> + return a->name < b->name;
> };
> case SortSectionPolicy::Priority:
> - return [](InputSectionBase *A, InputSectionBase *B) {
> - return getPriority(A->Name) < getPriority(B->Name);
> + return [](InputSectionBase *a, InputSectionBase *b) {
> + return getPriority(a->name) < getPriority(b->name);
> };
> default:
> llvm_unreachable("unknown sort policy");
> @@ -329,22 +329,22 @@ getComparator(SortSectionPolicy K) {
> }
>
> // A helper function for the SORT() command.
> -static bool matchConstraints(ArrayRef<InputSection *> Sections,
> - ConstraintKind Kind) {
> - if (Kind == ConstraintKind::NoConstraint)
> +static bool matchConstraints(ArrayRef<InputSection *> sections,
> + ConstraintKind kind) {
> + if (kind == ConstraintKind::NoConstraint)
> return true;
>
> - bool IsRW = llvm::any_of(
> - Sections, [](InputSection *Sec) { return Sec->Flags &
> SHF_WRITE; });
> + bool isRW = llvm::any_of(
> + sections, [](InputSection *sec) { return sec->flags &
> SHF_WRITE; });
>
> - return (IsRW && Kind == ConstraintKind::ReadWrite) ||
> - (!IsRW && Kind == ConstraintKind::ReadOnly);
> + return (isRW && kind == ConstraintKind::ReadWrite) ||
> + (!isRW && kind == ConstraintKind::ReadOnly);
> }
>
> -static void sortSections(MutableArrayRef<InputSection *> Vec,
> - SortSectionPolicy K) {
> - if (K != SortSectionPolicy::Default && K != SortSectionPolicy::None)
> - llvm::stable_sort(Vec, getComparator(K));
> +static void sortSections(MutableArrayRef<InputSection *> vec,
> + SortSectionPolicy k) {
> + if (k != SortSectionPolicy::Default && k != SortSectionPolicy::None)
> + llvm::stable_sort(vec, getComparator(k));
> }
>
> // Sort sections as instructed by SORT-family commands and
> --sort-section
> @@ -358,29 +358,29 @@ static void sortSections(MutableArrayRef
> // --sort-section is handled as an inner SORT command.
> // 3. If one SORT command is given, and if it is SORT_NONE, don't
> sort.
> // 4. If no SORT command is given, sort according to --sort-section.
> -static void sortInputSections(MutableArrayRef<InputSection *> Vec,
> - const SectionPattern &Pat) {
> - if (Pat.SortOuter == SortSectionPolicy::None)
> +static void sortInputSections(MutableArrayRef<InputSection *> vec,
> + const SectionPattern &pat) {
> + if (pat.sortOuter == SortSectionPolicy::None)
> return;
>
> - if (Pat.SortInner == SortSectionPolicy::Default)
> - sortSections(Vec, Config->SortSection);
> + if (pat.sortInner == SortSectionPolicy::Default)
> + sortSections(vec, config->sortSection);
> else
> - sortSections(Vec, Pat.SortInner);
> - sortSections(Vec, Pat.SortOuter);
> + sortSections(vec, pat.sortInner);
> + sortSections(vec, pat.sortOuter);
> }
>
> // Compute and remember which sections the InputSectionDescription
> matches.
> std::vector<InputSection *>
> -LinkerScript::computeInputSections(const InputSectionDescription
> *Cmd) {
> - std::vector<InputSection *> Ret;
> +LinkerScript::computeInputSections(const InputSectionDescription
> *cmd) {
> + std::vector<InputSection *> ret;
>
> // Collects all sections that satisfy constraints of Cmd.
> - for (const SectionPattern &Pat : Cmd->SectionPatterns) {
> - size_t SizeBefore = Ret.size();
> + for (const SectionPattern &pat : cmd->sectionPatterns) {
> + size_t sizeBefore = ret.size();
>
> - for (InputSectionBase *Sec : InputSections) {
> - if (!Sec->isLive() || Sec->Assigned)
> + for (InputSectionBase *sec : inputSections) {
> + if (!sec->isLive() || sec->assigned)
> continue;
>
> // For -emit-relocs we have to ignore entries like
> @@ -388,59 +388,59 @@ LinkerScript::computeInputSections(const
> // which are common because they are in the default bfd script.
> // We do not ignore SHT_REL[A] linker-synthesized sections here
> because
> // want to support scripts that do custom layout for them.
> - if (auto *IS = dyn_cast<InputSection>(Sec))
> - if (IS->getRelocatedSection())
> + if (auto *isec = dyn_cast<InputSection>(sec))
> + if (isec->getRelocatedSection())
> continue;
>
> - std::string Filename = getFilename(Sec->File);
> - if (!Cmd->FilePat.match(Filename) ||
> - Pat.ExcludedFilePat.match(Filename) ||
> - !Pat.SectionPat.match(Sec->Name))
> + std::string filename = getFilename(sec->file);
> + if (!cmd->filePat.match(filename) ||
> + pat.excludedFilePat.match(filename) ||
> + !pat.sectionPat.match(sec->name))
> continue;
>
> // It is safe to assume that Sec is an InputSection
> // because mergeable or EH input sections have already been
> // handled and eliminated.
> - Ret.push_back(cast<InputSection>(Sec));
> - Sec->Assigned = true;
> + ret.push_back(cast<InputSection>(sec));
> + sec->assigned = true;
> }
>
> - sortInputSections(MutableArrayRef<InputSection
> *>(Ret).slice(SizeBefore),
> - Pat);
> + sortInputSections(MutableArrayRef<InputSection
> *>(ret).slice(sizeBefore),
> + pat);
> }
> - return Ret;
> + return ret;
> }
>
> -void LinkerScript::discard(ArrayRef<InputSection *> V) {
> - for (InputSection *S : V) {
> - if (S == In.ShStrTab || S == Main->RelaDyn || S == Main->RelrDyn)
> - error("discarding " + S->Name + " section is not allowed");
> +void LinkerScript::discard(ArrayRef<InputSection *> v) {
> + for (InputSection *s : v) {
> + if (s == in.shStrTab || s == mainPart->relaDyn || s ==
> mainPart->relrDyn)
> + error("discarding " + s->name + " section is not allowed");
>
> // You can discard .hash and .gnu.hash sections by linker
> scripts. Since
> // they are synthesized sections, we need to handle them
> differently than
> // other regular sections.
> - if (S == Main->GnuHashTab)
> - Main->GnuHashTab = nullptr;
> - if (S == Main->HashTab)
> - Main->HashTab = nullptr;
> -
> - S->Assigned = false;
> - S->markDead();
> - discard(S->DependentSections);
> + if (s == mainPart->gnuHashTab)
> + mainPart->gnuHashTab = nullptr;
> + if (s == mainPart->hashTab)
> + mainPart->hashTab = nullptr;
> +
> + s->assigned = false;
> + s->markDead();
> + discard(s->dependentSections);
> }
> }
>
> std::vector<InputSection *>
> -LinkerScript::createInputSectionList(OutputSection &OutCmd) {
> - std::vector<InputSection *> Ret;
> +LinkerScript::createInputSectionList(OutputSection &outCmd) {
> + std::vector<InputSection *> ret;
>
> - for (BaseCommand *Base : OutCmd.SectionCommands) {
> - if (auto *Cmd = dyn_cast<InputSectionDescription>(Base)) {
> - Cmd->Sections = computeInputSections(Cmd);
> - Ret.insert(Ret.end(), Cmd->Sections.begin(),
> Cmd->Sections.end());
> + for (BaseCommand *base : outCmd.sectionCommands) {
> + if (auto *cmd = dyn_cast<InputSectionDescription>(base)) {
> + cmd->sections = computeInputSections(cmd);
> + ret.insert(ret.end(), cmd->sections.begin(),
> cmd->sections.end());
> }
> }
> - return Ret;
> + return ret;
> }
>
> void LinkerScript::processSectionCommands() {
> @@ -453,34 +453,34 @@ void LinkerScript::processSectionCommand
> // To handle that, create a dummy aether section that fills the
> void before
> // the linker scripts switches to another section. It has an index
> of one
> // which will map to whatever the first actual section is.
> - Aether = make<OutputSection>("", 0, SHF_ALLOC);
> - Aether->SectionIndex = 1;
> + aether = make<OutputSection>("", 0, SHF_ALLOC);
> + aether->sectionIndex = 1;
>
> // Ctx captures the local AddressState and makes it accessible
> deliberately.
> // This is needed as there are some cases where we cannot just
> // thread the current state through to a lambda function created by
> the
> // script parser.
> - auto Deleter = make_unique<AddressState>();
> - Ctx = Deleter.get();
> - Ctx->OutSec = Aether;
> + auto deleter = make_unique<AddressState>();
> + ctx = deleter.get();
> + ctx->outSec = aether;
>
> - size_t I = 0;
> + size_t i = 0;
> // Add input sections to output sections.
> - for (BaseCommand *Base : SectionCommands) {
> + for (BaseCommand *base : sectionCommands) {
> // Handle symbol assignments outside of any output section.
> - if (auto *Cmd = dyn_cast<SymbolAssignment>(Base)) {
> - addSymbol(Cmd);
> + if (auto *cmd = dyn_cast<SymbolAssignment>(base)) {
> + addSymbol(cmd);
> continue;
> }
>
> - if (auto *Sec = dyn_cast<OutputSection>(Base)) {
> - std::vector<InputSection *> V = createInputSectionList(*Sec);
> + if (auto *sec = dyn_cast<OutputSection>(base)) {
> + std::vector<InputSection *> v = createInputSectionList(*sec);
>
> // The output section name `/DISCARD/' is special.
> // Any input section assigned to it is discarded.
> - if (Sec->Name == "/DISCARD/") {
> - discard(V);
> - Sec->SectionCommands.clear();
> + if (sec->name == "/DISCARD/") {
> + discard(v);
> + sec->sectionCommands.clear();
> continue;
> }
>
> @@ -491,61 +491,61 @@ void LinkerScript::processSectionCommand
> //
> // Because we'll iterate over SectionCommands many more times,
> the easy
> // way to "make it as if it wasn't present" is to make it empty.
> - if (!matchConstraints(V, Sec->Constraint)) {
> - for (InputSectionBase *S : V)
> - S->Assigned = false;
> - Sec->SectionCommands.clear();
> + if (!matchConstraints(v, sec->constraint)) {
> + for (InputSectionBase *s : v)
> + s->assigned = false;
> + sec->sectionCommands.clear();
> continue;
> }
>
> // A directive may contain symbol definitions like this:
> // ".foo : { ...; bar = .; }". Handle them.
> - for (BaseCommand *Base : Sec->SectionCommands)
> - if (auto *OutCmd = dyn_cast<SymbolAssignment>(Base))
> - addSymbol(OutCmd);
> + for (BaseCommand *base : sec->sectionCommands)
> + if (auto *outCmd = dyn_cast<SymbolAssignment>(base))
> + addSymbol(outCmd);
>
> // Handle subalign (e.g. ".foo : SUBALIGN(32) { ... }"). If
> subalign
> // is given, input sections are aligned to that value, whether
> the
> // given value is larger or smaller than the original section
> alignment.
> - if (Sec->SubalignExpr) {
> - uint32_t Subalign = Sec->SubalignExpr().getValue();
> - for (InputSectionBase *S : V)
> - S->Alignment = Subalign;
> + if (sec->subalignExpr) {
> + uint32_t subalign = sec->subalignExpr().getValue();
> + for (InputSectionBase *s : v)
> + s->alignment = subalign;
> }
>
> // Add input sections to an output section.
> - for (InputSection *S : V)
> - Sec->addSection(S);
> + for (InputSection *s : v)
> + sec->addSection(s);
>
> - Sec->SectionIndex = I++;
> - if (Sec->Noload)
> - Sec->Type = SHT_NOBITS;
> - if (Sec->NonAlloc)
> - Sec->Flags &= ~(uint64_t)SHF_ALLOC;
> + sec->sectionIndex = i++;
> + if (sec->noload)
> + sec->type = SHT_NOBITS;
> + if (sec->nonAlloc)
> + sec->flags &= ~(uint64_t)SHF_ALLOC;
> }
> }
> - Ctx = nullptr;
> + ctx = nullptr;
> }
>
> -static OutputSection *findByName(ArrayRef<BaseCommand *> Vec,
> - StringRef Name) {
> - for (BaseCommand *Base : Vec)
> - if (auto *Sec = dyn_cast<OutputSection>(Base))
> - if (Sec->Name == Name)
> - return Sec;
> +static OutputSection *findByName(ArrayRef<BaseCommand *> vec,
> + StringRef name) {
> + for (BaseCommand *base : vec)
> + if (auto *sec = dyn_cast<OutputSection>(base))
> + if (sec->name == name)
> + return sec;
> return nullptr;
> }
>
> -static OutputSection *createSection(InputSectionBase *IS,
> - StringRef OutsecName) {
> - OutputSection *Sec = Script->createOutputSection(OutsecName,
> "<internal>");
> - Sec->addSection(cast<InputSection>(IS));
> - return Sec;
> +static OutputSection *createSection(InputSectionBase *isec,
> + StringRef outsecName) {
> + OutputSection *sec = script->createOutputSection(outsecName,
> "<internal>");
> + sec->addSection(cast<InputSection>(isec));
> + return sec;
> }
>
> static OutputSection *
> -addInputSec(StringMap<TinyPtrVector<OutputSection *>> &Map,
> - InputSectionBase *IS, StringRef OutsecName) {
> +addInputSec(StringMap<TinyPtrVector<OutputSection *>> &map,
> + InputSectionBase *isec, StringRef outsecName) {
> // Sections with SHT_GROUP or SHF_GROUP attributes reach here only
> when the -r
> // option is given. A section with SHT_GROUP defines a "section
> group", and
> // its members have SHF_GROUP attribute. Usually these flags have
> already been
> @@ -553,8 +553,8 @@ addInputSec(StringMap<TinyPtrVector<Outp
> // However, for the -r option, we want to pass through all section
> groups
> // as-is because adding/removing members or merging them with other
> groups
> // change their semantics.
> - if (IS->Type == SHT_GROUP || (IS->Flags & SHF_GROUP))
> - return createSection(IS, OutsecName);
> + if (isec->type == SHT_GROUP || (isec->flags & SHF_GROUP))
> + return createSection(isec, outsecName);
>
> // Imagine .zed : { *(.foo) *(.bar) } script. Both foo and bar may
> have
> // relocation sections .rela.foo and .rela.bar for example. Most
> tools do
> @@ -562,25 +562,25 @@ addInputSec(StringMap<TinyPtrVector<Outp
> // should combine these relocation sections into single output.
> // We skip synthetic sections because it can be .rela.dyn/.rela.plt
> or any
> // other REL[A] sections created by linker itself.
> - if (!isa<SyntheticSection>(IS) &&
> - (IS->Type == SHT_REL || IS->Type == SHT_RELA)) {
> - auto *Sec = cast<InputSection>(IS);
> - OutputSection *Out =
> Sec->getRelocatedSection()->getOutputSection();
> + if (!isa<SyntheticSection>(isec) &&
> + (isec->type == SHT_REL || isec->type == SHT_RELA)) {
> + auto *sec = cast<InputSection>(isec);
> + OutputSection *out =
> sec->getRelocatedSection()->getOutputSection();
>
> - if (Out->RelocationSection) {
> - Out->RelocationSection->addSection(Sec);
> + if (out->relocationSection) {
> + out->relocationSection->addSection(sec);
> return nullptr;
> }
>
> - Out->RelocationSection = createSection(IS, OutsecName);
> - return Out->RelocationSection;
> + out->relocationSection = createSection(isec, outsecName);
> + return out->relocationSection;
> }
>
> // When control reaches here, mergeable sections have already been
> merged into
> // synthetic sections. For relocatable case we want to create one
> output
> // section per syntetic section so that they have a valid
> sh_entsize.
> - if (Config->Relocatable && (IS->Flags & SHF_MERGE))
> - return createSection(IS, OutsecName);
> + if (config->relocatable && (isec->flags & SHF_MERGE))
> + return createSection(isec, outsecName);
>
> // The ELF spec just says
> // ----------------------------------------------------------------
> @@ -624,161 +624,161 @@ addInputSec(StringMap<TinyPtrVector<Outp
> //
> // Given the above issues, we instead merge sections by name and
> error on
> // incompatible types and flags.
> - TinyPtrVector<OutputSection *> &V = Map[OutsecName];
> - for (OutputSection *Sec : V) {
> - if (Sec->Partition != IS->Partition)
> + TinyPtrVector<OutputSection *> &v = map[outsecName];
> + for (OutputSection *sec : v) {
> + if (sec->partition != isec->partition)
> continue;
> - Sec->addSection(cast<InputSection>(IS));
> + sec->addSection(cast<InputSection>(isec));
> return nullptr;
> }
>
> - OutputSection *Sec = createSection(IS, OutsecName);
> - V.push_back(Sec);
> - return Sec;
> + OutputSection *sec = createSection(isec, outsecName);
> + v.push_back(sec);
> + return sec;
> }
>
> // Add sections that didn't match any sections command.
> void LinkerScript::addOrphanSections() {
> - StringMap<TinyPtrVector<OutputSection *>> Map;
> - std::vector<OutputSection *> V;
> + StringMap<TinyPtrVector<OutputSection *>> map;
> + std::vector<OutputSection *> v;
>
> - auto Add = [&](InputSectionBase *S) {
> - if (!S->isLive() || S->Parent)
> + auto add = [&](InputSectionBase *s) {
> + if (!s->isLive() || s->parent)
> return;
>
> - StringRef Name = getOutputSectionName(S);
> + StringRef name = getOutputSectionName(s);
>
> - if (Config->OrphanHandling == OrphanHandlingPolicy::Error)
> - error(toString(S) + " is being placed in '" + Name + "'");
> - else if (Config->OrphanHandling == OrphanHandlingPolicy::Warn)
> - warn(toString(S) + " is being placed in '" + Name + "'");
> + if (config->orphanHandling == OrphanHandlingPolicy::Error)
> + error(toString(s) + " is being placed in '" + name + "'");
> + else if (config->orphanHandling == OrphanHandlingPolicy::Warn)
> + warn(toString(s) + " is being placed in '" + name + "'");
>
> - if (OutputSection *Sec = findByName(SectionCommands, Name)) {
> - Sec->addSection(cast<InputSection>(S));
> + if (OutputSection *sec = findByName(sectionCommands, name)) {
> + sec->addSection(cast<InputSection>(s));
> return;
> }
>
> - if (OutputSection *OS = addInputSec(Map, S, Name))
> - V.push_back(OS);
> - assert(S->getOutputSection()->SectionIndex == UINT32_MAX);
> + if (OutputSection *os = addInputSec(map, s, name))
> + v.push_back(os);
> + assert(s->getOutputSection()->sectionIndex == UINT32_MAX);
> };
>
> // For futher --emit-reloc handling code we need target output
> section
> // to be created before we create relocation output section, so we
> want
> // to create target sections first. We do not want priority handling
> // for synthetic sections because them are special.
> - for (InputSectionBase *IS : InputSections) {
> - if (auto *Sec = dyn_cast<InputSection>(IS))
> - if (InputSectionBase *Rel = Sec->getRelocatedSection())
> - if (auto *RelIS =
> dyn_cast_or_null<InputSectionBase>(Rel->Parent))
> - Add(RelIS);
> - Add(IS);
> + for (InputSectionBase *isec : inputSections) {
> + if (auto *sec = dyn_cast<InputSection>(isec))
> + if (InputSectionBase *rel = sec->getRelocatedSection())
> + if (auto *relIS =
> dyn_cast_or_null<InputSectionBase>(rel->parent))
> + add(relIS);
> + add(isec);
> }
>
> // If no SECTIONS command was given, we should insert sections
> commands
> // before others, so that we can handle scripts which refers them,
> // for example: "foo = ABSOLUTE(ADDR(.text)));".
> // When SECTIONS command is present we just add all orphans to the
> end.
> - if (HasSectionsCommand)
> - SectionCommands.insert(SectionCommands.end(), V.begin(), V.end());
> + if (hasSectionsCommand)
> + sectionCommands.insert(sectionCommands.end(), v.begin(), v.end());
> else
> - SectionCommands.insert(SectionCommands.begin(), V.begin(),
> V.end());
> + sectionCommands.insert(sectionCommands.begin(), v.begin(),
> v.end());
> }
>
> -uint64_t LinkerScript::advance(uint64_t Size, unsigned Alignment) {
> - bool IsTbss =
> - (Ctx->OutSec->Flags & SHF_TLS) && Ctx->OutSec->Type ==
> SHT_NOBITS;
> - uint64_t Start = IsTbss ? Dot + Ctx->ThreadBssOffset : Dot;
> - Start = alignTo(Start, Alignment);
> - uint64_t End = Start + Size;
> +uint64_t LinkerScript::advance(uint64_t size, unsigned alignment) {
> + bool isTbss =
> + (ctx->outSec->flags & SHF_TLS) && ctx->outSec->type ==
> SHT_NOBITS;
> + uint64_t start = isTbss ? dot + ctx->threadBssOffset : dot;
> + start = alignTo(start, alignment);
> + uint64_t end = start + size;
>
> - if (IsTbss)
> - Ctx->ThreadBssOffset = End - Dot;
> + if (isTbss)
> + ctx->threadBssOffset = end - dot;
> else
> - Dot = End;
> - return End;
> + dot = end;
> + return end;
> }
>
> -void LinkerScript::output(InputSection *S) {
> - assert(Ctx->OutSec == S->getParent());
> - uint64_t Before = advance(0, 1);
> - uint64_t Pos = advance(S->getSize(), S->Alignment);
> - S->OutSecOff = Pos - S->getSize() - Ctx->OutSec->Addr;
> +void LinkerScript::output(InputSection *s) {
> + assert(ctx->outSec == s->getParent());
> + uint64_t before = advance(0, 1);
> + uint64_t pos = advance(s->getSize(), s->alignment);
> + s->outSecOff = pos - s->getSize() - ctx->outSec->addr;
>
> // Update output section size after adding each section. This is so
> that
> // SIZEOF works correctly in the case below:
> // .foo { *(.aaa) a = SIZEOF(.foo); *(.bbb) }
> - expandOutputSection(Pos - Before);
> + expandOutputSection(pos - before);
> }
>
> -void LinkerScript::switchTo(OutputSection *Sec) {
> - Ctx->OutSec = Sec;
> +void LinkerScript::switchTo(OutputSection *sec) {
> + ctx->outSec = sec;
>
> - uint64_t Before = advance(0, 1);
> - Ctx->OutSec->Addr = advance(0, Ctx->OutSec->Alignment);
> - expandMemoryRegions(Ctx->OutSec->Addr - Before);
> + uint64_t before = advance(0, 1);
> + ctx->outSec->addr = advance(0, ctx->outSec->alignment);
> + expandMemoryRegions(ctx->outSec->addr - before);
> }
>
> // This function searches for a memory region to place the given
> output
> // section in. If found, a pointer to the appropriate memory region is
> // returned. Otherwise, a nullptr is returned.
> -MemoryRegion *LinkerScript::findMemoryRegion(OutputSection *Sec) {
> +MemoryRegion *LinkerScript::findMemoryRegion(OutputSection *sec) {
> // If a memory region name was specified in the output section
> command,
> // then try to find that region first.
> - if (!Sec->MemoryRegionName.empty()) {
> - if (MemoryRegion *M = MemoryRegions.lookup(Sec->MemoryRegionName))
> - return M;
> - error("memory region '" + Sec->MemoryRegionName + "' not
> declared");
> + if (!sec->memoryRegionName.empty()) {
> + if (MemoryRegion *m = memoryRegions.lookup(sec->memoryRegionName))
> + return m;
> + error("memory region '" + sec->memoryRegionName + "' not
> declared");
> return nullptr;
> }
>
> // If at least one memory region is defined, all sections must
> // belong to some memory region. Otherwise, we don't need to do
> // anything for memory regions.
> - if (MemoryRegions.empty())
> + if (memoryRegions.empty())
> return nullptr;
>
> // See if a region can be found by matching section flags.
> - for (auto &Pair : MemoryRegions) {
> - MemoryRegion *M = Pair.second;
> - if ((M->Flags & Sec->Flags) && (M->NegFlags & Sec->Flags) == 0)
> - return M;
> + for (auto &pair : memoryRegions) {
> + MemoryRegion *m = pair.second;
> + if ((m->flags & sec->flags) && (m->negFlags & sec->flags) == 0)
> + return m;
> }
>
> // Otherwise, no suitable region was found.
> - if (Sec->Flags & SHF_ALLOC)
> - error("no memory region specified for section '" + Sec->Name +
> "'");
> + if (sec->flags & SHF_ALLOC)
> + error("no memory region specified for section '" + sec->name +
> "'");
> return nullptr;
> }
>
> -static OutputSection *findFirstSection(PhdrEntry *Load) {
> - for (OutputSection *Sec : OutputSections)
> - if (Sec->PtLoad == Load)
> - return Sec;
> +static OutputSection *findFirstSection(PhdrEntry *load) {
> + for (OutputSection *sec : outputSections)
> + if (sec->ptLoad == load)
> + return sec;
> return nullptr;
> }
>
> // This function assigns offsets to input sections and an output
> section
> // for a single sections command (e.g. ".text { *(.text); }").
> -void LinkerScript::assignOffsets(OutputSection *Sec) {
> - if (!(Sec->Flags & SHF_ALLOC))
> - Dot = 0;
> +void LinkerScript::assignOffsets(OutputSection *sec) {
> + if (!(sec->flags & SHF_ALLOC))
> + dot = 0;
>
> - Ctx->MemRegion = Sec->MemRegion;
> - Ctx->LMARegion = Sec->LMARegion;
> - if (Ctx->MemRegion)
> - Dot = Ctx->MemRegion->CurPos;
> + ctx->memRegion = sec->memRegion;
> + ctx->lmaRegion = sec->lmaRegion;
> + if (ctx->memRegion)
> + dot = ctx->memRegion->curPos;
>
> - if ((Sec->Flags & SHF_ALLOC) && Sec->AddrExpr)
> - setDot(Sec->AddrExpr, Sec->Location, false);
> + if ((sec->flags & SHF_ALLOC) && sec->addrExpr)
> + setDot(sec->addrExpr, sec->location, false);
>
> - switchTo(Sec);
> + switchTo(sec);
>
> - if (Sec->LMAExpr)
> - Ctx->LMAOffset = Sec->LMAExpr().getValue() - Dot;
> + if (sec->lmaExpr)
> + ctx->lmaOffset = sec->lmaExpr().getValue() - dot;
>
> - if (MemoryRegion *MR = Sec->LMARegion)
> - Ctx->LMAOffset = MR->CurPos - Dot;
> + if (MemoryRegion *mr = sec->lmaRegion)
> + ctx->lmaOffset = mr->curPos - dot;
>
> // If neither AT nor AT> is specified for an allocatable section,
> the linker
> // will set the LMA such that the difference between VMA and LMA
> for the
> @@ -786,71 +786,71 @@ void LinkerScript::assignOffsets(OutputS
> //
> https://urldefense.proofpoint.com/v2/url?u=https-3A__sourceware.org_binutils_docs-2D2.20_ld_Output-2DSection-2DLMA.html&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=KIM6JTp85xX6T_wmOfUi4EscNzvcslFgAtN9KSadyGU&e=
> // This, however, should only be done by the first "non-header"
> section
> // in the segment.
> - if (PhdrEntry *L = Ctx->OutSec->PtLoad)
> - if (Sec == findFirstSection(L))
> - L->LMAOffset = Ctx->LMAOffset;
> + if (PhdrEntry *l = ctx->outSec->ptLoad)
> + if (sec == findFirstSection(l))
> + l->lmaOffset = ctx->lmaOffset;
>
> // We can call this method multiple times during the creation of
> // thunks and want to start over calculation each time.
> - Sec->Size = 0;
> + sec->size = 0;
>
> // We visited SectionsCommands from processSectionCommands to
> // layout sections. Now, we visit SectionsCommands again to fix
> // section offsets.
> - for (BaseCommand *Base : Sec->SectionCommands) {
> + for (BaseCommand *base : sec->sectionCommands) {
> // This handles the assignments to symbol or to the dot.
> - if (auto *Cmd = dyn_cast<SymbolAssignment>(Base)) {
> - Cmd->Addr = Dot;
> - assignSymbol(Cmd, true);
> - Cmd->Size = Dot - Cmd->Addr;
> + if (auto *cmd = dyn_cast<SymbolAssignment>(base)) {
> + cmd->addr = dot;
> + assignSymbol(cmd, true);
> + cmd->size = dot - cmd->addr;
> continue;
> }
>
> // Handle BYTE(), SHORT(), LONG(), or QUAD().
> - if (auto *Cmd = dyn_cast<ByteCommand>(Base)) {
> - Cmd->Offset = Dot - Ctx->OutSec->Addr;
> - Dot += Cmd->Size;
> - expandOutputSection(Cmd->Size);
> + if (auto *cmd = dyn_cast<ByteCommand>(base)) {
> + cmd->offset = dot - ctx->outSec->addr;
> + dot += cmd->size;
> + expandOutputSection(cmd->size);
> continue;
> }
>
> // Handle a single input section description command.
> // It calculates and assigns the offsets for each section and also
> // updates the output section size.
> - for (InputSection *Sec :
> cast<InputSectionDescription>(Base)->Sections)
> - output(Sec);
> + for (InputSection *sec :
> cast<InputSectionDescription>(base)->sections)
> + output(sec);
> }
> }
>
> -static bool isDiscardable(OutputSection &Sec) {
> - if (Sec.Name == "/DISCARD/")
> +static bool isDiscardable(OutputSection &sec) {
> + if (sec.name == "/DISCARD/")
> return true;
>
> // We do not remove empty sections that are explicitly
> // assigned to any segment.
> - if (!Sec.Phdrs.empty())
> + if (!sec.phdrs.empty())
> return false;
>
> // We do not want to remove OutputSections with expressions that
> reference
> // symbols even if the OutputSection is empty. We want to ensure
> that the
> // expressions can be evaluated and report an error if they cannot.
> - if (Sec.ExpressionsUseSymbols)
> + if (sec.expressionsUseSymbols)
> return false;
>
> // OutputSections may be referenced by name in ADDR and LOADADDR
> expressions,
> // as an empty Section can has a valid VMA and LMA we keep the
> OutputSection
> // to maintain the integrity of the other Expression.
> - if (Sec.UsedInExpression)
> + if (sec.usedInExpression)
> return false;
>
> - for (BaseCommand *Base : Sec.SectionCommands) {
> - if (auto Cmd = dyn_cast<SymbolAssignment>(Base))
> + for (BaseCommand *base : sec.sectionCommands) {
> + if (auto cmd = dyn_cast<SymbolAssignment>(base))
> // Don't create empty output sections just for unreferenced
> PROVIDE
> // symbols.
> - if (Cmd->Name != "." && !Cmd->Sym)
> + if (cmd->name != "." && !cmd->sym)
> continue;
>
> - if (!isa<InputSectionDescription>(*Base))
> + if (!isa<InputSectionDescription>(*base))
> return false;
> }
> return true;
> @@ -877,35 +877,35 @@ void LinkerScript::adjustSectionsBeforeS
> // The other option is to pick flags that minimize the impact the
> section
> // will have on the rest of the linker. That is why we copy the
> flags from
> // the previous sections. Only a few flags are needed to keep the
> impact low.
> - uint64_t Flags = SHF_ALLOC;
> + uint64_t flags = SHF_ALLOC;
>
> - for (BaseCommand *&Cmd : SectionCommands) {
> - auto *Sec = dyn_cast<OutputSection>(Cmd);
> - if (!Sec)
> + for (BaseCommand *&cmd : sectionCommands) {
> + auto *sec = dyn_cast<OutputSection>(cmd);
> + if (!sec)
> continue;
>
> // Handle align (e.g. ".foo : ALIGN(16) { ... }").
> - if (Sec->AlignExpr)
> - Sec->Alignment =
> - std::max<uint32_t>(Sec->Alignment,
> Sec->AlignExpr().getValue());
> + if (sec->alignExpr)
> + sec->alignment =
> + std::max<uint32_t>(sec->alignment,
> sec->alignExpr().getValue());
>
> // The input section might have been removed (if it was an empty
> synthetic
> // section), but we at least know the flags.
> - if (Sec->HasInputSections)
> - Flags = Sec->Flags;
> + if (sec->hasInputSections)
> + flags = sec->flags;
>
> // We do not want to keep any special flags for output section
> // in case it is empty.
> - bool IsEmpty = getInputSections(Sec).empty();
> - if (IsEmpty)
> - Sec->Flags = Flags & ((Sec->NonAlloc ? 0 : (uint64_t)SHF_ALLOC)
> |
> + bool isEmpty = getInputSections(sec).empty();
> + if (isEmpty)
> + sec->flags = flags & ((sec->nonAlloc ? 0 : (uint64_t)SHF_ALLOC)
> |
> SHF_WRITE | SHF_EXECINSTR);
>
> - if (IsEmpty && isDiscardable(*Sec)) {
> - Sec->markDead();
> - Cmd = nullptr;
> - } else if (!Sec->isLive()) {
> - Sec->markLive();
> + if (isEmpty && isDiscardable(*sec)) {
> + sec->markDead();
> + cmd = nullptr;
> + } else if (!sec->isLive()) {
> + sec->markLive();
> }
> }
>
> @@ -915,20 +915,20 @@ void LinkerScript::adjustSectionsBeforeS
> // clutter the output.
> // We instead remove trivially empty sections. The bfd linker seems
> even
> // more aggressive at removing them.
> - llvm::erase_if(SectionCommands, [&](BaseCommand *Base) { return
> !Base; });
> + llvm::erase_if(sectionCommands, [&](BaseCommand *base) { return
> !base; });
> }
>
> void LinkerScript::adjustSectionsAfterSorting() {
> // Try and find an appropriate memory region to assign offsets in.
> - for (BaseCommand *Base : SectionCommands) {
> - if (auto *Sec = dyn_cast<OutputSection>(Base)) {
> - if (!Sec->LMARegionName.empty()) {
> - if (MemoryRegion *M =
> MemoryRegions.lookup(Sec->LMARegionName))
> - Sec->LMARegion = M;
> + for (BaseCommand *base : sectionCommands) {
> + if (auto *sec = dyn_cast<OutputSection>(base)) {
> + if (!sec->lmaRegionName.empty()) {
> + if (MemoryRegion *m =
> memoryRegions.lookup(sec->lmaRegionName))
> + sec->lmaRegion = m;
> else
> - error("memory region '" + Sec->LMARegionName + "' not
> declared");
> + error("memory region '" + sec->lmaRegionName + "' not
> declared");
> }
> - Sec->MemRegion = findMemoryRegion(Sec);
> + sec->memRegion = findMemoryRegion(sec);
> }
> }
>
> @@ -938,38 +938,38 @@ void LinkerScript::adjustSectionsAfterSo
> // Below is an example of such linker script:
> // PHDRS { seg PT_LOAD; }
> // SECTIONS { .aaa : { *(.aaa) } }
> - std::vector<StringRef> DefPhdrs;
> - auto FirstPtLoad = llvm::find_if(PhdrsCommands, [](const
> PhdrsCommand &Cmd) {
> - return Cmd.Type == PT_LOAD;
> + std::vector<StringRef> defPhdrs;
> + auto firstPtLoad = llvm::find_if(phdrsCommands, [](const
> PhdrsCommand &cmd) {
> + return cmd.type == PT_LOAD;
> });
> - if (FirstPtLoad != PhdrsCommands.end())
> - DefPhdrs.push_back(FirstPtLoad->Name);
> + if (firstPtLoad != phdrsCommands.end())
> + defPhdrs.push_back(firstPtLoad->name);
>
> // Walk the commands and propagate the program headers to commands
> that don't
> // explicitly specify them.
> - for (BaseCommand *Base : SectionCommands) {
> - auto *Sec = dyn_cast<OutputSection>(Base);
> - if (!Sec)
> + for (BaseCommand *base : sectionCommands) {
> + auto *sec = dyn_cast<OutputSection>(base);
> + if (!sec)
> continue;
>
> - if (Sec->Phdrs.empty()) {
> + if (sec->phdrs.empty()) {
> // To match the bfd linker script behaviour, only propagate
> program
> // headers to sections that are allocated.
> - if (Sec->Flags & SHF_ALLOC)
> - Sec->Phdrs = DefPhdrs;
> + if (sec->flags & SHF_ALLOC)
> + sec->phdrs = defPhdrs;
> } else {
> - DefPhdrs = Sec->Phdrs;
> + defPhdrs = sec->phdrs;
> }
> }
> }
>
> -static uint64_t computeBase(uint64_t Min, bool AllocateHeaders) {
> +static uint64_t computeBase(uint64_t min, bool allocateHeaders) {
> // If there is no SECTIONS or if the linkerscript is explicit about
> program
> // headers, do our best to allocate them.
> - if (!Script->HasSectionsCommand || AllocateHeaders)
> + if (!script->hasSectionsCommand || allocateHeaders)
> return 0;
> // Otherwise only allocate program headers if that would not add a
> page.
> - return alignDown(Min, Config->MaxPageSize);
> + return alignDown(min, config->maxPageSize);
> }
>
> // Try to find an address for the file and program headers output
> sections,
> @@ -983,120 +983,120 @@ static uint64_t computeBase(uint64_t Min
> //
> // If there isn't enough space for these sections, we'll remove them
> from the
> // PT_LOAD segment, and we'll also remove the PT_PHDR segment.
> -void LinkerScript::allocateHeaders(std::vector<PhdrEntry *> &Phdrs) {
> - uint64_t Min = std::numeric_limits<uint64_t>::max();
> - for (OutputSection *Sec : OutputSections)
> - if (Sec->Flags & SHF_ALLOC)
> - Min = std::min<uint64_t>(Min, Sec->Addr);
> -
> - auto It = llvm::find_if(
> - Phdrs, [](const PhdrEntry *E) { return E->p_type == PT_LOAD; });
> - if (It == Phdrs.end())
> +void LinkerScript::allocateHeaders(std::vector<PhdrEntry *> &phdrs) {
> + uint64_t min = std::numeric_limits<uint64_t>::max();
> + for (OutputSection *sec : outputSections)
> + if (sec->flags & SHF_ALLOC)
> + min = std::min<uint64_t>(min, sec->addr);
> +
> + auto it = llvm::find_if(
> + phdrs, [](const PhdrEntry *e) { return e->p_type == PT_LOAD; });
> + if (it == phdrs.end())
> return;
> - PhdrEntry *FirstPTLoad = *It;
> + PhdrEntry *firstPTLoad = *it;
>
> - bool HasExplicitHeaders =
> - llvm::any_of(PhdrsCommands, [](const PhdrsCommand &Cmd) {
> - return Cmd.HasPhdrs || Cmd.HasFilehdr;
> + bool hasExplicitHeaders =
> + llvm::any_of(phdrsCommands, [](const PhdrsCommand &cmd) {
> + return cmd.hasPhdrs || cmd.hasFilehdr;
> });
> - bool Paged = !Config->Omagic && !Config->Nmagic;
> - uint64_t HeaderSize = getHeaderSize();
> - if ((Paged || HasExplicitHeaders) &&
> - HeaderSize <= Min - computeBase(Min, HasExplicitHeaders)) {
> - Min = alignDown(Min - HeaderSize, Config->MaxPageSize);
> - Out::ElfHeader->Addr = Min;
> - Out::ProgramHeaders->Addr = Min + Out::ElfHeader->Size;
> + bool paged = !config->omagic && !config->nmagic;
> + uint64_t headerSize = getHeaderSize();
> + if ((paged || hasExplicitHeaders) &&
> + headerSize <= min - computeBase(min, hasExplicitHeaders)) {
> + min = alignDown(min - headerSize, config->maxPageSize);
> + Out::elfHeader->addr = min;
> + Out::programHeaders->addr = min + Out::elfHeader->size;
> return;
> }
>
> // Error if we were explicitly asked to allocate headers.
> - if (HasExplicitHeaders)
> + if (hasExplicitHeaders)
> error("could not allocate headers");
>
> - Out::ElfHeader->PtLoad = nullptr;
> - Out::ProgramHeaders->PtLoad = nullptr;
> - FirstPTLoad->FirstSec = findFirstSection(FirstPTLoad);
> + Out::elfHeader->ptLoad = nullptr;
> + Out::programHeaders->ptLoad = nullptr;
> + firstPTLoad->firstSec = findFirstSection(firstPTLoad);
>
> - llvm::erase_if(Phdrs,
> - [](const PhdrEntry *E) { return E->p_type ==
> PT_PHDR; });
> + llvm::erase_if(phdrs,
> + [](const PhdrEntry *e) { return e->p_type ==
> PT_PHDR; });
> }
>
> LinkerScript::AddressState::AddressState() {
> - for (auto &MRI : Script->MemoryRegions) {
> - MemoryRegion *MR = MRI.second;
> - MR->CurPos = MR->Origin;
> + for (auto &mri : script->memoryRegions) {
> + MemoryRegion *mr = mri.second;
> + mr->curPos = mr->origin;
> }
> }
>
> static uint64_t getInitialDot() {
> // By default linker scripts use an initial value of 0 for '.',
> // but prefer -image-base if set.
> - if (Script->HasSectionsCommand)
> - return Config->ImageBase ? *Config->ImageBase : 0;
> + if (script->hasSectionsCommand)
> + return config->imageBase ? *config->imageBase : 0;
>
> - uint64_t StartAddr = UINT64_MAX;
> + uint64_t startAddr = UINT64_MAX;
> // The Sections with -T<section> have been sorted in order of
> ascending
> // address. We must lower StartAddr if the lowest -T<section
> address> as
> // calls to setDot() must be monotonically increasing.
> - for (auto &KV : Config->SectionStartMap)
> - StartAddr = std::min(StartAddr, KV.second);
> - return std::min(StartAddr, Target->getImageBase() +
> elf::getHeaderSize());
> + for (auto &kv : config->sectionStartMap)
> + startAddr = std::min(startAddr, kv.second);
> + return std::min(startAddr, target->getImageBase() +
> elf::getHeaderSize());
> }
>
> // Here we assign addresses as instructed by linker script SECTIONS
> // sub-commands. Doing that allows us to use final VA values, so here
> // we also handle rest commands like symbol assignments and ASSERTs.
> void LinkerScript::assignAddresses() {
> - Dot = getInitialDot();
> + dot = getInitialDot();
>
> - auto Deleter = make_unique<AddressState>();
> - Ctx = Deleter.get();
> - ErrorOnMissingSection = true;
> - switchTo(Aether);
> -
> - for (BaseCommand *Base : SectionCommands) {
> - if (auto *Cmd = dyn_cast<SymbolAssignment>(Base)) {
> - Cmd->Addr = Dot;
> - assignSymbol(Cmd, false);
> - Cmd->Size = Dot - Cmd->Addr;
> + auto deleter = make_unique<AddressState>();
> + ctx = deleter.get();
> + errorOnMissingSection = true;
> + switchTo(aether);
> +
> + for (BaseCommand *base : sectionCommands) {
> + if (auto *cmd = dyn_cast<SymbolAssignment>(base)) {
> + cmd->addr = dot;
> + assignSymbol(cmd, false);
> + cmd->size = dot - cmd->addr;
> continue;
> }
> - assignOffsets(cast<OutputSection>(Base));
> + assignOffsets(cast<OutputSection>(base));
> }
> - Ctx = nullptr;
> + ctx = nullptr;
> }
>
> // Creates program headers as instructed by PHDRS linker script
> command.
> std::vector<PhdrEntry *> LinkerScript::createPhdrs() {
> - std::vector<PhdrEntry *> Ret;
> + std::vector<PhdrEntry *> ret;
>
> // Process PHDRS and FILEHDR keywords because they are not
> // real output sections and cannot be added in the following loop.
> - for (const PhdrsCommand &Cmd : PhdrsCommands) {
> - PhdrEntry *Phdr = make<PhdrEntry>(Cmd.Type, Cmd.Flags ?
> *Cmd.Flags : PF_R);
> + for (const PhdrsCommand &cmd : phdrsCommands) {
> + PhdrEntry *phdr = make<PhdrEntry>(cmd.type, cmd.flags ?
> *cmd.flags : PF_R);
>
> - if (Cmd.HasFilehdr)
> - Phdr->add(Out::ElfHeader);
> - if (Cmd.HasPhdrs)
> - Phdr->add(Out::ProgramHeaders);
> -
> - if (Cmd.LMAExpr) {
> - Phdr->p_paddr = Cmd.LMAExpr().getValue();
> - Phdr->HasLMA = true;
> + if (cmd.hasFilehdr)
> + phdr->add(Out::elfHeader);
> + if (cmd.hasPhdrs)
> + phdr->add(Out::programHeaders);
> +
> + if (cmd.lmaExpr) {
> + phdr->p_paddr = cmd.lmaExpr().getValue();
> + phdr->hasLMA = true;
> }
> - Ret.push_back(Phdr);
> + ret.push_back(phdr);
> }
>
> // Add output sections to program headers.
> - for (OutputSection *Sec : OutputSections) {
> + for (OutputSection *sec : outputSections) {
> // Assign headers specified by linker script
> - for (size_t Id : getPhdrIndices(Sec)) {
> - Ret[Id]->add(Sec);
> - if (!PhdrsCommands[Id].Flags.hasValue())
> - Ret[Id]->p_flags |= Sec->getPhdrFlags();
> + for (size_t id : getPhdrIndices(sec)) {
> + ret[id]->add(sec);
> + if (!phdrsCommands[id].flags.hasValue())
> + ret[id]->p_flags |= sec->getPhdrFlags();
> }
> }
> - return Ret;
> + return ret;
> }
>
> // Returns true if we should emit an .interp section.
> @@ -1105,54 +1105,54 @@ std::vector<PhdrEntry *> LinkerScript::c
> // no PT_INTERP is there, there's no place to emit an
> // .interp, so we don't do that in that case.
> bool LinkerScript::needsInterpSection() {
> - if (PhdrsCommands.empty())
> + if (phdrsCommands.empty())
> return true;
> - for (PhdrsCommand &Cmd : PhdrsCommands)
> - if (Cmd.Type == PT_INTERP)
> + for (PhdrsCommand &cmd : phdrsCommands)
> + if (cmd.type == PT_INTERP)
> return true;
> return false;
> }
>
> -ExprValue LinkerScript::getSymbolValue(StringRef Name, const Twine
> &Loc) {
> - if (Name == ".") {
> - if (Ctx)
> - return {Ctx->OutSec, false, Dot - Ctx->OutSec->Addr, Loc};
> - error(Loc + ": unable to get location counter value");
> +ExprValue LinkerScript::getSymbolValue(StringRef name, const Twine
> &loc) {
> + if (name == ".") {
> + if (ctx)
> + return {ctx->outSec, false, dot - ctx->outSec->addr, loc};
> + error(loc + ": unable to get location counter value");
> return 0;
> }
>
> - if (Symbol *Sym = Symtab->find(Name)) {
> - if (auto *DS = dyn_cast<Defined>(Sym))
> - return {DS->Section, false, DS->Value, Loc};
> - if (isa<SharedSymbol>(Sym))
> - if (!ErrorOnMissingSection)
> - return {nullptr, false, 0, Loc};
> + if (Symbol *sym = symtab->find(name)) {
> + if (auto *ds = dyn_cast<Defined>(sym))
> + return {ds->section, false, ds->value, loc};
> + if (isa<SharedSymbol>(sym))
> + if (!errorOnMissingSection)
> + return {nullptr, false, 0, loc};
> }
>
> - error(Loc + ": symbol not found: " + Name);
> + error(loc + ": symbol not found: " + name);
> return 0;
> }
>
> // Returns the index of the segment named Name.
> -static Optional<size_t> getPhdrIndex(ArrayRef<PhdrsCommand> Vec,
> - StringRef Name) {
> - for (size_t I = 0; I < Vec.size(); ++I)
> - if (Vec[I].Name == Name)
> - return I;
> +static Optional<size_t> getPhdrIndex(ArrayRef<PhdrsCommand> vec,
> + StringRef name) {
> + for (size_t i = 0; i < vec.size(); ++i)
> + if (vec[i].name == name)
> + return i;
> return None;
> }
>
> // Returns indices of ELF headers containing specific section. Each
> index is a
> // zero based number of ELF header listed within PHDRS {} script
> block.
> -std::vector<size_t> LinkerScript::getPhdrIndices(OutputSection *Cmd) {
> - std::vector<size_t> Ret;
> +std::vector<size_t> LinkerScript::getPhdrIndices(OutputSection *cmd) {
> + std::vector<size_t> ret;
>
> - for (StringRef S : Cmd->Phdrs) {
> - if (Optional<size_t> Idx = getPhdrIndex(PhdrsCommands, S))
> - Ret.push_back(*Idx);
> - else if (S != "NONE")
> - error(Cmd->Location + ": section header '" + S +
> + for (StringRef s : cmd->phdrs) {
> + if (Optional<size_t> idx = getPhdrIndex(phdrsCommands, s))
> + ret.push_back(*idx);
> + else if (s != "NONE")
> + error(cmd->location + ": section header '" + s +
> "' is not listed in PHDRS");
> }
> - return Ret;
> + return ret;
> }
>
> Modified: lld/trunk/ELF/LinkerScript.h
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_LinkerScript.h-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=SaXI9lNu0Ic2lLxs2_hjjb42a99oRYpPbCb30hfTvOs&e=
>
> ==============================================================================
> --- lld/trunk/ELF/LinkerScript.h (original)
> +++ lld/trunk/ELF/LinkerScript.h Tue Jul 9 22:00:37 2019
> @@ -38,29 +38,29 @@ class ThunkSection;
>
> // This represents an r-value in the linker script.
> struct ExprValue {
> - ExprValue(SectionBase *Sec, bool ForceAbsolute, uint64_t Val,
> - const Twine &Loc)
> - : Sec(Sec), ForceAbsolute(ForceAbsolute), Val(Val),
> Loc(Loc.str()) {}
> + ExprValue(SectionBase *sec, bool forceAbsolute, uint64_t val,
> + const Twine &loc)
> + : sec(sec), forceAbsolute(forceAbsolute), val(val),
> loc(loc.str()) {}
>
> - ExprValue(uint64_t Val) : ExprValue(nullptr, false, Val, "") {}
> + ExprValue(uint64_t val) : ExprValue(nullptr, false, val, "") {}
>
> - bool isAbsolute() const { return ForceAbsolute || Sec == nullptr; }
> + bool isAbsolute() const { return forceAbsolute || sec == nullptr; }
> uint64_t getValue() const;
> uint64_t getSecAddr() const;
> uint64_t getSectionOffset() const;
>
> // If a value is relative to a section, it has a non-null Sec.
> - SectionBase *Sec;
> + SectionBase *sec;
>
> // True if this expression is enclosed in ABSOLUTE().
> // This flag affects the return value of getValue().
> - bool ForceAbsolute;
> + bool forceAbsolute;
>
> - uint64_t Val;
> - uint64_t Alignment = 1;
> + uint64_t val;
> + uint64_t alignment = 1;
>
> // Original source location. Used for error messages.
> - std::string Loc;
> + std::string loc;
> };
>
> // This represents an expression in the linker script.
> @@ -78,42 +78,42 @@ enum SectionsCommandKind {
> };
>
> struct BaseCommand {
> - BaseCommand(int K) : Kind(K) {}
> - int Kind;
> + BaseCommand(int k) : kind(k) {}
> + int kind;
> };
>
> // This represents ". = <expr>" or "<symbol> = <expr>".
> struct SymbolAssignment : BaseCommand {
> - SymbolAssignment(StringRef Name, Expr E, std::string Loc)
> - : BaseCommand(AssignmentKind), Name(Name), Expression(E),
> Location(Loc) {}
> + SymbolAssignment(StringRef name, Expr e, std::string loc)
> + : BaseCommand(AssignmentKind), name(name), expression(e),
> location(loc) {}
>
> - static bool classof(const BaseCommand *C) {
> - return C->Kind == AssignmentKind;
> + static bool classof(const BaseCommand *c) {
> + return c->kind == AssignmentKind;
> }
>
> // The LHS of an expression. Name is either a symbol name or ".".
> - StringRef Name;
> - Defined *Sym = nullptr;
> + StringRef name;
> + Defined *sym = nullptr;
>
> // The RHS of an expression.
> - Expr Expression;
> + Expr expression;
>
> // Command attributes for PROVIDE, HIDDEN and PROVIDE_HIDDEN.
> - bool Provide = false;
> - bool Hidden = false;
> + bool provide = false;
> + bool hidden = false;
>
> // Holds file name and line number for error reporting.
> - std::string Location;
> + std::string location;
>
> // A string representation of this command. We use this for -Map.
> - std::string CommandString;
> + std::string commandString;
>
> // Address of this assignment command.
> - unsigned Addr;
> + unsigned addr;
>
> // Size of this assignment command. This is usually 0, but if
> // you move '.' this may be greater than 0.
> - unsigned Size;
> + unsigned size;
> };
>
> // Linker scripts allow additional constraints to be put on ouput
> sections.
> @@ -126,83 +126,83 @@ enum class ConstraintKind { NoConstraint
> // target memory. Instances of the struct are created by parsing the
> // MEMORY command.
> struct MemoryRegion {
> - MemoryRegion(StringRef Name, uint64_t Origin, uint64_t Length,
> uint32_t Flags,
> - uint32_t NegFlags)
> - : Name(Name), Origin(Origin), Length(Length), Flags(Flags),
> - NegFlags(NegFlags) {}
> -
> - std::string Name;
> - uint64_t Origin;
> - uint64_t Length;
> - uint32_t Flags;
> - uint32_t NegFlags;
> - uint64_t CurPos = 0;
> + MemoryRegion(StringRef name, uint64_t origin, uint64_t length,
> uint32_t flags,
> + uint32_t negFlags)
> + : name(name), origin(origin), length(length), flags(flags),
> + negFlags(negFlags) {}
> +
> + std::string name;
> + uint64_t origin;
> + uint64_t length;
> + uint32_t flags;
> + uint32_t negFlags;
> + uint64_t curPos = 0;
> };
>
> // This struct represents one section match pattern in SECTIONS()
> command.
> // It can optionally have negative match pattern for EXCLUDED_FILE
> command.
> // Also it may be surrounded with SORT() command, so contains sorting
> rules.
> struct SectionPattern {
> - SectionPattern(StringMatcher &&Pat1, StringMatcher &&Pat2)
> - : ExcludedFilePat(Pat1), SectionPat(Pat2),
> - SortOuter(SortSectionPolicy::Default),
> - SortInner(SortSectionPolicy::Default) {}
> -
> - StringMatcher ExcludedFilePat;
> - StringMatcher SectionPat;
> - SortSectionPolicy SortOuter;
> - SortSectionPolicy SortInner;
> + SectionPattern(StringMatcher &&pat1, StringMatcher &&pat2)
> + : excludedFilePat(pat1), sectionPat(pat2),
> + sortOuter(SortSectionPolicy::Default),
> + sortInner(SortSectionPolicy::Default) {}
> +
> + StringMatcher excludedFilePat;
> + StringMatcher sectionPat;
> + SortSectionPolicy sortOuter;
> + SortSectionPolicy sortInner;
> };
>
> struct InputSectionDescription : BaseCommand {
> - InputSectionDescription(StringRef FilePattern)
> - : BaseCommand(InputSectionKind), FilePat(FilePattern) {}
> + InputSectionDescription(StringRef filePattern)
> + : BaseCommand(InputSectionKind), filePat(filePattern) {}
>
> - static bool classof(const BaseCommand *C) {
> - return C->Kind == InputSectionKind;
> + static bool classof(const BaseCommand *c) {
> + return c->kind == InputSectionKind;
> }
>
> - StringMatcher FilePat;
> + StringMatcher filePat;
>
> // Input sections that matches at least one of SectionPatterns
> // will be associated with this InputSectionDescription.
> - std::vector<SectionPattern> SectionPatterns;
> + std::vector<SectionPattern> sectionPatterns;
>
> - std::vector<InputSection *> Sections;
> + std::vector<InputSection *> sections;
>
> // Temporary record of synthetic ThunkSection instances and the
> pass that
> // they were created in. This is used to insert newly created
> ThunkSections
> // into Sections at the end of a createThunks() pass.
> - std::vector<std::pair<ThunkSection *, uint32_t>> ThunkSections;
> + std::vector<std::pair<ThunkSection *, uint32_t>> thunkSections;
> };
>
> // Represents BYTE(), SHORT(), LONG(), or QUAD().
> struct ByteCommand : BaseCommand {
> - ByteCommand(Expr E, unsigned Size, std::string CommandString)
> - : BaseCommand(ByteKind), CommandString(CommandString),
> Expression(E),
> - Size(Size) {}
> + ByteCommand(Expr e, unsigned size, std::string commandString)
> + : BaseCommand(ByteKind), commandString(commandString),
> expression(e),
> + size(size) {}
>
> - static bool classof(const BaseCommand *C) { return C->Kind ==
> ByteKind; }
> + static bool classof(const BaseCommand *c) { return c->kind ==
> ByteKind; }
>
> // Keeps string representing the command. Used for -Map" is perhaps
> better.
> - std::string CommandString;
> + std::string commandString;
>
> - Expr Expression;
> + Expr expression;
>
> // This is just an offset of this assignment command in the output
> section.
> - unsigned Offset;
> + unsigned offset;
>
> // Size of this data command.
> - unsigned Size;
> + unsigned size;
> };
>
> struct PhdrsCommand {
> - StringRef Name;
> - unsigned Type = llvm::ELF::PT_NULL;
> - bool HasFilehdr = false;
> - bool HasPhdrs = false;
> - llvm::Optional<unsigned> Flags;
> - Expr LMAExpr = nullptr;
> + StringRef name;
> + unsigned type = llvm::ELF::PT_NULL;
> + bool hasFilehdr = false;
> + bool hasPhdrs = false;
> + llvm::Optional<unsigned> flags;
> + Expr lmaExpr = nullptr;
> };
>
> class LinkerScript final {
> @@ -211,35 +211,35 @@ class LinkerScript final {
> // not be used outside of the scope of a call to the above
> functions.
> struct AddressState {
> AddressState();
> - uint64_t ThreadBssOffset = 0;
> - OutputSection *OutSec = nullptr;
> - MemoryRegion *MemRegion = nullptr;
> - MemoryRegion *LMARegion = nullptr;
> - uint64_t LMAOffset = 0;
> + uint64_t threadBssOffset = 0;
> + OutputSection *outSec = nullptr;
> + MemoryRegion *memRegion = nullptr;
> + MemoryRegion *lmaRegion = nullptr;
> + uint64_t lmaOffset = 0;
> };
>
> - llvm::DenseMap<StringRef, OutputSection *> NameToOutputSection;
> + llvm::DenseMap<StringRef, OutputSection *> nameToOutputSection;
>
> - void addSymbol(SymbolAssignment *Cmd);
> - void assignSymbol(SymbolAssignment *Cmd, bool InSec);
> - void setDot(Expr E, const Twine &Loc, bool InSec);
> - void expandOutputSection(uint64_t Size);
> - void expandMemoryRegions(uint64_t Size);
> + void addSymbol(SymbolAssignment *cmd);
> + void assignSymbol(SymbolAssignment *cmd, bool inSec);
> + void setDot(Expr e, const Twine &loc, bool inSec);
> + void expandOutputSection(uint64_t size);
> + void expandMemoryRegions(uint64_t size);
>
> std::vector<InputSection *>
> computeInputSections(const InputSectionDescription *);
>
> - std::vector<InputSection *> createInputSectionList(OutputSection
> &Cmd);
> + std::vector<InputSection *> createInputSectionList(OutputSection
> &cmd);
>
> - std::vector<size_t> getPhdrIndices(OutputSection *Sec);
> + std::vector<size_t> getPhdrIndices(OutputSection *sec);
>
> - MemoryRegion *findMemoryRegion(OutputSection *Sec);
> + MemoryRegion *findMemoryRegion(OutputSection *sec);
>
> - void switchTo(OutputSection *Sec);
> - uint64_t advance(uint64_t Size, unsigned Align);
> - void output(InputSection *Sec);
> + void switchTo(OutputSection *sec);
> + uint64_t advance(uint64_t size, unsigned align);
> + void output(InputSection *sec);
>
> - void assignOffsets(OutputSection *Sec);
> + void assignOffsets(OutputSection *sec);
>
> // Ctx captures the local AddressState and makes it accessible
> // deliberately. This is needed as there are some cases where we
> cannot just
> @@ -247,21 +247,21 @@ class LinkerScript final {
> // script parser.
> // This should remain a plain pointer as its lifetime is smaller
> than
> // LinkerScript.
> - AddressState *Ctx = nullptr;
> + AddressState *ctx = nullptr;
>
> - OutputSection *Aether;
> + OutputSection *aether;
>
> - uint64_t Dot;
> + uint64_t dot;
>
> public:
> - OutputSection *createOutputSection(StringRef Name, StringRef
> Location);
> - OutputSection *getOrCreateOutputSection(StringRef Name);
> + OutputSection *createOutputSection(StringRef name, StringRef
> location);
> + OutputSection *getOrCreateOutputSection(StringRef name);
>
> - bool hasPhdrsCommands() { return !PhdrsCommands.empty(); }
> - uint64_t getDot() { return Dot; }
> - void discard(ArrayRef<InputSection *> V);
> + bool hasPhdrsCommands() { return !phdrsCommands.empty(); }
> + uint64_t getDot() { return dot; }
> + void discard(ArrayRef<InputSection *> v);
>
> - ExprValue getSymbolValue(StringRef Name, const Twine &Loc);
> + ExprValue getSymbolValue(StringRef name, const Twine &loc);
>
> void addOrphanSections();
> void adjustSectionsBeforeSorting();
> @@ -270,9 +270,9 @@ public:
> std::vector<PhdrEntry *> createPhdrs();
> bool needsInterpSection();
>
> - bool shouldKeep(InputSectionBase *S);
> + bool shouldKeep(InputSectionBase *s);
> void assignAddresses();
> - void allocateHeaders(std::vector<PhdrEntry *> &Phdrs);
> + void allocateHeaders(std::vector<PhdrEntry *> &phdrs);
> void processSectionCommands();
> void declareSymbols();
>
> @@ -280,31 +280,31 @@ public:
> void processInsertCommands();
>
> // SECTIONS command list.
> - std::vector<BaseCommand *> SectionCommands;
> + std::vector<BaseCommand *> sectionCommands;
>
> // PHDRS command list.
> - std::vector<PhdrsCommand> PhdrsCommands;
> + std::vector<PhdrsCommand> phdrsCommands;
>
> - bool HasSectionsCommand = false;
> - bool ErrorOnMissingSection = false;
> + bool hasSectionsCommand = false;
> + bool errorOnMissingSection = false;
>
> // List of section patterns specified with KEEP commands. They will
> // be kept even if they are unused and --gc-sections is specified.
> - std::vector<InputSectionDescription *> KeptSections;
> + std::vector<InputSectionDescription *> keptSections;
>
> // A map from memory region name to a memory region descriptor.
> - llvm::MapVector<llvm::StringRef, MemoryRegion *> MemoryRegions;
> + llvm::MapVector<llvm::StringRef, MemoryRegion *> memoryRegions;
>
> // A list of symbols referenced by the script.
> - std::vector<llvm::StringRef> ReferencedSymbols;
> + std::vector<llvm::StringRef> referencedSymbols;
>
> // Used to implement INSERT [AFTER|BEFORE]. Contains commands that
> need
> // to be inserted into SECTIONS commands list.
> - llvm::DenseMap<StringRef, std::vector<BaseCommand *>>
> InsertAfterCommands;
> - llvm::DenseMap<StringRef, std::vector<BaseCommand *>>
> InsertBeforeCommands;
> + llvm::DenseMap<StringRef, std::vector<BaseCommand *>>
> insertAfterCommands;
> + llvm::DenseMap<StringRef, std::vector<BaseCommand *>>
> insertBeforeCommands;
> };
>
> -extern LinkerScript *Script;
> +extern LinkerScript *script;
>
> } // end namespace elf
> } // end namespace lld
>
> Modified: lld/trunk/ELF/MapFile.cpp
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_MapFile.cpp-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=DV0j7kv6ALbDYnbvb0v0NzYqJPlD0Vb-1XMCTCN5zXo&e=
>
> ==============================================================================
> --- lld/trunk/ELF/MapFile.cpp (original)
> +++ lld/trunk/ELF/MapFile.cpp Tue Jul 9 22:00:37 2019
> @@ -39,65 +39,65 @@ using namespace lld::elf;
>
> using SymbolMapTy = DenseMap<const SectionBase *, SmallVector<Defined
> *, 4>>;
>
> -static const std::string Indent8 = " "; // 8 spaces
> -static const std::string Indent16 = " "; // 16 spaces
> +static const std::string indent8 = " "; // 8 spaces
> +static const std::string indent16 = " "; // 16 spaces
>
> // Print out the first three columns of a line.
> -static void writeHeader(raw_ostream &OS, uint64_t VMA, uint64_t LMA,
> - uint64_t Size, uint64_t Align) {
> - if (Config->Is64)
> - OS << format("%16llx %16llx %8llx %5lld ", VMA, LMA, Size, Align);
> +static void writeHeader(raw_ostream &os, uint64_t vma, uint64_t lma,
> + uint64_t size, uint64_t align) {
> + if (config->is64)
> + os << format("%16llx %16llx %8llx %5lld ", vma, lma, size, align);
> else
> - OS << format("%8llx %8llx %8llx %5lld ", VMA, LMA, Size, Align);
> + os << format("%8llx %8llx %8llx %5lld ", vma, lma, size, align);
> }
>
> // Returns a list of all symbols that we want to print out.
> static std::vector<Defined *> getSymbols() {
> - std::vector<Defined *> V;
> - for (InputFile *File : ObjectFiles)
> - for (Symbol *B : File->getSymbols())
> - if (auto *DR = dyn_cast<Defined>(B))
> - if (!DR->isSection() && DR->Section && DR->Section->isLive()
> &&
> - (DR->File == File || DR->NeedsPltAddr ||
> DR->Section->Bss))
> - V.push_back(DR);
> - return V;
> + std::vector<Defined *> v;
> + for (InputFile *file : objectFiles)
> + for (Symbol *b : file->getSymbols())
> + if (auto *dr = dyn_cast<Defined>(b))
> + if (!dr->isSection() && dr->section && dr->section->isLive()
> &&
> + (dr->file == file || dr->needsPltAddr ||
> dr->section->bss))
> + v.push_back(dr);
> + return v;
> }
>
> // Returns a map from sections to their symbols.
> -static SymbolMapTy getSectionSyms(ArrayRef<Defined *> Syms) {
> - SymbolMapTy Ret;
> - for (Defined *DR : Syms)
> - Ret[DR->Section].push_back(DR);
> +static SymbolMapTy getSectionSyms(ArrayRef<Defined *> syms) {
> + SymbolMapTy ret;
> + for (Defined *dr : syms)
> + ret[dr->section].push_back(dr);
>
> // Sort symbols by address. We want to print out symbols in the
> // order in the output file rather than the order they appeared
> // in the input files.
> - for (auto &It : Ret)
> - llvm::stable_sort(It.second, [](Defined *A, Defined *B) {
> - return A->getVA() < B->getVA();
> + for (auto &it : ret)
> + llvm::stable_sort(it.second, [](Defined *a, Defined *b) {
> + return a->getVA() < b->getVA();
> });
> - return Ret;
> + return ret;
> }
>
> // Construct a map from symbols to their stringified representations.
> // Demangling symbols (which is what toString() does) is slow, so
> // we do that in batch using parallel-for.
> static DenseMap<Symbol *, std::string>
> -getSymbolStrings(ArrayRef<Defined *> Syms) {
> - std::vector<std::string> Str(Syms.size());
> - parallelForEachN(0, Syms.size(), [&](size_t I) {
> - raw_string_ostream OS(Str[I]);
> - OutputSection *OSec = Syms[I]->getOutputSection();
> - uint64_t VMA = Syms[I]->getVA();
> - uint64_t LMA = OSec ? OSec->getLMA() + VMA - OSec->getVA(0) : 0;
> - writeHeader(OS, VMA, LMA, Syms[I]->getSize(), 1);
> - OS << Indent16 << toString(*Syms[I]);
> +getSymbolStrings(ArrayRef<Defined *> syms) {
> + std::vector<std::string> str(syms.size());
> + parallelForEachN(0, syms.size(), [&](size_t i) {
> + raw_string_ostream os(str[i]);
> + OutputSection *osec = syms[i]->getOutputSection();
> + uint64_t vma = syms[i]->getVA();
> + uint64_t lma = osec ? osec->getLMA() + vma - osec->getVA(0) : 0;
> + writeHeader(os, vma, lma, syms[i]->getSize(), 1);
> + os << indent16 << toString(*syms[i]);
> });
>
> - DenseMap<Symbol *, std::string> Ret;
> - for (size_t I = 0, E = Syms.size(); I < E; ++I)
> - Ret[Syms[I]] = std::move(Str[I]);
> - return Ret;
> + DenseMap<Symbol *, std::string> ret;
> + for (size_t i = 0, e = syms.size(); i < e; ++i)
> + ret[syms[i]] = std::move(str[i]);
> + return ret;
> }
>
> // Print .eh_frame contents. Since the section consists of
> EhSectionPieces,
> @@ -106,115 +106,115 @@ getSymbolStrings(ArrayRef<Defined *> Sym
> // .eh_frame tend to contain a lot of section pieces that are
> contiguous
> // both in input file and output file. Such pieces are squashed before
> // being displayed to make output compact.
> -static void printEhFrame(raw_ostream &OS, const EhFrameSection *Sec) {
> - std::vector<EhSectionPiece> Pieces;
> +static void printEhFrame(raw_ostream &os, const EhFrameSection *sec) {
> + std::vector<EhSectionPiece> pieces;
>
> - auto Add = [&](const EhSectionPiece &P) {
> + auto add = [&](const EhSectionPiece &p) {
> // If P is adjacent to Last, squash the two.
> - if (!Pieces.empty()) {
> - EhSectionPiece &Last = Pieces.back();
> - if (Last.Sec == P.Sec && Last.InputOff + Last.Size ==
> P.InputOff &&
> - Last.OutputOff + Last.Size == P.OutputOff) {
> - Last.Size += P.Size;
> + if (!pieces.empty()) {
> + EhSectionPiece &last = pieces.back();
> + if (last.sec == p.sec && last.inputOff + last.size ==
> p.inputOff &&
> + last.outputOff + last.size == p.outputOff) {
> + last.size += p.size;
> return;
> }
> }
> - Pieces.push_back(P);
> + pieces.push_back(p);
> };
>
> // Gather section pieces.
> - for (const CieRecord *Rec : Sec->getCieRecords()) {
> - Add(*Rec->Cie);
> - for (const EhSectionPiece *Fde : Rec->Fdes)
> - Add(*Fde);
> + for (const CieRecord *rec : sec->getCieRecords()) {
> + add(*rec->cie);
> + for (const EhSectionPiece *fde : rec->fdes)
> + add(*fde);
> }
>
> // Print out section pieces.
> - const OutputSection *OSec = Sec->getOutputSection();
> - for (EhSectionPiece &P : Pieces) {
> - writeHeader(OS, OSec->Addr + P.OutputOff, OSec->getLMA() +
> P.OutputOff,
> - P.Size, 1);
> - OS << Indent8 << toString(P.Sec->File) << ":(" << P.Sec->Name <<
> "+0x"
> - << Twine::utohexstr(P.InputOff) + ")\n";
> + const OutputSection *osec = sec->getOutputSection();
> + for (EhSectionPiece &p : pieces) {
> + writeHeader(os, osec->addr + p.outputOff, osec->getLMA() +
> p.outputOff,
> + p.size, 1);
> + os << indent8 << toString(p.sec->file) << ":(" << p.sec->name <<
> "+0x"
> + << Twine::utohexstr(p.inputOff) + ")\n";
> }
> }
>
> void elf::writeMapFile() {
> - if (Config->MapFile.empty())
> + if (config->mapFile.empty())
> return;
>
> // Open a map file for writing.
> - std::error_code EC;
> - raw_fd_ostream OS(Config->MapFile, EC, sys::fs::F_None);
> - if (EC) {
> - error("cannot open " + Config->MapFile + ": " + EC.message());
> + std::error_code ec;
> + raw_fd_ostream os(config->mapFile, ec, sys::fs::F_None);
> + if (ec) {
> + error("cannot open " + config->mapFile + ": " + ec.message());
> return;
> }
>
> // Collect symbol info that we want to print out.
> - std::vector<Defined *> Syms = getSymbols();
> - SymbolMapTy SectionSyms = getSectionSyms(Syms);
> - DenseMap<Symbol *, std::string> SymStr = getSymbolStrings(Syms);
> + std::vector<Defined *> syms = getSymbols();
> + SymbolMapTy sectionSyms = getSectionSyms(syms);
> + DenseMap<Symbol *, std::string> symStr = getSymbolStrings(syms);
>
> // Print out the header line.
> - int W = Config->Is64 ? 16 : 8;
> - OS << right_justify("VMA", W) << ' ' << right_justify("LMA", W)
> + int w = config->is64 ? 16 : 8;
> + os << right_justify("VMA", w) << ' ' << right_justify("LMA", w)
> << " Size Align Out In Symbol\n";
>
> - OutputSection* OSec = nullptr;
> - for (BaseCommand *Base : Script->SectionCommands) {
> - if (auto *Cmd = dyn_cast<SymbolAssignment>(Base)) {
> - if (Cmd->Provide && !Cmd->Sym)
> + OutputSection* osec = nullptr;
> + for (BaseCommand *base : script->sectionCommands) {
> + if (auto *cmd = dyn_cast<SymbolAssignment>(base)) {
> + if (cmd->provide && !cmd->sym)
> continue;
> - uint64_t LMA = OSec ? OSec->getLMA() + Cmd->Addr -
> OSec->getVA(0) : 0;
> - writeHeader(OS, Cmd->Addr, LMA, Cmd->Size, 1);
> - OS << Cmd->CommandString << '\n';
> + uint64_t lma = osec ? osec->getLMA() + cmd->addr -
> osec->getVA(0) : 0;
> + writeHeader(os, cmd->addr, lma, cmd->size, 1);
> + os << cmd->commandString << '\n';
> continue;
> }
>
> - OSec = cast<OutputSection>(Base);
> - writeHeader(OS, OSec->Addr, OSec->getLMA(), OSec->Size,
> OSec->Alignment);
> - OS << OSec->Name << '\n';
> + osec = cast<OutputSection>(base);
> + writeHeader(os, osec->addr, osec->getLMA(), osec->size,
> osec->alignment);
> + os << osec->name << '\n';
>
> // Dump symbols for each input section.
> - for (BaseCommand *Base : OSec->SectionCommands) {
> - if (auto *ISD = dyn_cast<InputSectionDescription>(Base)) {
> - for (InputSection *IS : ISD->Sections) {
> - if (auto *EhSec = dyn_cast<EhFrameSection>(IS)) {
> - printEhFrame(OS, EhSec);
> + for (BaseCommand *base : osec->sectionCommands) {
> + if (auto *isd = dyn_cast<InputSectionDescription>(base)) {
> + for (InputSection *isec : isd->sections) {
> + if (auto *ehSec = dyn_cast<EhFrameSection>(isec)) {
> + printEhFrame(os, ehSec);
> continue;
> }
>
> - writeHeader(OS, IS->getVA(0), OSec->getLMA() +
> IS->getOffset(0),
> - IS->getSize(), IS->Alignment);
> - OS << Indent8 << toString(IS) << '\n';
> - for (Symbol *Sym : SectionSyms[IS])
> - OS << SymStr[Sym] << '\n';
> + writeHeader(os, isec->getVA(0), osec->getLMA() +
> isec->getOffset(0),
> + isec->getSize(), isec->alignment);
> + os << indent8 << toString(isec) << '\n';
> + for (Symbol *sym : sectionSyms[isec])
> + os << symStr[sym] << '\n';
> }
> continue;
> }
>
> - if (auto *Cmd = dyn_cast<ByteCommand>(Base)) {
> - writeHeader(OS, OSec->Addr + Cmd->Offset, OSec->getLMA() +
> Cmd->Offset,
> - Cmd->Size, 1);
> - OS << Indent8 << Cmd->CommandString << '\n';
> + if (auto *cmd = dyn_cast<ByteCommand>(base)) {
> + writeHeader(os, osec->addr + cmd->offset, osec->getLMA() +
> cmd->offset,
> + cmd->size, 1);
> + os << indent8 << cmd->commandString << '\n';
> continue;
> }
>
> - if (auto *Cmd = dyn_cast<SymbolAssignment>(Base)) {
> - if (Cmd->Provide && !Cmd->Sym)
> + if (auto *cmd = dyn_cast<SymbolAssignment>(base)) {
> + if (cmd->provide && !cmd->sym)
> continue;
> - writeHeader(OS, Cmd->Addr, OSec->getLMA() + Cmd->Addr -
> OSec->getVA(0),
> - Cmd->Size, 1);
> - OS << Indent8 << Cmd->CommandString << '\n';
> + writeHeader(os, cmd->addr, osec->getLMA() + cmd->addr -
> osec->getVA(0),
> + cmd->size, 1);
> + os << indent8 << cmd->commandString << '\n';
> continue;
> }
> }
> }
> }
>
> -static void print(StringRef A, StringRef B) {
> - outs() << left_justify(A, 49) << " " << B << "\n";
> +static void print(StringRef a, StringRef b) {
> + outs() << left_justify(a, 49) << " " << b << "\n";
> }
>
> // Output a cross reference table to stdout. This is for --cref.
> @@ -229,18 +229,18 @@ static void print(StringRef A, StringRef
> // In this case, strlen is defined by libc.so.6 and used by other two
> // files.
> void elf::writeCrossReferenceTable() {
> - if (!Config->Cref)
> + if (!config->cref)
> return;
>
> // Collect symbols and files.
> - MapVector<Symbol *, SetVector<InputFile *>> Map;
> - for (InputFile *File : ObjectFiles) {
> - for (Symbol *Sym : File->getSymbols()) {
> - if (isa<SharedSymbol>(Sym))
> - Map[Sym].insert(File);
> - if (auto *D = dyn_cast<Defined>(Sym))
> - if (!D->isLocal() && (!D->Section || D->Section->isLive()))
> - Map[D].insert(File);
> + MapVector<Symbol *, SetVector<InputFile *>> map;
> + for (InputFile *file : objectFiles) {
> + for (Symbol *sym : file->getSymbols()) {
> + if (isa<SharedSymbol>(sym))
> + map[sym].insert(file);
> + if (auto *d = dyn_cast<Defined>(sym))
> + if (!d->isLocal() && (!d->section || d->section->isLive()))
> + map[d].insert(file);
> }
> }
>
> @@ -249,13 +249,13 @@ void elf::writeCrossReferenceTable() {
> print("Symbol", "File");
>
> // Print out a table.
> - for (auto KV : Map) {
> - Symbol *Sym = KV.first;
> - SetVector<InputFile *> &Files = KV.second;
> -
> - print(toString(*Sym), toString(Sym->File));
> - for (InputFile *File : Files)
> - if (File != Sym->File)
> - print("", toString(File));
> + for (auto kv : map) {
> + Symbol *sym = kv.first;
> + SetVector<InputFile *> &files = kv.second;
> +
> + print(toString(*sym), toString(sym->file));
> + for (InputFile *file : files)
> + if (file != sym->file)
> + print("", toString(file));
> }
> }
>
> Modified: lld/trunk/ELF/MarkLive.cpp
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_MarkLive.cpp-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=TrkJUpXOIQbq5R4KCX3iFy8_V5IK2MGUNU3rf5VYhQw&e=
>
> ==============================================================================
> --- lld/trunk/ELF/MarkLive.cpp (original)
> +++ lld/trunk/ELF/MarkLive.cpp Tue Jul 9 22:00:37 2019
> @@ -45,76 +45,76 @@ using namespace lld::elf;
> namespace {
> template <class ELFT> class MarkLive {
> public:
> - MarkLive(unsigned Partition) : Partition(Partition) {}
> + MarkLive(unsigned partition) : partition(partition) {}
>
> void run();
> void moveToMain();
>
> private:
> - void enqueue(InputSectionBase *Sec, uint64_t Offset);
> - void markSymbol(Symbol *Sym);
> + void enqueue(InputSectionBase *sec, uint64_t offset);
> + void markSymbol(Symbol *sym);
> void mark();
>
> template <class RelTy>
> - void resolveReloc(InputSectionBase &Sec, RelTy &Rel, bool IsLSDA);
> + void resolveReloc(InputSectionBase &sec, RelTy &rel, bool isLSDA);
>
> template <class RelTy>
> - void scanEhFrameSection(EhInputSection &EH, ArrayRef<RelTy> Rels);
> + void scanEhFrameSection(EhInputSection &eh, ArrayRef<RelTy> rels);
>
> // The index of the partition that we are currently processing.
> - unsigned Partition;
> + unsigned partition;
>
> // A list of sections to visit.
> - SmallVector<InputSection *, 256> Queue;
> + SmallVector<InputSection *, 256> queue;
>
> // There are normally few input sections whose names are valid C
> // identifiers, so we just store a std::vector instead of a
> multimap.
> - DenseMap<StringRef, std::vector<InputSectionBase *>> CNamedSections;
> + DenseMap<StringRef, std::vector<InputSectionBase *>> cNamedSections;
> };
> } // namespace
>
> template <class ELFT>
> -static uint64_t getAddend(InputSectionBase &Sec,
> - const typename ELFT::Rel &Rel) {
> - return Target->getImplicitAddend(Sec.data().begin() + Rel.r_offset,
> - Rel.getType(Config->IsMips64EL));
> +static uint64_t getAddend(InputSectionBase &sec,
> + const typename ELFT::Rel &rel) {
> + return target->getImplicitAddend(sec.data().begin() + rel.r_offset,
> + rel.getType(config->isMips64EL));
> }
>
> template <class ELFT>
> -static uint64_t getAddend(InputSectionBase &Sec,
> - const typename ELFT::Rela &Rel) {
> - return Rel.r_addend;
> +static uint64_t getAddend(InputSectionBase &sec,
> + const typename ELFT::Rela &rel) {
> + return rel.r_addend;
> }
>
> template <class ELFT>
> template <class RelTy>
> -void MarkLive<ELFT>::resolveReloc(InputSectionBase &Sec, RelTy &Rel,
> - bool IsLSDA) {
> - Symbol &Sym = Sec.getFile<ELFT>()->getRelocTargetSym(Rel);
> +void MarkLive<ELFT>::resolveReloc(InputSectionBase &sec, RelTy &rel,
> + bool isLSDA) {
> + Symbol &sym = sec.getFile<ELFT>()->getRelocTargetSym(rel);
>
> // If a symbol is referenced in a live section, it is used.
> - Sym.Used = true;
> + sym.used = true;
>
> - if (auto *D = dyn_cast<Defined>(&Sym)) {
> - auto *RelSec = dyn_cast_or_null<InputSectionBase>(D->Section);
> - if (!RelSec)
> + if (auto *d = dyn_cast<Defined>(&sym)) {
> + auto *relSec = dyn_cast_or_null<InputSectionBase>(d->section);
> + if (!relSec)
> return;
>
> - uint64_t Offset = D->Value;
> - if (D->isSection())
> - Offset += getAddend<ELFT>(Sec, Rel);
> + uint64_t offset = d->value;
> + if (d->isSection())
> + offset += getAddend<ELFT>(sec, rel);
>
> - if (!IsLSDA || !(RelSec->Flags & SHF_EXECINSTR))
> - enqueue(RelSec, Offset);
> + if (!isLSDA || !(relSec->flags & SHF_EXECINSTR))
> + enqueue(relSec, offset);
> return;
> }
>
> - if (auto *SS = dyn_cast<SharedSymbol>(&Sym))
> - if (!SS->isWeak())
> - SS->getFile().IsNeeded = true;
> + if (auto *ss = dyn_cast<SharedSymbol>(&sym))
> + if (!ss->isWeak())
> + ss->getFile().isNeeded = true;
>
> - for (InputSectionBase *Sec : CNamedSections.lookup(Sym.getName()))
> - enqueue(Sec, 0);
> + for (InputSectionBase *sec : cNamedSections.lookup(sym.getName()))
> + enqueue(sec, 0);
> }
>
> // The .eh_frame section is an unfortunate special case.
> @@ -133,80 +133,80 @@ void MarkLive<ELFT>::resolveReloc(InputS
> // LSDAs and personality functions if we found that they were unused.
> template <class ELFT>
> template <class RelTy>
> -void MarkLive<ELFT>::scanEhFrameSection(EhInputSection &EH,
> - ArrayRef<RelTy> Rels) {
> - for (size_t I = 0, End = EH.Pieces.size(); I < End; ++I) {
> - EhSectionPiece &Piece = EH.Pieces[I];
> - size_t FirstRelI = Piece.FirstRelocation;
> - if (FirstRelI == (unsigned)-1)
> +void MarkLive<ELFT>::scanEhFrameSection(EhInputSection &eh,
> + ArrayRef<RelTy> rels) {
> + for (size_t i = 0, end = eh.pieces.size(); i < end; ++i) {
> + EhSectionPiece &piece = eh.pieces[i];
> + size_t firstRelI = piece.firstRelocation;
> + if (firstRelI == (unsigned)-1)
> continue;
>
> - if (read32<ELFT::TargetEndianness>(Piece.data().data() + 4) == 0)
> {
> + if (read32<ELFT::TargetEndianness>(piece.data().data() + 4) == 0)
> {
> // This is a CIE, we only need to worry about the first
> relocation. It is
> // known to point to the personality function.
> - resolveReloc(EH, Rels[FirstRelI], false);
> + resolveReloc(eh, rels[firstRelI], false);
> continue;
> }
>
> // This is a FDE. The relocations point to the described function
> or to
> // a LSDA. We only need to keep the LSDA alive, so ignore
> anything that
> // points to executable sections.
> - uint64_t PieceEnd = Piece.InputOff + Piece.Size;
> - for (size_t J = FirstRelI, End2 = Rels.size(); J < End2; ++J)
> - if (Rels[J].r_offset < PieceEnd)
> - resolveReloc(EH, Rels[J], true);
> + uint64_t pieceEnd = piece.inputOff + piece.size;
> + for (size_t j = firstRelI, end2 = rels.size(); j < end2; ++j)
> + if (rels[j].r_offset < pieceEnd)
> + resolveReloc(eh, rels[j], true);
> }
> }
>
> // Some sections are used directly by the loader, so they should
> never be
> // garbage-collected. This function returns true if a given section
> is such
> // section.
> -static bool isReserved(InputSectionBase *Sec) {
> - switch (Sec->Type) {
> +static bool isReserved(InputSectionBase *sec) {
> + switch (sec->type) {
> case SHT_FINI_ARRAY:
> case SHT_INIT_ARRAY:
> case SHT_NOTE:
> case SHT_PREINIT_ARRAY:
> return true;
> default:
> - StringRef S = Sec->Name;
> - return S.startswith(".ctors") || S.startswith(".dtors") ||
> - S.startswith(".init") || S.startswith(".fini") ||
> - S.startswith(".jcr");
> + StringRef s = sec->name;
> + return s.startswith(".ctors") || s.startswith(".dtors") ||
> + s.startswith(".init") || s.startswith(".fini") ||
> + s.startswith(".jcr");
> }
> }
>
> template <class ELFT>
> -void MarkLive<ELFT>::enqueue(InputSectionBase *Sec, uint64_t Offset) {
> +void MarkLive<ELFT>::enqueue(InputSectionBase *sec, uint64_t offset) {
> // Skip over discarded sections. This in theory shouldn't happen,
> because
> // the ELF spec doesn't allow a relocation to point to a
> deduplicated
> // COMDAT section directly. Unfortunately this happens in practice
> (e.g.
> // .eh_frame) so we need to add a check.
> - if (Sec == &InputSection::Discarded)
> + if (sec == &InputSection::discarded)
> return;
>
> // Usually, a whole section is marked as live or dead, but in
> mergeable
> // (splittable) sections, each piece of data has independent
> liveness bit.
> // So we explicitly tell it which offset is in use.
> - if (auto *MS = dyn_cast<MergeInputSection>(Sec))
> - MS->getSectionPiece(Offset)->Live = true;
> + if (auto *ms = dyn_cast<MergeInputSection>(sec))
> + ms->getSectionPiece(offset)->live = true;
>
> // Set Sec->Partition to the meet (i.e. the "minimum") of Partition
> and
> // Sec->Partition in the following lattice: 1 < other < 0. If
> Sec->Partition
> // doesn't change, we don't need to do anything.
> - if (Sec->Partition == 1 || Sec->Partition == Partition)
> + if (sec->partition == 1 || sec->partition == partition)
> return;
> - Sec->Partition = Sec->Partition ? 1 : Partition;
> + sec->partition = sec->partition ? 1 : partition;
>
> // Add input section to the queue.
> - if (InputSection *S = dyn_cast<InputSection>(Sec))
> - Queue.push_back(S);
> + if (InputSection *s = dyn_cast<InputSection>(sec))
> + queue.push_back(s);
> }
>
> -template <class ELFT> void MarkLive<ELFT>::markSymbol(Symbol *Sym) {
> - if (auto *D = dyn_cast_or_null<Defined>(Sym))
> - if (auto *IS = dyn_cast_or_null<InputSectionBase>(D->Section))
> - enqueue(IS, D->Value);
> +template <class ELFT> void MarkLive<ELFT>::markSymbol(Symbol *sym) {
> + if (auto *d = dyn_cast_or_null<Defined>(sym))
> + if (auto *isec = dyn_cast_or_null<InputSectionBase>(d->section))
> + enqueue(isec, d->value);
> }
>
> // This is the main function of the garbage collector.
> @@ -217,51 +217,51 @@ template <class ELFT> void MarkLive<ELFT
>
> // Preserve externally-visible symbols if the symbols defined by
> this
> // file can interrupt other ELF file's symbols at runtime.
> - Symtab->forEachSymbol([&](Symbol *Sym) {
> - if (Sym->includeInDynsym() && Sym->Partition == Partition)
> - markSymbol(Sym);
> + symtab->forEachSymbol([&](Symbol *sym) {
> + if (sym->includeInDynsym() && sym->partition == partition)
> + markSymbol(sym);
> });
>
> // If this isn't the main partition, that's all that we need to
> preserve.
> - if (Partition != 1) {
> + if (partition != 1) {
> mark();
> return;
> }
>
> - markSymbol(Symtab->find(Config->Entry));
> - markSymbol(Symtab->find(Config->Init));
> - markSymbol(Symtab->find(Config->Fini));
> - for (StringRef S : Config->Undefined)
> - markSymbol(Symtab->find(S));
> - for (StringRef S : Script->ReferencedSymbols)
> - markSymbol(Symtab->find(S));
> + markSymbol(symtab->find(config->entry));
> + markSymbol(symtab->find(config->init));
> + markSymbol(symtab->find(config->fini));
> + for (StringRef s : config->undefined)
> + markSymbol(symtab->find(s));
> + for (StringRef s : script->referencedSymbols)
> + markSymbol(symtab->find(s));
>
> // Preserve special sections and those which are specified in linker
> // script KEEP command.
> - for (InputSectionBase *Sec : InputSections) {
> + for (InputSectionBase *sec : inputSections) {
> // Mark .eh_frame sections as live because there are usually no
> relocations
> // that point to .eh_frames. Otherwise, the garbage collector
> would drop
> // all of them. We also want to preserve personality routines and
> LSDA
> // referenced by .eh_frame sections, so we scan them for that
> here.
> - if (auto *EH = dyn_cast<EhInputSection>(Sec)) {
> - EH->markLive();
> - if (!EH->NumRelocations)
> + if (auto *eh = dyn_cast<EhInputSection>(sec)) {
> + eh->markLive();
> + if (!eh->numRelocations)
> continue;
>
> - if (EH->AreRelocsRela)
> - scanEhFrameSection(*EH, EH->template relas<ELFT>());
> + if (eh->areRelocsRela)
> + scanEhFrameSection(*eh, eh->template relas<ELFT>());
> else
> - scanEhFrameSection(*EH, EH->template rels<ELFT>());
> + scanEhFrameSection(*eh, eh->template rels<ELFT>());
> }
>
> - if (Sec->Flags & SHF_LINK_ORDER)
> + if (sec->flags & SHF_LINK_ORDER)
> continue;
>
> - if (isReserved(Sec) || Script->shouldKeep(Sec)) {
> - enqueue(Sec, 0);
> - } else if (isValidCIdentifier(Sec->Name)) {
> - CNamedSections[Saver.save("__start_" +
> Sec->Name)].push_back(Sec);
> - CNamedSections[Saver.save("__stop_" +
> Sec->Name)].push_back(Sec);
> + if (isReserved(sec) || script->shouldKeep(sec)) {
> + enqueue(sec, 0);
> + } else if (isValidCIdentifier(sec->name)) {
> + cNamedSections[Saver.save("__start_" +
> sec->name)].push_back(sec);
> + cNamedSections[Saver.save("__stop_" +
> sec->name)].push_back(sec);
> }
> }
>
> @@ -270,19 +270,19 @@ template <class ELFT> void MarkLive<ELFT
>
> template <class ELFT> void MarkLive<ELFT>::mark() {
> // Mark all reachable sections.
> - while (!Queue.empty()) {
> - InputSectionBase &Sec = *Queue.pop_back_val();
> + while (!queue.empty()) {
> + InputSectionBase &sec = *queue.pop_back_val();
>
> - if (Sec.AreRelocsRela) {
> - for (const typename ELFT::Rela &Rel : Sec.template
> relas<ELFT>())
> - resolveReloc(Sec, Rel, false);
> + if (sec.areRelocsRela) {
> + for (const typename ELFT::Rela &rel : sec.template
> relas<ELFT>())
> + resolveReloc(sec, rel, false);
> } else {
> - for (const typename ELFT::Rel &Rel : Sec.template rels<ELFT>())
> - resolveReloc(Sec, Rel, false);
> + for (const typename ELFT::Rel &rel : sec.template rels<ELFT>())
> + resolveReloc(sec, rel, false);
> }
>
> - for (InputSectionBase *IS : Sec.DependentSections)
> - enqueue(IS, 0);
> + for (InputSectionBase *isec : sec.dependentSections)
> + enqueue(isec, 0);
> }
> }
>
> @@ -292,12 +292,12 @@ template <class ELFT> void MarkLive<ELFT
> // loaded) and TLS symbols (because we only know how to correctly
> process TLS
> // relocations for the main partition).
> template <class ELFT> void MarkLive<ELFT>::moveToMain() {
> - for (InputFile *File : ObjectFiles)
> - for (Symbol *S : File->getSymbols())
> - if (auto *D = dyn_cast<Defined>(S))
> - if ((D->Type == STT_GNU_IFUNC || D->Type == STT_TLS) &&
> D->Section &&
> - D->Section->isLive())
> - markSymbol(S);
> + for (InputFile *file : objectFiles)
> + for (Symbol *s : file->getSymbols())
> + if (auto *d = dyn_cast<Defined>(s))
> + if ((d->type == STT_GNU_IFUNC || d->type == STT_TLS) &&
> d->section &&
> + d->section->isLive())
> + markSymbol(s);
>
> mark();
> }
> @@ -307,15 +307,15 @@ template <class ELFT> void MarkLive<ELFT
> // so that they are emitted to the output file.
> template <class ELFT> void elf::markLive() {
> // If -gc-sections is not given, no sections are removed.
> - if (!Config->GcSections) {
> - for (InputSectionBase *Sec : InputSections)
> - Sec->markLive();
> + if (!config->gcSections) {
> + for (InputSectionBase *sec : inputSections)
> + sec->markLive();
>
> // If a DSO defines a symbol referenced in a regular object, it
> is needed.
> - Symtab->forEachSymbol([](Symbol *Sym) {
> - if (auto *S = dyn_cast<SharedSymbol>(Sym))
> - if (S->IsUsedInRegularObj && !S->isWeak())
> - S->getFile().IsNeeded = true;
> + symtab->forEachSymbol([](Symbol *sym) {
> + if (auto *s = dyn_cast<SharedSymbol>(sym))
> + if (s->isUsedInRegularObj && !s->isWeak())
> + s->getFile().isNeeded = true;
> });
> return;
> }
> @@ -341,30 +341,30 @@ template <class ELFT> void elf::markLive
> // or -emit-reloc were given. And they are subject of garbage
> // collection because, if we remove a text section, we also
> // remove its relocation section.
> - for (InputSectionBase *Sec : InputSections) {
> - bool IsAlloc = (Sec->Flags & SHF_ALLOC);
> - bool IsLinkOrder = (Sec->Flags & SHF_LINK_ORDER);
> - bool IsRel = (Sec->Type == SHT_REL || Sec->Type == SHT_RELA);
> + for (InputSectionBase *sec : inputSections) {
> + bool isAlloc = (sec->flags & SHF_ALLOC);
> + bool isLinkOrder = (sec->flags & SHF_LINK_ORDER);
> + bool isRel = (sec->type == SHT_REL || sec->type == SHT_RELA);
>
> - if (!IsAlloc && !IsLinkOrder && !IsRel)
> - Sec->markLive();
> + if (!isAlloc && !isLinkOrder && !isRel)
> + sec->markLive();
> }
>
> // Follow the graph to mark all live sections.
> - for (unsigned CurPart = 1; CurPart <= Partitions.size(); ++CurPart)
> - MarkLive<ELFT>(CurPart).run();
> + for (unsigned curPart = 1; curPart <= partitions.size(); ++curPart)
> + MarkLive<ELFT>(curPart).run();
>
> // If we have multiple partitions, some sections need to live in
> the main
> // partition even if they were allocated to a loadable partition.
> Move them
> // there now.
> - if (Partitions.size() != 1)
> + if (partitions.size() != 1)
> MarkLive<ELFT>(1).moveToMain();
>
> // Report garbage-collected sections.
> - if (Config->PrintGcSections)
> - for (InputSectionBase *Sec : InputSections)
> - if (!Sec->isLive())
> - message("removing unused section " + toString(Sec));
> + if (config->printGcSections)
> + for (InputSectionBase *sec : inputSections)
> + if (!sec->isLive())
> + message("removing unused section " + toString(sec));
> }
>
> template void elf::markLive<ELF32LE>();
>
> Modified: lld/trunk/ELF/OutputSections.cpp
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_OutputSections.cpp-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=UVTokxJaAliERGw5ZRPaBQW2iLQTkwBdSYMAbkicE8g&e=
>
> ==============================================================================
> --- lld/trunk/ELF/OutputSections.cpp (original)
> +++ lld/trunk/ELF/OutputSections.cpp Tue Jul 9 22:00:37 2019
> @@ -30,45 +30,45 @@ using namespace llvm::ELF;
> using namespace lld;
> using namespace lld::elf;
>
> -uint8_t *Out::BufferStart;
> -uint8_t Out::First;
> -PhdrEntry *Out::TlsPhdr;
> -OutputSection *Out::ElfHeader;
> -OutputSection *Out::ProgramHeaders;
> -OutputSection *Out::PreinitArray;
> -OutputSection *Out::InitArray;
> -OutputSection *Out::FiniArray;
> +uint8_t *Out::bufferStart;
> +uint8_t Out::first;
> +PhdrEntry *Out::tlsPhdr;
> +OutputSection *Out::elfHeader;
> +OutputSection *Out::programHeaders;
> +OutputSection *Out::preinitArray;
> +OutputSection *Out::initArray;
> +OutputSection *Out::finiArray;
>
> -std::vector<OutputSection *> elf::OutputSections;
> +std::vector<OutputSection *> elf::outputSections;
>
> uint32_t OutputSection::getPhdrFlags() const {
> - uint32_t Ret = 0;
> - if (Config->EMachine != EM_ARM || !(Flags & SHF_ARM_PURECODE))
> - Ret |= PF_R;
> - if (Flags & SHF_WRITE)
> - Ret |= PF_W;
> - if (Flags & SHF_EXECINSTR)
> - Ret |= PF_X;
> - return Ret;
> + uint32_t ret = 0;
> + if (config->emachine != EM_ARM || !(flags & SHF_ARM_PURECODE))
> + ret |= PF_R;
> + if (flags & SHF_WRITE)
> + ret |= PF_W;
> + if (flags & SHF_EXECINSTR)
> + ret |= PF_X;
> + return ret;
> }
>
> template <class ELFT>
> -void OutputSection::writeHeaderTo(typename ELFT::Shdr *Shdr) {
> - Shdr->sh_entsize = Entsize;
> - Shdr->sh_addralign = Alignment;
> - Shdr->sh_type = Type;
> - Shdr->sh_offset = Offset;
> - Shdr->sh_flags = Flags;
> - Shdr->sh_info = Info;
> - Shdr->sh_link = Link;
> - Shdr->sh_addr = Addr;
> - Shdr->sh_size = Size;
> - Shdr->sh_name = ShName;
> +void OutputSection::writeHeaderTo(typename ELFT::Shdr *shdr) {
> + shdr->sh_entsize = entsize;
> + shdr->sh_addralign = alignment;
> + shdr->sh_type = type;
> + shdr->sh_offset = offset;
> + shdr->sh_flags = flags;
> + shdr->sh_info = info;
> + shdr->sh_link = link;
> + shdr->sh_addr = addr;
> + shdr->sh_size = size;
> + shdr->sh_name = shName;
> }
>
> -OutputSection::OutputSection(StringRef Name, uint32_t Type, uint64_t
> Flags)
> +OutputSection::OutputSection(StringRef name, uint32_t type, uint64_t
> flags)
> : BaseCommand(OutputSectionKind),
> - SectionBase(Output, Name, Flags, /*Entsize*/ 0, /*Alignment*/
> 1, Type,
> + SectionBase(Output, name, flags, /*Entsize*/ 0, /*Alignment*/
> 1, type,
> /*Info*/ 0, /*Link*/ 0) {}
>
> // We allow sections of types listed below to merged into a
> @@ -77,102 +77,102 @@ OutputSection::OutputSection(StringRef N
> // to be allocated for nobits sections. Other ones don't require
> // any special treatment on top of progbits, so there doesn't
> // seem to be a harm in merging them.
> -static bool canMergeToProgbits(unsigned Type) {
> - return Type == SHT_NOBITS || Type == SHT_PROGBITS || Type ==
> SHT_INIT_ARRAY ||
> - Type == SHT_PREINIT_ARRAY || Type == SHT_FINI_ARRAY ||
> - Type == SHT_NOTE;
> +static bool canMergeToProgbits(unsigned type) {
> + return type == SHT_NOBITS || type == SHT_PROGBITS || type ==
> SHT_INIT_ARRAY ||
> + type == SHT_PREINIT_ARRAY || type == SHT_FINI_ARRAY ||
> + type == SHT_NOTE;
> }
>
> -void OutputSection::addSection(InputSection *IS) {
> - if (!HasInputSections) {
> +void OutputSection::addSection(InputSection *isec) {
> + if (!hasInputSections) {
> // If IS is the first section to be added to this section,
> // initialize Partition, Type, Entsize and flags from IS.
> - HasInputSections = true;
> - Partition = IS->Partition;
> - Type = IS->Type;
> - Entsize = IS->Entsize;
> - Flags = IS->Flags;
> + hasInputSections = true;
> + partition = isec->partition;
> + type = isec->type;
> + entsize = isec->entsize;
> + flags = isec->flags;
> } else {
> // Otherwise, check if new type or flags are compatible with
> existing ones.
> - unsigned Mask = SHF_TLS | SHF_LINK_ORDER;
> - if ((Flags & Mask) != (IS->Flags & Mask))
> - error("incompatible section flags for " + Name + "\n>>> " +
> toString(IS) +
> - ": 0x" + utohexstr(IS->Flags) + "\n>>> output section " +
> Name +
> - ": 0x" + utohexstr(Flags));
> -
> - if (Type != IS->Type) {
> - if (!canMergeToProgbits(Type) || !canMergeToProgbits(IS->Type))
> - error("section type mismatch for " + IS->Name + "\n>>> " +
> - toString(IS) + ": " +
> - getELFSectionTypeName(Config->EMachine, IS->Type) +
> - "\n>>> output section " + Name + ": " +
> - getELFSectionTypeName(Config->EMachine, Type));
> - Type = SHT_PROGBITS;
> + unsigned mask = SHF_TLS | SHF_LINK_ORDER;
> + if ((flags & mask) != (isec->flags & mask))
> + error("incompatible section flags for " + name + "\n>>> " +
> toString(isec) +
> + ": 0x" + utohexstr(isec->flags) + "\n>>> output section "
> + name +
> + ": 0x" + utohexstr(flags));
> +
> + if (type != isec->type) {
> + if (!canMergeToProgbits(type) ||
> !canMergeToProgbits(isec->type))
> + error("section type mismatch for " + isec->name + "\n>>> " +
> + toString(isec) + ": " +
> + getELFSectionTypeName(config->emachine, isec->type) +
> + "\n>>> output section " + name + ": " +
> + getELFSectionTypeName(config->emachine, type));
> + type = SHT_PROGBITS;
> }
> }
>
> - IS->Parent = this;
> - uint64_t AndMask =
> - Config->EMachine == EM_ARM ? (uint64_t)SHF_ARM_PURECODE : 0;
> - uint64_t OrMask = ~AndMask;
> - uint64_t AndFlags = (Flags & IS->Flags) & AndMask;
> - uint64_t OrFlags = (Flags | IS->Flags) & OrMask;
> - Flags = AndFlags | OrFlags;
> + isec->parent = this;
> + uint64_t andMask =
> + config->emachine == EM_ARM ? (uint64_t)SHF_ARM_PURECODE : 0;
> + uint64_t orMask = ~andMask;
> + uint64_t andFlags = (flags & isec->flags) & andMask;
> + uint64_t orFlags = (flags | isec->flags) & orMask;
> + flags = andFlags | orFlags;
>
> - Alignment = std::max(Alignment, IS->Alignment);
> + alignment = std::max(alignment, isec->alignment);
>
> // If this section contains a table of fixed-size entries,
> sh_entsize
> // holds the element size. If it contains elements of different
> size we
> // set sh_entsize to 0.
> - if (Entsize != IS->Entsize)
> - Entsize = 0;
> + if (entsize != isec->entsize)
> + entsize = 0;
>
> - if (!IS->Assigned) {
> - IS->Assigned = true;
> - if (SectionCommands.empty() ||
> - !isa<InputSectionDescription>(SectionCommands.back()))
> - SectionCommands.push_back(make<InputSectionDescription>(""));
> - auto *ISD = cast<InputSectionDescription>(SectionCommands.back());
> - ISD->Sections.push_back(IS);
> + if (!isec->assigned) {
> + isec->assigned = true;
> + if (sectionCommands.empty() ||
> + !isa<InputSectionDescription>(sectionCommands.back()))
> + sectionCommands.push_back(make<InputSectionDescription>(""));
> + auto *isd = cast<InputSectionDescription>(sectionCommands.back());
> + isd->sections.push_back(isec);
> }
> }
>
> -static void sortByOrder(MutableArrayRef<InputSection *> In,
> - llvm::function_ref<int(InputSectionBase *S)>
> Order) {
> - std::vector<std::pair<int, InputSection *>> V;
> - for (InputSection *S : In)
> - V.push_back({Order(S), S});
> - llvm::stable_sort(V, less_first());
> +static void sortByOrder(MutableArrayRef<InputSection *> in,
> + llvm::function_ref<int(InputSectionBase *s)>
> order) {
> + std::vector<std::pair<int, InputSection *>> v;
> + for (InputSection *s : in)
> + v.push_back({order(s), s});
> + llvm::stable_sort(v, less_first());
>
> - for (size_t I = 0; I < V.size(); ++I)
> - In[I] = V[I].second;
> + for (size_t i = 0; i < v.size(); ++i)
> + in[i] = v[i].second;
> }
>
> uint64_t elf::getHeaderSize() {
> - if (Config->OFormatBinary)
> + if (config->oFormatBinary)
> return 0;
> - return Out::ElfHeader->Size + Out::ProgramHeaders->Size;
> + return Out::elfHeader->size + Out::programHeaders->size;
> }
>
> -bool OutputSection::classof(const BaseCommand *C) {
> - return C->Kind == OutputSectionKind;
> +bool OutputSection::classof(const BaseCommand *c) {
> + return c->kind == OutputSectionKind;
> }
>
> -void OutputSection::sort(llvm::function_ref<int(InputSectionBase *S)>
> Order) {
> +void OutputSection::sort(llvm::function_ref<int(InputSectionBase *s)>
> order) {
> assert(isLive());
> - for (BaseCommand *B : SectionCommands)
> - if (auto *ISD = dyn_cast<InputSectionDescription>(B))
> - sortByOrder(ISD->Sections, Order);
> + for (BaseCommand *b : sectionCommands)
> + if (auto *isd = dyn_cast<InputSectionDescription>(b))
> + sortByOrder(isd->sections, order);
> }
>
> // Fill [Buf, Buf + Size) with Filler.
> // This is used for linker script "=fillexp" command.
> -static void fill(uint8_t *Buf, size_t Size,
> - const std::array<uint8_t, 4> &Filler) {
> - size_t I = 0;
> - for (; I + 4 < Size; I += 4)
> - memcpy(Buf + I, Filler.data(), 4);
> - memcpy(Buf + I, Filler.data(), Size - I);
> +static void fill(uint8_t *buf, size_t size,
> + const std::array<uint8_t, 4> &filler) {
> + size_t i = 0;
> + for (; i + 4 < size; i += 4)
> + memcpy(buf + i, filler.data(), 4);
> + memcpy(buf + i, filler.data(), size - i);
> }
>
> // Compress section contents if this section contains debug info.
> @@ -180,145 +180,145 @@ template <class ELFT> void OutputSection
> using Elf_Chdr = typename ELFT::Chdr;
>
> // Compress only DWARF debug sections.
> - if (!Config->CompressDebugSections || (Flags & SHF_ALLOC) ||
> - !Name.startswith(".debug_"))
> + if (!config->compressDebugSections || (flags & SHF_ALLOC) ||
> + !name.startswith(".debug_"))
> return;
>
> // Create a section header.
> - ZDebugHeader.resize(sizeof(Elf_Chdr));
> - auto *Hdr = reinterpret_cast<Elf_Chdr *>(ZDebugHeader.data());
> - Hdr->ch_type = ELFCOMPRESS_ZLIB;
> - Hdr->ch_size = Size;
> - Hdr->ch_addralign = Alignment;
> + zDebugHeader.resize(sizeof(Elf_Chdr));
> + auto *hdr = reinterpret_cast<Elf_Chdr *>(zDebugHeader.data());
> + hdr->ch_type = ELFCOMPRESS_ZLIB;
> + hdr->ch_size = size;
> + hdr->ch_addralign = alignment;
>
> // Write section contents to a temporary buffer and compress it.
> - std::vector<uint8_t> Buf(Size);
> - writeTo<ELFT>(Buf.data());
> - if (Error E = zlib::compress(toStringRef(Buf), CompressedData))
> - fatal("compress failed: " + llvm::toString(std::move(E)));
> + std::vector<uint8_t> buf(size);
> + writeTo<ELFT>(buf.data());
> + if (Error e = zlib::compress(toStringRef(buf), compressedData))
> + fatal("compress failed: " + llvm::toString(std::move(e)));
>
> // Update section headers.
> - Size = sizeof(Elf_Chdr) + CompressedData.size();
> - Flags |= SHF_COMPRESSED;
> + size = sizeof(Elf_Chdr) + compressedData.size();
> + flags |= SHF_COMPRESSED;
> }
>
> -static void writeInt(uint8_t *Buf, uint64_t Data, uint64_t Size) {
> - if (Size == 1)
> - *Buf = Data;
> - else if (Size == 2)
> - write16(Buf, Data);
> - else if (Size == 4)
> - write32(Buf, Data);
> - else if (Size == 8)
> - write64(Buf, Data);
> +static void writeInt(uint8_t *buf, uint64_t data, uint64_t size) {
> + if (size == 1)
> + *buf = data;
> + else if (size == 2)
> + write16(buf, data);
> + else if (size == 4)
> + write32(buf, data);
> + else if (size == 8)
> + write64(buf, data);
> else
> llvm_unreachable("unsupported Size argument");
> }
>
> -template <class ELFT> void OutputSection::writeTo(uint8_t *Buf) {
> - if (Type == SHT_NOBITS)
> +template <class ELFT> void OutputSection::writeTo(uint8_t *buf) {
> + if (type == SHT_NOBITS)
> return;
>
> // If -compress-debug-section is specified and if this is a debug
> seciton,
> // we've already compressed section contents. If that's the case,
> // just write it down.
> - if (!CompressedData.empty()) {
> - memcpy(Buf, ZDebugHeader.data(), ZDebugHeader.size());
> - memcpy(Buf + ZDebugHeader.size(), CompressedData.data(),
> - CompressedData.size());
> + if (!compressedData.empty()) {
> + memcpy(buf, zDebugHeader.data(), zDebugHeader.size());
> + memcpy(buf + zDebugHeader.size(), compressedData.data(),
> + compressedData.size());
> return;
> }
>
> // Write leading padding.
> - std::vector<InputSection *> Sections = getInputSections(this);
> - std::array<uint8_t, 4> Filler = getFiller();
> - bool NonZeroFiller = read32(Filler.data()) != 0;
> - if (NonZeroFiller)
> - fill(Buf, Sections.empty() ? Size : Sections[0]->OutSecOff,
> Filler);
> -
> - parallelForEachN(0, Sections.size(), [&](size_t I) {
> - InputSection *IS = Sections[I];
> - IS->writeTo<ELFT>(Buf);
> + std::vector<InputSection *> sections = getInputSections(this);
> + std::array<uint8_t, 4> filler = getFiller();
> + bool nonZeroFiller = read32(filler.data()) != 0;
> + if (nonZeroFiller)
> + fill(buf, sections.empty() ? size : sections[0]->outSecOff,
> filler);
> +
> + parallelForEachN(0, sections.size(), [&](size_t i) {
> + InputSection *isec = sections[i];
> + isec->writeTo<ELFT>(buf);
>
> // Fill gaps between sections.
> - if (NonZeroFiller) {
> - uint8_t *Start = Buf + IS->OutSecOff + IS->getSize();
> - uint8_t *End;
> - if (I + 1 == Sections.size())
> - End = Buf + Size;
> + if (nonZeroFiller) {
> + uint8_t *start = buf + isec->outSecOff + isec->getSize();
> + uint8_t *end;
> + if (i + 1 == sections.size())
> + end = buf + size;
> else
> - End = Buf + Sections[I + 1]->OutSecOff;
> - fill(Start, End - Start, Filler);
> + end = buf + sections[i + 1]->outSecOff;
> + fill(start, end - start, filler);
> }
> });
>
> // Linker scripts may have BYTE()-family commands with which you
> // can write arbitrary bytes to the output. Process them if any.
> - for (BaseCommand *Base : SectionCommands)
> - if (auto *Data = dyn_cast<ByteCommand>(Base))
> - writeInt(Buf + Data->Offset, Data->Expression().getValue(),
> Data->Size);
> + for (BaseCommand *base : sectionCommands)
> + if (auto *data = dyn_cast<ByteCommand>(base))
> + writeInt(buf + data->offset, data->expression().getValue(),
> data->size);
> }
>
> -static void finalizeShtGroup(OutputSection *OS,
> - InputSection *Section) {
> - assert(Config->Relocatable);
> +static void finalizeShtGroup(OutputSection *os,
> + InputSection *section) {
> + assert(config->relocatable);
>
> // sh_link field for SHT_GROUP sections should contain the section
> index of
> // the symbol table.
> - OS->Link = In.SymTab->getParent()->SectionIndex;
> + os->link = in.symTab->getParent()->sectionIndex;
>
> // sh_info then contain index of an entry in symbol table section
> which
> // provides signature of the section group.
> - ArrayRef<Symbol *> Symbols = Section->File->getSymbols();
> - OS->Info = In.SymTab->getSymbolIndex(Symbols[Section->Info]);
> + ArrayRef<Symbol *> symbols = section->file->getSymbols();
> + os->info = in.symTab->getSymbolIndex(symbols[section->info]);
> }
>
> void OutputSection::finalize() {
> - std::vector<InputSection *> V = getInputSections(this);
> - InputSection *First = V.empty() ? nullptr : V[0];
> + std::vector<InputSection *> v = getInputSections(this);
> + InputSection *first = v.empty() ? nullptr : v[0];
>
> - if (Flags & SHF_LINK_ORDER) {
> + if (flags & SHF_LINK_ORDER) {
> // We must preserve the link order dependency of sections with the
> // SHF_LINK_ORDER flag. The dependency is indicated by the
> sh_link field. We
> // need to translate the InputSection sh_link to the
> OutputSection sh_link,
> // all InputSections in the OutputSection have the same
> dependency.
> - if (auto *EX = dyn_cast<ARMExidxSyntheticSection>(First))
> - Link = EX->getLinkOrderDep()->getParent()->SectionIndex;
> - else if (auto *D = First->getLinkOrderDep())
> - Link = D->getParent()->SectionIndex;
> + if (auto *ex = dyn_cast<ARMExidxSyntheticSection>(first))
> + link = ex->getLinkOrderDep()->getParent()->sectionIndex;
> + else if (auto *d = first->getLinkOrderDep())
> + link = d->getParent()->sectionIndex;
> }
>
> - if (Type == SHT_GROUP) {
> - finalizeShtGroup(this, First);
> + if (type == SHT_GROUP) {
> + finalizeShtGroup(this, first);
> return;
> }
>
> - if (!Config->CopyRelocs || (Type != SHT_RELA && Type != SHT_REL))
> + if (!config->copyRelocs || (type != SHT_RELA && type != SHT_REL))
> return;
>
> - if (isa<SyntheticSection>(First))
> + if (isa<SyntheticSection>(first))
> return;
>
> - Link = In.SymTab->getParent()->SectionIndex;
> + link = in.symTab->getParent()->sectionIndex;
> // sh_info for SHT_REL[A] sections should contain the section
> header index of
> // the section to which the relocation applies.
> - InputSectionBase *S = First->getRelocatedSection();
> - Info = S->getOutputSection()->SectionIndex;
> - Flags |= SHF_INFO_LINK;
> + InputSectionBase *s = first->getRelocatedSection();
> + info = s->getOutputSection()->sectionIndex;
> + flags |= SHF_INFO_LINK;
> }
>
> // Returns true if S matches /Filename.?\.o$/.
> -static bool isCrtBeginEnd(StringRef S, StringRef Filename) {
> - if (!S.endswith(".o"))
> +static bool isCrtBeginEnd(StringRef s, StringRef filename) {
> + if (!s.endswith(".o"))
> return false;
> - S = S.drop_back(2);
> - if (S.endswith(Filename))
> + s = s.drop_back(2);
> + if (s.endswith(filename))
> return true;
> - return !S.empty() && S.drop_back().endswith(Filename);
> + return !s.empty() && s.drop_back().endswith(filename);
> }
>
> -static bool isCrtbegin(StringRef S) { return isCrtBeginEnd(S,
> "crtbegin"); }
> -static bool isCrtend(StringRef S) { return isCrtBeginEnd(S,
> "crtend"); }
> +static bool isCrtbegin(StringRef s) { return isCrtBeginEnd(s,
> "crtbegin"); }
> +static bool isCrtend(StringRef s) { return isCrtBeginEnd(s,
> "crtend"); }
>
> // .ctors and .dtors are sorted by this priority from highest to
> lowest.
> //
> @@ -338,52 +338,52 @@ static bool isCrtend(StringRef S) { retu
> // .ctors are duplicate features (and .init_array is newer.) However,
> there
> // are too many real-world use cases of .ctors, so we had no choice to
> // support that with this rather ad-hoc semantics.
> -static bool compCtors(const InputSection *A, const InputSection *B) {
> - bool BeginA = isCrtbegin(A->File->getName());
> - bool BeginB = isCrtbegin(B->File->getName());
> - if (BeginA != BeginB)
> - return BeginA;
> - bool EndA = isCrtend(A->File->getName());
> - bool EndB = isCrtend(B->File->getName());
> - if (EndA != EndB)
> - return EndB;
> - StringRef X = A->Name;
> - StringRef Y = B->Name;
> - assert(X.startswith(".ctors") || X.startswith(".dtors"));
> - assert(Y.startswith(".ctors") || Y.startswith(".dtors"));
> - X = X.substr(6);
> - Y = Y.substr(6);
> - return X < Y;
> +static bool compCtors(const InputSection *a, const InputSection *b) {
> + bool beginA = isCrtbegin(a->file->getName());
> + bool beginB = isCrtbegin(b->file->getName());
> + if (beginA != beginB)
> + return beginA;
> + bool endA = isCrtend(a->file->getName());
> + bool endB = isCrtend(b->file->getName());
> + if (endA != endB)
> + return endB;
> + StringRef x = a->name;
> + StringRef y = b->name;
> + assert(x.startswith(".ctors") || x.startswith(".dtors"));
> + assert(y.startswith(".ctors") || y.startswith(".dtors"));
> + x = x.substr(6);
> + y = y.substr(6);
> + return x < y;
> }
>
> // Sorts input sections by the special rules for .ctors and .dtors.
> // Unfortunately, the rules are different from the one for
> .{init,fini}_array.
> // Read the comment above.
> void OutputSection::sortCtorsDtors() {
> - assert(SectionCommands.size() == 1);
> - auto *ISD = cast<InputSectionDescription>(SectionCommands[0]);
> - llvm::stable_sort(ISD->Sections, compCtors);
> + assert(sectionCommands.size() == 1);
> + auto *isd = cast<InputSectionDescription>(sectionCommands[0]);
> + llvm::stable_sort(isd->sections, compCtors);
> }
>
> // If an input string is in the form of "foo.N" where N is a number,
> // return N. Otherwise, returns 65536, which is one greater than the
> // lowest priority.
> -int elf::getPriority(StringRef S) {
> - size_t Pos = S.rfind('.');
> - if (Pos == StringRef::npos)
> +int elf::getPriority(StringRef s) {
> + size_t pos = s.rfind('.');
> + if (pos == StringRef::npos)
> return 65536;
> - int V;
> - if (!to_integer(S.substr(Pos + 1), V, 10))
> + int v;
> + if (!to_integer(s.substr(pos + 1), v, 10))
> return 65536;
> - return V;
> + return v;
> }
>
> -std::vector<InputSection *> elf::getInputSections(OutputSection *OS) {
> - std::vector<InputSection *> Ret;
> - for (BaseCommand *Base : OS->SectionCommands)
> - if (auto *ISD = dyn_cast<InputSectionDescription>(Base))
> - Ret.insert(Ret.end(), ISD->Sections.begin(),
> ISD->Sections.end());
> - return Ret;
> +std::vector<InputSection *> elf::getInputSections(OutputSection *os) {
> + std::vector<InputSection *> ret;
> + for (BaseCommand *base : os->sectionCommands)
> + if (auto *isd = dyn_cast<InputSectionDescription>(base))
> + ret.insert(ret.end(), isd->sections.begin(),
> isd->sections.end());
> + return ret;
> }
>
> // Sorts input sections by section name suffixes, so that .foo.N comes
> @@ -394,14 +394,14 @@ std::vector<InputSection *> elf::getInpu
> // For more detail, read the section of the GCC's manual about
> init_priority.
> void OutputSection::sortInitFini() {
> // Sort sections by priority.
> - sort([](InputSectionBase *S) { return getPriority(S->Name); });
> + sort([](InputSectionBase *s) { return getPriority(s->name); });
> }
>
> std::array<uint8_t, 4> OutputSection::getFiller() {
> - if (Filler)
> - return *Filler;
> - if (Flags & SHF_EXECINSTR)
> - return Target->TrapInstr;
> + if (filler)
> + return *filler;
> + if (flags & SHF_EXECINSTR)
> + return target->trapInstr;
> return {0, 0, 0, 0};
> }
>
>
> Modified: lld/trunk/ELF/OutputSections.h
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_OutputSections.h-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=0sg9eJvrxwt0wJYHYKYKhDpKWMqW3dpgnzaSoVSdGtk&e=
>
> ==============================================================================
> --- lld/trunk/ELF/OutputSections.h (original)
> +++ lld/trunk/ELF/OutputSections.h Tue Jul 9 22:00:37 2019
> @@ -31,19 +31,19 @@ class InputSectionBase;
> // non-overlapping file offsets and VAs.
> class OutputSection final : public BaseCommand, public SectionBase {
> public:
> - OutputSection(StringRef Name, uint32_t Type, uint64_t Flags);
> + OutputSection(StringRef name, uint32_t type, uint64_t flags);
>
> - static bool classof(const SectionBase *S) {
> - return S->kind() == SectionBase::Output;
> + static bool classof(const SectionBase *s) {
> + return s->kind() == SectionBase::Output;
> }
>
> - static bool classof(const BaseCommand *C);
> + static bool classof(const BaseCommand *c);
>
> - uint64_t getLMA() const { return PtLoad ? Addr + PtLoad->LMAOffset
> : Addr; }
> - template <typename ELFT> void writeHeaderTo(typename ELFT::Shdr
> *SHdr);
> + uint64_t getLMA() const { return ptLoad ? addr + ptLoad->lmaOffset
> : addr; }
> + template <typename ELFT> void writeHeaderTo(typename ELFT::Shdr
> *sHdr);
>
> - uint32_t SectionIndex = UINT32_MAX;
> - unsigned SortRank;
> + uint32_t sectionIndex = UINT32_MAX;
> + unsigned sortRank;
>
> uint32_t getPhdrFlags() const;
>
> @@ -54,82 +54,82 @@ public:
> // section offset we use the following formula: Off = Off_first +
> VA -
> // VA_first, where Off_first and VA_first is file offset and VA of
> first
> // section in PT_LOAD.
> - PhdrEntry *PtLoad = nullptr;
> + PhdrEntry *ptLoad = nullptr;
>
> // Pointer to a relocation section for this section. Usually
> nullptr because
> // we consume relocations, but if --emit-relocs is specified (which
> is rare),
> // it may have a non-null value.
> - OutputSection *RelocationSection = nullptr;
> + OutputSection *relocationSection = nullptr;
>
> // Initially this field is the number of InputSections that have
> been added to
> // the OutputSection so far. Later on, after a call to
> assignAddresses, it
> // corresponds to the Elf_Shdr member.
> - uint64_t Size = 0;
> + uint64_t size = 0;
>
> // The following fields correspond to Elf_Shdr members.
> - uint64_t Offset = 0;
> - uint64_t Addr = 0;
> - uint32_t ShName = 0;
> + uint64_t offset = 0;
> + uint64_t addr = 0;
> + uint32_t shName = 0;
>
> - void addSection(InputSection *IS);
> + void addSection(InputSection *isec);
>
> // The following members are normally only used in linker scripts.
> - MemoryRegion *MemRegion = nullptr;
> - MemoryRegion *LMARegion = nullptr;
> - Expr AddrExpr;
> - Expr AlignExpr;
> - Expr LMAExpr;
> - Expr SubalignExpr;
> - std::vector<BaseCommand *> SectionCommands;
> - std::vector<StringRef> Phdrs;
> - llvm::Optional<std::array<uint8_t, 4>> Filler;
> - ConstraintKind Constraint = ConstraintKind::NoConstraint;
> - std::string Location;
> - std::string MemoryRegionName;
> - std::string LMARegionName;
> - bool NonAlloc = false;
> - bool Noload = false;
> - bool ExpressionsUseSymbols = false;
> - bool UsedInExpression = false;
> - bool InOverlay = false;
> + MemoryRegion *memRegion = nullptr;
> + MemoryRegion *lmaRegion = nullptr;
> + Expr addrExpr;
> + Expr alignExpr;
> + Expr lmaExpr;
> + Expr subalignExpr;
> + std::vector<BaseCommand *> sectionCommands;
> + std::vector<StringRef> phdrs;
> + llvm::Optional<std::array<uint8_t, 4>> filler;
> + ConstraintKind constraint = ConstraintKind::NoConstraint;
> + std::string location;
> + std::string memoryRegionName;
> + std::string lmaRegionName;
> + bool nonAlloc = false;
> + bool noload = false;
> + bool expressionsUseSymbols = false;
> + bool usedInExpression = false;
> + bool inOverlay = false;
>
> // Tracks whether the section has ever had an input section added
> to it, even
> // if the section was later removed (e.g. because it is a synthetic
> section
> // that wasn't needed). This is needed for orphan placement.
> - bool HasInputSections = false;
> + bool hasInputSections = false;
>
> void finalize();
> - template <class ELFT> void writeTo(uint8_t *Buf);
> + template <class ELFT> void writeTo(uint8_t *buf);
> template <class ELFT> void maybeCompress();
>
> - void sort(llvm::function_ref<int(InputSectionBase *S)> Order);
> + void sort(llvm::function_ref<int(InputSectionBase *s)> order);
> void sortInitFini();
> void sortCtorsDtors();
>
> private:
> // Used for implementation of --compress-debug-sections option.
> - std::vector<uint8_t> ZDebugHeader;
> - llvm::SmallVector<char, 1> CompressedData;
> + std::vector<uint8_t> zDebugHeader;
> + llvm::SmallVector<char, 1> compressedData;
>
> std::array<uint8_t, 4> getFiller();
> };
>
> -int getPriority(StringRef S);
> +int getPriority(StringRef s);
>
> -std::vector<InputSection *> getInputSections(OutputSection* OS);
> +std::vector<InputSection *> getInputSections(OutputSection* os);
>
> // All output sections that are handled by the linker specially are
> // globally accessible. Writer initializes them, so don't use them
> // until Writer is initialized.
> struct Out {
> - static uint8_t *BufferStart;
> - static uint8_t First;
> - static PhdrEntry *TlsPhdr;
> - static OutputSection *ElfHeader;
> - static OutputSection *ProgramHeaders;
> - static OutputSection *PreinitArray;
> - static OutputSection *InitArray;
> - static OutputSection *FiniArray;
> + static uint8_t *bufferStart;
> + static uint8_t first;
> + static PhdrEntry *tlsPhdr;
> + static OutputSection *elfHeader;
> + static OutputSection *programHeaders;
> + static OutputSection *preinitArray;
> + static OutputSection *initArray;
> + static OutputSection *finiArray;
> };
>
> } // namespace elf
> @@ -140,7 +140,7 @@ namespace elf {
>
> uint64_t getHeaderSize();
>
> -extern std::vector<OutputSection *> OutputSections;
> +extern std::vector<OutputSection *> outputSections;
> } // namespace elf
> } // namespace lld
>
>
> Modified: lld/trunk/ELF/Relocations.cpp
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_Relocations.cpp-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=OJl7a8UYp5_5CV1dOgpnFxXO60FVHvRxpV2CGGP1uKg&e=
>
> ==============================================================================
> --- lld/trunk/ELF/Relocations.cpp (original)
> +++ lld/trunk/ELF/Relocations.cpp Tue Jul 9 22:00:37 2019
> @@ -65,11 +65,11 @@ using namespace llvm::support::endian;
> using namespace lld;
> using namespace lld::elf;
>
> -static Optional<std::string> getLinkerScriptLocation(const Symbol
> &Sym) {
> - for (BaseCommand *Base : Script->SectionCommands)
> - if (auto *Cmd = dyn_cast<SymbolAssignment>(Base))
> - if (Cmd->Sym == &Sym)
> - return Cmd->Location;
> +static Optional<std::string> getLinkerScriptLocation(const Symbol
> &sym) {
> + for (BaseCommand *base : script->sectionCommands)
> + if (auto *cmd = dyn_cast<SymbolAssignment>(base))
> + if (cmd->sym == &sym)
> + return cmd->location;
> return None;
> }
>
> @@ -78,19 +78,19 @@ static Optional<std::string> getLinkerSc
> // >>> defined in /home/alice/src/foo.o
> // >>> referenced by bar.c:12 (/home/alice/src/bar.c:12)
> // >>> /home/alice/src/bar.o:(.text+0x1)
> -static std::string getLocation(InputSectionBase &S, const Symbol &Sym,
> - uint64_t Off) {
> - std::string Msg = "\n>>> defined in ";
> - if (Sym.File)
> - Msg += toString(Sym.File);
> - else if (Optional<std::string> Loc = getLinkerScriptLocation(Sym))
> - Msg += *Loc;
> -
> - Msg += "\n>>> referenced by ";
> - std::string Src = S.getSrcMsg(Sym, Off);
> - if (!Src.empty())
> - Msg += Src + "\n>>> ";
> - return Msg + S.getObjMsg(Off);
> +static std::string getLocation(InputSectionBase &s, const Symbol &sym,
> + uint64_t off) {
> + std::string msg = "\n>>> defined in ";
> + if (sym.file)
> + msg += toString(sym.file);
> + else if (Optional<std::string> loc = getLinkerScriptLocation(sym))
> + msg += *loc;
> +
> + msg += "\n>>> referenced by ";
> + std::string src = s.getSrcMsg(sym, off);
> + if (!src.empty())
> + msg += src + "\n>>> ";
> + return msg + s.getObjMsg(off);
> }
>
> namespace {
> @@ -119,10 +119,10 @@ struct RelExprMaskBuilder<Head, Tail...>
> // There are fewer than 64 RelExpr's, so we can represent any set of
> // RelExpr's as a constant bit mask and test for membership with a
> // couple cheap bitwise operations.
> -template <RelExpr... Exprs> bool oneof(RelExpr Expr) {
> - assert(0 <= Expr && (int)Expr < 64 &&
> +template <RelExpr... Exprs> bool oneof(RelExpr expr) {
> + assert(0 <= expr && (int)expr < 64 &&
> "RelExpr is too large for 64-bit mask!");
> - return (uint64_t(1) << Expr) &
> RelExprMaskBuilder<Exprs...>::build();
> + return (uint64_t(1) << expr) &
> RelExprMaskBuilder<Exprs...>::build();
> }
>
> // This function is similar to the `handleTlsRelocation`. MIPS does
> not
> @@ -131,17 +131,17 @@ template <RelExpr... Exprs> bool oneof(R
> // pollute other `handleTlsRelocation` by MIPS `ifs` statements.
> // Mips has a custom MipsGotSection that handles the writing of GOT
> entries
> // without dynamic relocations.
> -static unsigned handleMipsTlsRelocation(RelType Type, Symbol &Sym,
> - InputSectionBase &C, uint64_t
> Offset,
> - int64_t Addend, RelExpr Expr)
> {
> - if (Expr == R_MIPS_TLSLD) {
> - In.MipsGot->addTlsIndex(*C.File);
> - C.Relocations.push_back({Expr, Type, Offset, Addend, &Sym});
> +static unsigned handleMipsTlsRelocation(RelType type, Symbol &sym,
> + InputSectionBase &c, uint64_t
> offset,
> + int64_t addend, RelExpr expr)
> {
> + if (expr == R_MIPS_TLSLD) {
> + in.mipsGot->addTlsIndex(*c.file);
> + c.relocations.push_back({expr, type, offset, addend, &sym});
> return 1;
> }
> - if (Expr == R_MIPS_TLSGD) {
> - In.MipsGot->addDynTlsEntry(*C.File, Sym);
> - C.Relocations.push_back({Expr, Type, Offset, Addend, &Sym});
> + if (expr == R_MIPS_TLSGD) {
> + in.mipsGot->addDynTlsEntry(*c.file, sym);
> + c.relocations.push_back({expr, type, offset, addend, &sym});
> return 1;
> }
> return 0;
> @@ -156,28 +156,28 @@ static unsigned handleMipsTlsRelocation(
> // Returns the number of relocations processed.
> template <class ELFT>
> static unsigned
> -handleTlsRelocation(RelType Type, Symbol &Sym, InputSectionBase &C,
> - typename ELFT::uint Offset, int64_t Addend,
> RelExpr Expr) {
> - if (!Sym.isTls())
> +handleTlsRelocation(RelType type, Symbol &sym, InputSectionBase &c,
> + typename ELFT::uint offset, int64_t addend,
> RelExpr expr) {
> + if (!sym.isTls())
> return 0;
>
> - if (Config->EMachine == EM_MIPS)
> - return handleMipsTlsRelocation(Type, Sym, C, Offset, Addend,
> Expr);
> + if (config->emachine == EM_MIPS)
> + return handleMipsTlsRelocation(type, sym, c, offset, addend,
> expr);
>
> if (oneof<R_AARCH64_TLSDESC_PAGE, R_TLSDESC, R_TLSDESC_CALL,
> R_TLSDESC_PC>(
> - Expr) &&
> - Config->Shared) {
> - if (In.Got->addDynTlsEntry(Sym)) {
> - uint64_t Off = In.Got->getGlobalDynOffset(Sym);
> - Main->RelaDyn->addReloc(
> - {Target->TlsDescRel, In.Got, Off, !Sym.IsPreemptible, &Sym,
> 0});
> + expr) &&
> + config->shared) {
> + if (in.got->addDynTlsEntry(sym)) {
> + uint64_t off = in.got->getGlobalDynOffset(sym);
> + mainPart->relaDyn->addReloc(
> + {target->tlsDescRel, in.got, off, !sym.isPreemptible, &sym,
> 0});
> }
> - if (Expr != R_TLSDESC_CALL)
> - C.Relocations.push_back({Expr, Type, Offset, Addend, &Sym});
> + if (expr != R_TLSDESC_CALL)
> + c.relocations.push_back({expr, type, offset, addend, &sym});
> return 1;
> }
>
> - bool CanRelax = Config->EMachine != EM_ARM && Config->EMachine !=
> EM_RISCV;
> + bool canRelax = config->emachine != EM_ARM && config->emachine !=
> EM_RISCV;
>
> // If we are producing an executable and the symbol is
> non-preemptable, it
> // must be defined and the code sequence can be relaxed to use
> Local-Exec.
> @@ -186,118 +186,118 @@ handleTlsRelocation(RelType Type, Symbol
> // we can omit the DTPMOD dynamic relocations and resolve them at
> link time
> // because them are always 1. This may be necessary for static
> linking as
> // DTPMOD may not be expected at load time.
> - bool IsLocalInExecutable = !Sym.IsPreemptible && !Config->Shared;
> + bool isLocalInExecutable = !sym.isPreemptible && !config->shared;
>
> // Local Dynamic is for access to module local TLS variables, while
> still
> // being suitable for being dynamically loaded via dlopen. GOT[e0]
> is the
> // module index, with a special value of 0 for the current module.
> GOT[e1] is
> // unused. There only needs to be one module index entry.
> if (oneof<R_TLSLD_GOT, R_TLSLD_GOTPLT, R_TLSLD_PC, R_TLSLD_HINT>(
> - Expr)) {
> + expr)) {
> // Local-Dynamic relocs can be relaxed to Local-Exec.
> - if (CanRelax && !Config->Shared) {
> - C.Relocations.push_back(
> - {Target->adjustRelaxExpr(Type, nullptr,
> R_RELAX_TLS_LD_TO_LE), Type,
> - Offset, Addend, &Sym});
> - return Target->getTlsGdRelaxSkip(Type);
> + if (canRelax && !config->shared) {
> + c.relocations.push_back(
> + {target->adjustRelaxExpr(type, nullptr,
> R_RELAX_TLS_LD_TO_LE), type,
> + offset, addend, &sym});
> + return target->getTlsGdRelaxSkip(type);
> }
> - if (Expr == R_TLSLD_HINT)
> + if (expr == R_TLSLD_HINT)
> return 1;
> - if (In.Got->addTlsIndex()) {
> - if (IsLocalInExecutable)
> - In.Got->Relocations.push_back(
> - {R_ADDEND, Target->SymbolicRel, In.Got->getTlsIndexOff(),
> 1, &Sym});
> + if (in.got->addTlsIndex()) {
> + if (isLocalInExecutable)
> + in.got->relocations.push_back(
> + {R_ADDEND, target->symbolicRel, in.got->getTlsIndexOff(),
> 1, &sym});
> else
> - Main->RelaDyn->addReloc(Target->TlsModuleIndexRel, In.Got,
> - In.Got->getTlsIndexOff(), nullptr);
> + mainPart->relaDyn->addReloc(target->tlsModuleIndexRel, in.got,
> + in.got->getTlsIndexOff(), nullptr);
> }
> - C.Relocations.push_back({Expr, Type, Offset, Addend, &Sym});
> + c.relocations.push_back({expr, type, offset, addend, &sym});
> return 1;
> }
>
> // Local-Dynamic relocs can be relaxed to Local-Exec.
> - if (Expr == R_DTPREL && !Config->Shared) {
> - C.Relocations.push_back(
> - {Target->adjustRelaxExpr(Type, nullptr,
> R_RELAX_TLS_LD_TO_LE), Type,
> - Offset, Addend, &Sym});
> + if (expr == R_DTPREL && !config->shared) {
> + c.relocations.push_back(
> + {target->adjustRelaxExpr(type, nullptr,
> R_RELAX_TLS_LD_TO_LE), type,
> + offset, addend, &sym});
> return 1;
> }
>
> // Local-Dynamic sequence where offset of tls variable relative to
> dynamic
> // thread pointer is stored in the got. This cannot be relaxed to
> Local-Exec.
> - if (Expr == R_TLSLD_GOT_OFF) {
> - if (!Sym.isInGot()) {
> - In.Got->addEntry(Sym);
> - uint64_t Off = Sym.getGotOffset();
> - In.Got->Relocations.push_back(
> - {R_ABS, Target->TlsOffsetRel, Off, 0, &Sym});
> + if (expr == R_TLSLD_GOT_OFF) {
> + if (!sym.isInGot()) {
> + in.got->addEntry(sym);
> + uint64_t off = sym.getGotOffset();
> + in.got->relocations.push_back(
> + {R_ABS, target->tlsOffsetRel, off, 0, &sym});
> }
> - C.Relocations.push_back({Expr, Type, Offset, Addend, &Sym});
> + c.relocations.push_back({expr, type, offset, addend, &sym});
> return 1;
> }
>
> if (oneof<R_AARCH64_TLSDESC_PAGE, R_TLSDESC, R_TLSDESC_CALL,
> R_TLSDESC_PC,
> - R_TLSGD_GOT, R_TLSGD_GOTPLT, R_TLSGD_PC>(Expr)) {
> - if (!CanRelax || Config->Shared) {
> - if (In.Got->addDynTlsEntry(Sym)) {
> - uint64_t Off = In.Got->getGlobalDynOffset(Sym);
> + R_TLSGD_GOT, R_TLSGD_GOTPLT, R_TLSGD_PC>(expr)) {
> + if (!canRelax || config->shared) {
> + if (in.got->addDynTlsEntry(sym)) {
> + uint64_t off = in.got->getGlobalDynOffset(sym);
>
> - if (IsLocalInExecutable)
> + if (isLocalInExecutable)
> // Write one to the GOT slot.
> - In.Got->Relocations.push_back(
> - {R_ADDEND, Target->SymbolicRel, Off, 1, &Sym});
> + in.got->relocations.push_back(
> + {R_ADDEND, target->symbolicRel, off, 1, &sym});
> else
> - Main->RelaDyn->addReloc(Target->TlsModuleIndexRel, In.Got,
> Off, &Sym);
> + mainPart->relaDyn->addReloc(target->tlsModuleIndexRel,
> in.got, off, &sym);
>
> // If the symbol is preemptible we need the dynamic linker to
> write
> // the offset too.
> - uint64_t OffsetOff = Off + Config->Wordsize;
> - if (Sym.IsPreemptible)
> - Main->RelaDyn->addReloc(Target->TlsOffsetRel, In.Got,
> OffsetOff,
> - &Sym);
> + uint64_t offsetOff = off + config->wordsize;
> + if (sym.isPreemptible)
> + mainPart->relaDyn->addReloc(target->tlsOffsetRel, in.got,
> offsetOff,
> + &sym);
> else
> - In.Got->Relocations.push_back(
> - {R_ABS, Target->TlsOffsetRel, OffsetOff, 0, &Sym});
> + in.got->relocations.push_back(
> + {R_ABS, target->tlsOffsetRel, offsetOff, 0, &sym});
> }
> - C.Relocations.push_back({Expr, Type, Offset, Addend, &Sym});
> + c.relocations.push_back({expr, type, offset, addend, &sym});
> return 1;
> }
>
> // Global-Dynamic relocs can be relaxed to Initial-Exec or
> Local-Exec
> // depending on the symbol being locally defined or not.
> - if (Sym.IsPreemptible) {
> - C.Relocations.push_back(
> - {Target->adjustRelaxExpr(Type, nullptr,
> R_RELAX_TLS_GD_TO_IE), Type,
> - Offset, Addend, &Sym});
> - if (!Sym.isInGot()) {
> - In.Got->addEntry(Sym);
> - Main->RelaDyn->addReloc(Target->TlsGotRel, In.Got,
> Sym.getGotOffset(),
> - &Sym);
> + if (sym.isPreemptible) {
> + c.relocations.push_back(
> + {target->adjustRelaxExpr(type, nullptr,
> R_RELAX_TLS_GD_TO_IE), type,
> + offset, addend, &sym});
> + if (!sym.isInGot()) {
> + in.got->addEntry(sym);
> + mainPart->relaDyn->addReloc(target->tlsGotRel, in.got,
> sym.getGotOffset(),
> + &sym);
> }
> } else {
> - C.Relocations.push_back(
> - {Target->adjustRelaxExpr(Type, nullptr,
> R_RELAX_TLS_GD_TO_LE), Type,
> - Offset, Addend, &Sym});
> + c.relocations.push_back(
> + {target->adjustRelaxExpr(type, nullptr,
> R_RELAX_TLS_GD_TO_LE), type,
> + offset, addend, &sym});
> }
> - return Target->getTlsGdRelaxSkip(Type);
> + return target->getTlsGdRelaxSkip(type);
> }
>
> // Initial-Exec relocs can be relaxed to Local-Exec if the symbol
> is locally
> // defined.
> if (oneof<R_GOT, R_GOTPLT, R_GOT_PC, R_AARCH64_GOT_PAGE_PC,
> R_GOT_OFF,
> - R_TLSIE_HINT>(Expr) &&
> - CanRelax && IsLocalInExecutable) {
> - C.Relocations.push_back({R_RELAX_TLS_IE_TO_LE, Type, Offset,
> Addend, &Sym});
> + R_TLSIE_HINT>(expr) &&
> + canRelax && isLocalInExecutable) {
> + c.relocations.push_back({R_RELAX_TLS_IE_TO_LE, type, offset,
> addend, &sym});
> return 1;
> }
>
> - if (Expr == R_TLSIE_HINT)
> + if (expr == R_TLSIE_HINT)
> return 1;
> return 0;
> }
>
> -static RelType getMipsPairType(RelType Type, bool IsLocal) {
> - switch (Type) {
> +static RelType getMipsPairType(RelType type, bool isLocal) {
> + switch (type) {
> case R_MIPS_HI16:
> return R_MIPS_LO16;
> case R_MIPS_GOT16:
> @@ -309,9 +309,9 @@ static RelType getMipsPairType(RelType T
> // the high 16 bits of the symbol's value. A paired R_MIPS_LO16
> // relocations handle low 16 bits of the address. That allows
> // to allocate only one GOT entry for every 64 KBytes of local
> data.
> - return IsLocal ? R_MIPS_LO16 : R_MIPS_NONE;
> + return isLocal ? R_MIPS_LO16 : R_MIPS_NONE;
> case R_MICROMIPS_GOT16:
> - return IsLocal ? R_MICROMIPS_LO16 : R_MIPS_NONE;
> + return isLocal ? R_MICROMIPS_LO16 : R_MIPS_NONE;
> case R_MIPS_PCHI16:
> return R_MIPS_PCLO16;
> case R_MICROMIPS_HI16:
> @@ -323,38 +323,38 @@ static RelType getMipsPairType(RelType T
>
> // True if non-preemptable symbol always has the same value
> regardless of where
> // the DSO is loaded.
> -static bool isAbsolute(const Symbol &Sym) {
> - if (Sym.isUndefWeak())
> +static bool isAbsolute(const Symbol &sym) {
> + if (sym.isUndefWeak())
> return true;
> - if (const auto *DR = dyn_cast<Defined>(&Sym))
> - return DR->Section == nullptr; // Absolute symbol.
> + if (const auto *dr = dyn_cast<Defined>(&sym))
> + return dr->section == nullptr; // Absolute symbol.
> return false;
> }
>
> -static bool isAbsoluteValue(const Symbol &Sym) {
> - return isAbsolute(Sym) || Sym.isTls();
> +static bool isAbsoluteValue(const Symbol &sym) {
> + return isAbsolute(sym) || sym.isTls();
> }
>
> // Returns true if Expr refers a PLT entry.
> -static bool needsPlt(RelExpr Expr) {
> - return oneof<R_PLT_PC, R_PPC32_PLTREL, R_PPC64_CALL_PLT,
> R_PLT>(Expr);
> +static bool needsPlt(RelExpr expr) {
> + return oneof<R_PLT_PC, R_PPC32_PLTREL, R_PPC64_CALL_PLT,
> R_PLT>(expr);
> }
>
> // Returns true if Expr refers a GOT entry. Note that this function
> // returns false for TLS variables even though they need GOT, because
> // TLS variables uses GOT differently than the regular variables.
> -static bool needsGot(RelExpr Expr) {
> +static bool needsGot(RelExpr expr) {
> return oneof<R_GOT, R_GOT_OFF, R_HEXAGON_GOT, R_MIPS_GOT_LOCAL_PAGE,
> R_MIPS_GOT_OFF, R_MIPS_GOT_OFF32,
> R_AARCH64_GOT_PAGE_PC,
> - R_GOT_PC, R_GOTPLT>(Expr);
> + R_GOT_PC, R_GOTPLT>(expr);
> }
>
> // True if this expression is of the form Sym - X, where X is a
> position in the
> // file (PC, or GOT for example).
> -static bool isRelExpr(RelExpr Expr) {
> +static bool isRelExpr(RelExpr expr) {
> return oneof<R_PC, R_GOTREL, R_GOTPLTREL, R_MIPS_GOTREL,
> R_PPC64_CALL,
> R_PPC64_RELAX_TOC, R_AARCH64_PAGE_PC, R_RELAX_GOT_PC,
> - R_RISCV_PC_INDIRECT>(Expr);
> + R_RISCV_PC_INDIRECT>(expr);
> }
>
> // Returns true if a given relocation can be computed at link-time.
> @@ -366,8 +366,8 @@ static bool isRelExpr(RelExpr Expr) {
> //
> // If this function returns false, that means we need to emit a
> // dynamic relocation so that the relocation will be fixed at
> load-time.
> -static bool isStaticLinkTimeConstant(RelExpr E, RelType Type, const
> Symbol &Sym,
> - InputSectionBase &S, uint64_t
> RelOff) {
> +static bool isStaticLinkTimeConstant(RelExpr e, RelType type, const
> Symbol &sym,
> + InputSectionBase &s, uint64_t
> relOff) {
> // These expressions always compute a constant
> if (oneof<R_DTPREL, R_GOTPLT, R_GOT_OFF, R_HEXAGON_GOT,
> R_TLSLD_GOT_OFF,
> R_MIPS_GOT_LOCAL_PAGE, R_MIPS_GOTREL, R_MIPS_GOT_OFF,
> @@ -376,33 +376,33 @@ static bool isStaticLinkTimeConstant(Rel
> R_PLT_PC, R_TLSGD_GOT, R_TLSGD_GOTPLT, R_TLSGD_PC,
> R_PPC32_PLTREL,
> R_PPC64_CALL_PLT, R_PPC64_RELAX_TOC, R_RISCV_ADD,
> R_TLSDESC_CALL,
> R_TLSDESC_PC, R_AARCH64_TLSDESC_PAGE, R_HINT,
> R_TLSLD_HINT,
> - R_TLSIE_HINT>(E))
> + R_TLSIE_HINT>(e))
> return true;
>
> // These never do, except if the entire file is position dependent
> or if
> // only the low bits are used.
> - if (E == R_GOT || E == R_PLT || E == R_TLSDESC)
> - return Target->usesOnlyLowPageBits(Type) || !Config->Pic;
> + if (e == R_GOT || e == R_PLT || e == R_TLSDESC)
> + return target->usesOnlyLowPageBits(type) || !config->isPic;
>
> - if (Sym.IsPreemptible)
> + if (sym.isPreemptible)
> return false;
> - if (!Config->Pic)
> + if (!config->isPic)
> return true;
>
> // The size of a non preemptible symbol is a constant.
> - if (E == R_SIZE)
> + if (e == R_SIZE)
> return true;
>
> // For the target and the relocation, we want to know if they are
> // absolute or relative.
> - bool AbsVal = isAbsoluteValue(Sym);
> - bool RelE = isRelExpr(E);
> - if (AbsVal && !RelE)
> + bool absVal = isAbsoluteValue(sym);
> + bool relE = isRelExpr(e);
> + if (absVal && !relE)
> return true;
> - if (!AbsVal && RelE)
> + if (!absVal && relE)
> return true;
> - if (!AbsVal && !RelE)
> - return Target->usesOnlyLowPageBits(Type);
> + if (!absVal && !relE)
> + return target->usesOnlyLowPageBits(type);
>
> // Relative relocation to an absolute value. This is normally
> unrepresentable,
> // but if the relocation refers to a weak undefined symbol, we
> allow it to
> @@ -412,22 +412,22 @@ static bool isStaticLinkTimeConstant(Rel
> // Another special case is MIPS _gp_disp symbol which represents
> offset
> // between start of a function and '_gp' value and defined as
> absolute just
> // to simplify the code.
> - assert(AbsVal && RelE);
> - if (Sym.isUndefWeak())
> + assert(absVal && relE);
> + if (sym.isUndefWeak())
> return true;
>
> // We set the final symbols values for linker script defined
> symbols later.
> // They always can be computed as a link time constant.
> - if (Sym.ScriptDefined)
> + if (sym.scriptDefined)
> return true;
>
> - error("relocation " + toString(Type) + " cannot refer to absolute
> symbol: " +
> - toString(Sym) + getLocation(S, Sym, RelOff));
> + error("relocation " + toString(type) + " cannot refer to absolute
> symbol: " +
> + toString(sym) + getLocation(s, sym, relOff));
> return true;
> }
>
> -static RelExpr toPlt(RelExpr Expr) {
> - switch (Expr) {
> +static RelExpr toPlt(RelExpr expr) {
> + switch (expr) {
> case R_PPC64_CALL:
> return R_PPC64_CALL_PLT;
> case R_PC:
> @@ -435,14 +435,14 @@ static RelExpr toPlt(RelExpr Expr) {
> case R_ABS:
> return R_PLT;
> default:
> - return Expr;
> + return expr;
> }
> }
>
> -static RelExpr fromPlt(RelExpr Expr) {
> +static RelExpr fromPlt(RelExpr expr) {
> // We decided not to use a plt. Optimize a reference to the plt to a
> // reference to the symbol itself.
> - switch (Expr) {
> + switch (expr) {
> case R_PLT_PC:
> case R_PPC32_PLTREL:
> return R_PC;
> @@ -451,21 +451,21 @@ static RelExpr fromPlt(RelExpr Expr) {
> case R_PLT:
> return R_ABS;
> default:
> - return Expr;
> + return expr;
> }
> }
>
> // Returns true if a given shared symbol is in a read-only segment in
> a DSO.
> -template <class ELFT> static bool isReadOnly(SharedSymbol &SS) {
> +template <class ELFT> static bool isReadOnly(SharedSymbol &ss) {
> using Elf_Phdr = typename ELFT::Phdr;
>
> // Determine if the symbol is read-only by scanning the DSO's
> program headers.
> - const SharedFile &File = SS.getFile();
> - for (const Elf_Phdr &Phdr :
> - check(File.template getObj<ELFT>().program_headers()))
> - if ((Phdr.p_type == ELF::PT_LOAD || Phdr.p_type ==
> ELF::PT_GNU_RELRO) &&
> - !(Phdr.p_flags & ELF::PF_W) && SS.Value >= Phdr.p_vaddr &&
> - SS.Value < Phdr.p_vaddr + Phdr.p_memsz)
> + const SharedFile &file = ss.getFile();
> + for (const Elf_Phdr &phdr :
> + check(file.template getObj<ELFT>().program_headers()))
> + if ((phdr.p_type == ELF::PT_LOAD || phdr.p_type ==
> ELF::PT_GNU_RELRO) &&
> + !(phdr.p_flags & ELF::PF_W) && ss.value >= phdr.p_vaddr &&
> + ss.value < phdr.p_vaddr + phdr.p_memsz)
> return true;
> return false;
> }
> @@ -476,22 +476,22 @@ template <class ELFT> static bool isRead
> // them are copied by a copy relocation, all of them need to be
> copied.
> // Otherwise, they would refer to different places at runtime.
> template <class ELFT>
> -static SmallSet<SharedSymbol *, 4> getSymbolsAt(SharedSymbol &SS) {
> +static SmallSet<SharedSymbol *, 4> getSymbolsAt(SharedSymbol &ss) {
> using Elf_Sym = typename ELFT::Sym;
>
> - SharedFile &File = SS.getFile();
> + SharedFile &file = ss.getFile();
>
> - SmallSet<SharedSymbol *, 4> Ret;
> - for (const Elf_Sym &S : File.template getGlobalELFSyms<ELFT>()) {
> - if (S.st_shndx == SHN_UNDEF || S.st_shndx == SHN_ABS ||
> - S.getType() == STT_TLS || S.st_value != SS.Value)
> + SmallSet<SharedSymbol *, 4> ret;
> + for (const Elf_Sym &s : file.template getGlobalELFSyms<ELFT>()) {
> + if (s.st_shndx == SHN_UNDEF || s.st_shndx == SHN_ABS ||
> + s.getType() == STT_TLS || s.st_value != ss.value)
> continue;
> - StringRef Name = check(S.getName(File.getStringTable()));
> - Symbol *Sym = Symtab->find(Name);
> - if (auto *Alias = dyn_cast_or_null<SharedSymbol>(Sym))
> - Ret.insert(Alias);
> + StringRef name = check(s.getName(file.getStringTable()));
> + Symbol *sym = symtab->find(name);
> + if (auto *alias = dyn_cast_or_null<SharedSymbol>(sym))
> + ret.insert(alias);
> }
> - return Ret;
> + return ret;
> }
>
> // When a symbol is copy relocated or we create a canonical plt
> entry, it is
> @@ -499,21 +499,21 @@ static SmallSet<SharedSymbol *, 4> getSy
> // in .bss and in the case of a canonical plt entry it is in .plt.
> This function
> // replaces the existing symbol with a Defined pointing to the
> appropriate
> // location.
> -static void replaceWithDefined(Symbol &Sym, SectionBase *Sec,
> uint64_t Value,
> - uint64_t Size) {
> - Symbol Old = Sym;
> -
> - Sym.replace(Defined{Sym.File, Sym.getName(), Sym.Binding,
> Sym.StOther,
> - Sym.Type, Value, Size, Sec});
> -
> - Sym.PltIndex = Old.PltIndex;
> - Sym.GotIndex = Old.GotIndex;
> - Sym.VerdefIndex = Old.VerdefIndex;
> - Sym.PPC64BranchltIndex = Old.PPC64BranchltIndex;
> - Sym.IsPreemptible = true;
> - Sym.ExportDynamic = true;
> - Sym.IsUsedInRegularObj = true;
> - Sym.Used = true;
> +static void replaceWithDefined(Symbol &sym, SectionBase *sec,
> uint64_t value,
> + uint64_t size) {
> + Symbol old = sym;
> +
> + sym.replace(Defined{sym.file, sym.getName(), sym.binding,
> sym.stOther,
> + sym.type, value, size, sec});
> +
> + sym.pltIndex = old.pltIndex;
> + sym.gotIndex = old.gotIndex;
> + sym.verdefIndex = old.verdefIndex;
> + sym.ppc64BranchltIndex = old.ppc64BranchltIndex;
> + sym.isPreemptible = true;
> + sym.exportDynamic = true;
> + sym.isUsedInRegularObj = true;
> + sym.used = true;
> }
>
> // Reserve space in .bss or .bss.rel.ro for copy relocation.
> @@ -558,29 +558,29 @@ static void replaceWithDefined(Symbol &S
> // to the variable in .bss. This kind of issue is sometimes very hard
> to
> // debug. What's a solution? Instead of exporting a varaible V from a
> DSO,
> // define an accessor getV().
> -template <class ELFT> static void addCopyRelSymbol(SharedSymbol &SS) {
> +template <class ELFT> static void addCopyRelSymbol(SharedSymbol &ss) {
> // Copy relocation against zero-sized symbol doesn't make sense.
> - uint64_t SymSize = SS.getSize();
> - if (SymSize == 0 || SS.Alignment == 0)
> - fatal("cannot create a copy relocation for symbol " +
> toString(SS));
> + uint64_t symSize = ss.getSize();
> + if (symSize == 0 || ss.alignment == 0)
> + fatal("cannot create a copy relocation for symbol " +
> toString(ss));
>
> // See if this symbol is in a read-only segment. If so, preserve
> the symbol's
> // memory protection by reserving space in the .bss.rel.ro section.
> - bool IsRO = isReadOnly<ELFT>(SS);
> - BssSection *Sec =
> - make<BssSection>(IsRO ? ".bss.rel.ro" : ".bss", SymSize,
> SS.Alignment);
> - if (IsRO)
> - In.BssRelRo->getParent()->addSection(Sec);
> + bool isRO = isReadOnly<ELFT>(ss);
> + BssSection *sec =
> + make<BssSection>(isRO ? ".bss.rel.ro" : ".bss", symSize,
> ss.alignment);
> + if (isRO)
> + in.bssRelRo->getParent()->addSection(sec);
> else
> - In.Bss->getParent()->addSection(Sec);
> + in.bss->getParent()->addSection(sec);
>
> // Look through the DSO's dynamic symbol table for aliases and
> create a
> // dynamic symbol for each one. This causes the copy relocation to
> correctly
> // interpose any aliases.
> - for (SharedSymbol *Sym : getSymbolsAt<ELFT>(SS))
> - replaceWithDefined(*Sym, Sec, 0, Sym->Size);
> + for (SharedSymbol *sym : getSymbolsAt<ELFT>(ss))
> + replaceWithDefined(*sym, sec, 0, sym->size);
>
> - Main->RelaDyn->addReloc(Target->CopyRel, Sec, 0, &SS);
> + mainPart->relaDyn->addReloc(target->copyRel, sec, 0, &ss);
> }
>
> // MIPS has an odd notion of "paired" relocations to calculate
> addends.
> @@ -588,34 +588,34 @@ template <class ELFT> static void addCop
> // R_MIPS_LO16 relocation after that, and an addend is calculated
> using
> // the two relocations.
> template <class ELFT, class RelTy>
> -static int64_t computeMipsAddend(const RelTy &Rel, const RelTy *End,
> - InputSectionBase &Sec, RelExpr Expr,
> - bool IsLocal) {
> - if (Expr == R_MIPS_GOTREL && IsLocal)
> - return Sec.getFile<ELFT>()->MipsGp0;
> +static int64_t computeMipsAddend(const RelTy &rel, const RelTy *end,
> + InputSectionBase &sec, RelExpr expr,
> + bool isLocal) {
> + if (expr == R_MIPS_GOTREL && isLocal)
> + return sec.getFile<ELFT>()->mipsGp0;
>
> // The ABI says that the paired relocation is used only for REL.
> // See p. 4-17 at
> https://urldefense.proofpoint.com/v2/url?u=ftp-3A__www.linux-2Dmips.org_pub_linux_mips_doc_ABI_mipsabi.pdf&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=RAkf3Vl5MWzirfmkwopuyQjQ-5uEE95ctSfXOidHyHs&e=
> if (RelTy::IsRela)
> return 0;
>
> - RelType Type = Rel.getType(Config->IsMips64EL);
> - uint32_t PairTy = getMipsPairType(Type, IsLocal);
> - if (PairTy == R_MIPS_NONE)
> + RelType type = rel.getType(config->isMips64EL);
> + uint32_t pairTy = getMipsPairType(type, isLocal);
> + if (pairTy == R_MIPS_NONE)
> return 0;
>
> - const uint8_t *Buf = Sec.data().data();
> - uint32_t SymIndex = Rel.getSymbol(Config->IsMips64EL);
> + const uint8_t *buf = sec.data().data();
> + uint32_t symIndex = rel.getSymbol(config->isMips64EL);
>
> // To make things worse, paired relocations might not be contiguous
> in
> // the relocation table, so we need to do linear search. *sigh*
> - for (const RelTy *RI = &Rel; RI != End; ++RI)
> - if (RI->getType(Config->IsMips64EL) == PairTy &&
> - RI->getSymbol(Config->IsMips64EL) == SymIndex)
> - return Target->getImplicitAddend(Buf + RI->r_offset, PairTy);
> + for (const RelTy *ri = &rel; ri != end; ++ri)
> + if (ri->getType(config->isMips64EL) == pairTy &&
> + ri->getSymbol(config->isMips64EL) == symIndex)
> + return target->getImplicitAddend(buf + ri->r_offset, pairTy);
>
> - warn("can't find matching " + toString(PairTy) + " relocation for "
> +
> - toString(Type));
> + warn("can't find matching " + toString(pairTy) + " relocation for "
> +
> + toString(type));
> return 0;
> }
>
> @@ -623,82 +623,82 @@ static int64_t computeMipsAddend(const R
> // is in a relocation itself. If it is REL, we need to read it from an
> // input section.
> template <class ELFT, class RelTy>
> -static int64_t computeAddend(const RelTy &Rel, const RelTy *End,
> - InputSectionBase &Sec, RelExpr Expr,
> - bool IsLocal) {
> - int64_t Addend;
> - RelType Type = Rel.getType(Config->IsMips64EL);
> +static int64_t computeAddend(const RelTy &rel, const RelTy *end,
> + InputSectionBase &sec, RelExpr expr,
> + bool isLocal) {
> + int64_t addend;
> + RelType type = rel.getType(config->isMips64EL);
>
> if (RelTy::IsRela) {
> - Addend = getAddend<ELFT>(Rel);
> + addend = getAddend<ELFT>(rel);
> } else {
> - const uint8_t *Buf = Sec.data().data();
> - Addend = Target->getImplicitAddend(Buf + Rel.r_offset, Type);
> + const uint8_t *buf = sec.data().data();
> + addend = target->getImplicitAddend(buf + rel.r_offset, type);
> }
>
> - if (Config->EMachine == EM_PPC64 && Config->Pic && Type ==
> R_PPC64_TOC)
> - Addend += getPPC64TocBase();
> - if (Config->EMachine == EM_MIPS)
> - Addend += computeMipsAddend<ELFT>(Rel, End, Sec, Expr, IsLocal);
> + if (config->emachine == EM_PPC64 && config->isPic && type ==
> R_PPC64_TOC)
> + addend += getPPC64TocBase();
> + if (config->emachine == EM_MIPS)
> + addend += computeMipsAddend<ELFT>(rel, end, sec, expr, isLocal);
>
> - return Addend;
> + return addend;
> }
>
> // Custom error message if Sym is defined in a discarded section.
> template <class ELFT>
> -static std::string maybeReportDiscarded(Undefined &Sym) {
> - auto *File = dyn_cast_or_null<ObjFile<ELFT>>(Sym.File);
> - if (!File || !Sym.DiscardedSecIdx ||
> - File->getSections()[Sym.DiscardedSecIdx] !=
> &InputSection::Discarded)
> +static std::string maybeReportDiscarded(Undefined &sym) {
> + auto *file = dyn_cast_or_null<ObjFile<ELFT>>(sym.file);
> + if (!file || !sym.discardedSecIdx ||
> + file->getSections()[sym.discardedSecIdx] !=
> &InputSection::discarded)
> return "";
> - ArrayRef<Elf_Shdr_Impl<ELFT>> ObjSections =
> - CHECK(File->getObj().sections(), File);
> + ArrayRef<Elf_Shdr_Impl<ELFT>> objSections =
> + CHECK(file->getObj().sections(), file);
>
> - std::string Msg;
> - if (Sym.Type == ELF::STT_SECTION) {
> - Msg = "relocation refers to a discarded section: ";
> - Msg += CHECK(
> -
> File->getObj().getSectionName(&ObjSections[Sym.DiscardedSecIdx]), File);
> + std::string msg;
> + if (sym.type == ELF::STT_SECTION) {
> + msg = "relocation refers to a discarded section: ";
> + msg += CHECK(
> +
> file->getObj().getSectionName(&objSections[sym.discardedSecIdx]), file);
> } else {
> - Msg = "relocation refers to a symbol in a discarded section: " +
> - toString(Sym);
> + msg = "relocation refers to a symbol in a discarded section: " +
> + toString(sym);
> }
> - Msg += "\n>>> defined in " + toString(File);
> + msg += "\n>>> defined in " + toString(file);
>
> - Elf_Shdr_Impl<ELFT> ELFSec = ObjSections[Sym.DiscardedSecIdx - 1];
> - if (ELFSec.sh_type != SHT_GROUP)
> - return Msg;
> + Elf_Shdr_Impl<ELFT> elfSec = objSections[sym.discardedSecIdx - 1];
> + if (elfSec.sh_type != SHT_GROUP)
> + return msg;
>
> // If the discarded section is a COMDAT.
> - StringRef Signature = File->getShtGroupSignature(ObjSections,
> ELFSec);
> - if (const InputFile *Prevailing =
> - Symtab->ComdatGroups.lookup(CachedHashStringRef(Signature)))
> - Msg += "\n>>> section group signature: " + Signature.str() +
> - "\n>>> prevailing definition is in " +
> toString(Prevailing);
> - return Msg;
> + StringRef signature = file->getShtGroupSignature(objSections,
> elfSec);
> + if (const InputFile *prevailing =
> + symtab->comdatGroups.lookup(CachedHashStringRef(signature)))
> + msg += "\n>>> section group signature: " + signature.str() +
> + "\n>>> prevailing definition is in " +
> toString(prevailing);
> + return msg;
> }
>
> // Undefined diagnostics are collected in a vector and emitted once
> all of
> // them are known, so that some postprocessing on the list of
> undefined symbols
> // can happen before lld emits diagnostics.
> struct UndefinedDiag {
> - Symbol *Sym;
> + Symbol *sym;
> struct Loc {
> - InputSectionBase *Sec;
> - uint64_t Offset;
> + InputSectionBase *sec;
> + uint64_t offset;
> };
> - std::vector<Loc> Locs;
> - bool IsWarning;
> + std::vector<Loc> locs;
> + bool isWarning;
> };
>
> -static std::vector<UndefinedDiag> Undefs;
> +static std::vector<UndefinedDiag> undefs;
>
> template <class ELFT>
> -static void reportUndefinedSymbol(const UndefinedDiag &Undef) {
> - Symbol &Sym = *Undef.Sym;
> +static void reportUndefinedSymbol(const UndefinedDiag &undef) {
> + Symbol &sym = *undef.sym;
>
> - auto Visibility = [&]() -> std::string {
> - switch (Sym.Visibility) {
> + auto visibility = [&]() -> std::string {
> + switch (sym.visibility) {
> case STV_INTERNAL:
> return "internal ";
> case STV_HIDDEN:
> @@ -710,71 +710,71 @@ static void reportUndefinedSymbol(const
> }
> };
>
> - std::string Msg = maybeReportDiscarded<ELFT>(cast<Undefined>(Sym));
> - if (Msg.empty())
> - Msg = "undefined " + Visibility() + "symbol: " + toString(Sym);
> -
> - const size_t MaxUndefReferences = 10;
> - size_t I = 0;
> - for (UndefinedDiag::Loc L : Undef.Locs) {
> - if (I >= MaxUndefReferences)
> + std::string msg = maybeReportDiscarded<ELFT>(cast<Undefined>(sym));
> + if (msg.empty())
> + msg = "undefined " + visibility() + "symbol: " + toString(sym);
> +
> + const size_t maxUndefReferences = 10;
> + size_t i = 0;
> + for (UndefinedDiag::Loc l : undef.locs) {
> + if (i >= maxUndefReferences)
> break;
> - InputSectionBase &Sec = *L.Sec;
> - uint64_t Offset = L.Offset;
> + InputSectionBase &sec = *l.sec;
> + uint64_t offset = l.offset;
>
> - Msg += "\n>>> referenced by ";
> - std::string Src = Sec.getSrcMsg(Sym, Offset);
> - if (!Src.empty())
> - Msg += Src + "\n>>> ";
> - Msg += Sec.getObjMsg(Offset);
> - I++;
> + msg += "\n>>> referenced by ";
> + std::string src = sec.getSrcMsg(sym, offset);
> + if (!src.empty())
> + msg += src + "\n>>> ";
> + msg += sec.getObjMsg(offset);
> + i++;
> }
>
> - if (I < Undef.Locs.size())
> - Msg += ("\n>>> referenced " + Twine(Undef.Locs.size() - I) + "
> more times")
> + if (i < undef.locs.size())
> + msg += ("\n>>> referenced " + Twine(undef.locs.size() - i) + "
> more times")
> .str();
>
> - if (Sym.getName().startswith("_ZTV"))
> - Msg += "\nthe vtable symbol may be undefined because the class is
> missing "
> + if (sym.getName().startswith("_ZTV"))
> + msg += "\nthe vtable symbol may be undefined because the class is
> missing "
> "its key function (see
> https://urldefense.proofpoint.com/v2/url?u=https-3A__lld.llvm.org_missingkeyfunction&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=JH-BkRDg7ipWrG1X8NiQgMKCXDvJVHRblR015SyHI8w&e=
> )";
>
> - if (Undef.IsWarning)
> - warn(Msg);
> + if (undef.isWarning)
> + warn(msg);
> else
> - error(Msg);
> + error(msg);
> }
>
> template <class ELFT> void elf::reportUndefinedSymbols() {
> // Find the first "undefined symbol" diagnostic for each
> diagnostic, and
> // collect all "referenced from" lines at the first diagnostic.
> - DenseMap<Symbol *, UndefinedDiag *> FirstRef;
> - for (UndefinedDiag &Undef : Undefs) {
> - assert(Undef.Locs.size() == 1);
> - if (UndefinedDiag *Canon = FirstRef.lookup(Undef.Sym)) {
> - Canon->Locs.push_back(Undef.Locs[0]);
> - Undef.Locs.clear();
> + DenseMap<Symbol *, UndefinedDiag *> firstRef;
> + for (UndefinedDiag &undef : undefs) {
> + assert(undef.locs.size() == 1);
> + if (UndefinedDiag *canon = firstRef.lookup(undef.sym)) {
> + canon->locs.push_back(undef.locs[0]);
> + undef.locs.clear();
> } else
> - FirstRef[Undef.Sym] = &Undef;
> + firstRef[undef.sym] = &undef;
> }
>
> - for (const UndefinedDiag &Undef : Undefs) {
> - if (!Undef.Locs.empty())
> - reportUndefinedSymbol<ELFT>(Undef);
> + for (const UndefinedDiag &undef : undefs) {
> + if (!undef.locs.empty())
> + reportUndefinedSymbol<ELFT>(undef);
> }
> - Undefs.clear();
> + undefs.clear();
> }
>
> // Report an undefined symbol if necessary.
> // Returns true if the undefined symbol will produce an error message.
> template <class ELFT>
> -static bool maybeReportUndefined(Symbol &Sym, InputSectionBase &Sec,
> - uint64_t Offset) {
> - if (!Sym.isUndefined() || Sym.isWeak())
> +static bool maybeReportUndefined(Symbol &sym, InputSectionBase &sec,
> + uint64_t offset) {
> + if (!sym.isUndefined() || sym.isWeak())
> return false;
>
> - bool CanBeExternal = !Sym.isLocal() && Sym.computeBinding() !=
> STB_LOCAL &&
> - Sym.Visibility == STV_DEFAULT;
> - if (Config->UnresolvedSymbols == UnresolvedPolicy::Ignore &&
> CanBeExternal)
> + bool canBeExternal = !sym.isLocal() && sym.computeBinding() !=
> STB_LOCAL &&
> + sym.visibility == STV_DEFAULT;
> + if (config->unresolvedSymbols == UnresolvedPolicy::Ignore &&
> canBeExternal)
> return false;
>
> // clang (as of 2019-06-12) / gcc (as of 8.2.1) PPC64 may emit a
> .rela.toc
> @@ -782,15 +782,15 @@ static bool maybeReportUndefined(Symbol
> // .toc and the .rela.toc are incorrectly not placed in the comdat.
> The ELF
> // spec says references from outside the group to a STB_LOCAL
> symbol are not
> // allowed. Work around the bug.
> - if (Config->EMachine == EM_PPC64 &&
> - cast<Undefined>(Sym).DiscardedSecIdx != 0 && Sec.Name == ".toc")
> + if (config->emachine == EM_PPC64 &&
> + cast<Undefined>(sym).discardedSecIdx != 0 && sec.name ==
> ".toc")
> return false;
>
> - bool IsWarning =
> - (Config->UnresolvedSymbols == UnresolvedPolicy::Warn &&
> CanBeExternal) ||
> - Config->NoinhibitExec;
> - Undefs.push_back({&Sym, {{&Sec, Offset}}, IsWarning});
> - return !IsWarning;
> + bool isWarning =
> + (config->unresolvedSymbols == UnresolvedPolicy::Warn &&
> canBeExternal) ||
> + config->noinhibitExec;
> + undefs.push_back({&sym, {{&sec, offset}}, isWarning});
> + return !isWarning;
> }
>
> // MIPS N32 ABI treats series of successive relocations with the same
> offset
> @@ -798,14 +798,14 @@ static bool maybeReportUndefined(Symbol
> // packs all relocations into the single relocation record. Here we
> emulate
> // this for the N32 ABI. Iterate over relocation with the same offset
> and put
> // theirs types into the single bit-set.
> -template <class RelTy> static RelType getMipsN32RelType(RelTy *&Rel,
> RelTy *End) {
> - RelType Type = 0;
> - uint64_t Offset = Rel->r_offset;
> -
> - int N = 0;
> - while (Rel != End && Rel->r_offset == Offset)
> - Type |= (Rel++)->getType(Config->IsMips64EL) << (8 * N++);
> - return Type;
> +template <class RelTy> static RelType getMipsN32RelType(RelTy *&rel,
> RelTy *end) {
> + RelType type = 0;
> + uint64_t offset = rel->r_offset;
> +
> + int n = 0;
> + while (rel != end && rel->r_offset == offset)
> + type |= (rel++)->getType(config->isMips64EL) << (8 * n++);
> + return type;
> }
>
> // .eh_frame sections are mergeable input sections, so their input
> @@ -822,42 +822,42 @@ template <class RelTy> static RelType ge
> namespace {
> class OffsetGetter {
> public:
> - explicit OffsetGetter(InputSectionBase &Sec) {
> - if (auto *Eh = dyn_cast<EhInputSection>(&Sec))
> - Pieces = Eh->Pieces;
> + explicit OffsetGetter(InputSectionBase &sec) {
> + if (auto *eh = dyn_cast<EhInputSection>(&sec))
> + pieces = eh->pieces;
> }
>
> // Translates offsets in input sections to offsets in output
> sections.
> // Given offset must increase monotonically. We assume that Piece is
> // sorted by InputOff.
> - uint64_t get(uint64_t Off) {
> - if (Pieces.empty())
> - return Off;
> -
> - while (I != Pieces.size() && Pieces[I].InputOff + Pieces[I].Size
> <= Off)
> - ++I;
> - if (I == Pieces.size())
> + uint64_t get(uint64_t off) {
> + if (pieces.empty())
> + return off;
> +
> + while (i != pieces.size() && pieces[i].inputOff + pieces[i].size
> <= off)
> + ++i;
> + if (i == pieces.size())
> fatal(".eh_frame: relocation is not in any piece");
>
> // Pieces must be contiguous, so there must be no holes in
> between.
> - assert(Pieces[I].InputOff <= Off && "Relocation not in any
> piece");
> + assert(pieces[i].inputOff <= off && "Relocation not in any
> piece");
>
> // Offset -1 means that the piece is dead (i.e. garbage
> collected).
> - if (Pieces[I].OutputOff == -1)
> + if (pieces[i].outputOff == -1)
> return -1;
> - return Pieces[I].OutputOff + Off - Pieces[I].InputOff;
> + return pieces[i].outputOff + off - pieces[i].inputOff;
> }
>
> private:
> - ArrayRef<EhSectionPiece> Pieces;
> - size_t I = 0;
> + ArrayRef<EhSectionPiece> pieces;
> + size_t i = 0;
> };
> } // namespace
>
> -static void addRelativeReloc(InputSectionBase *IS, uint64_t
> OffsetInSec,
> - Symbol *Sym, int64_t Addend, RelExpr
> Expr,
> - RelType Type) {
> - Partition &Part = IS->getPartition();
> +static void addRelativeReloc(InputSectionBase *isec, uint64_t
> offsetInSec,
> + Symbol *sym, int64_t addend, RelExpr
> expr,
> + RelType type) {
> + Partition &part = isec->getPartition();
>
> // Add a relative relocation. If RelrDyn section is enabled, and the
> // relocation offset is guaranteed to be even, add the relocation to
> @@ -865,29 +865,29 @@ static void addRelativeReloc(InputSectio
> // RelrDyn sections don't support odd offsets. Also, RelrDyn
> sections
> // don't store the addend values, so we must write it to the
> relocated
> // address.
> - if (Part.RelrDyn && IS->Alignment >= 2 && OffsetInSec % 2 == 0) {
> - IS->Relocations.push_back({Expr, Type, OffsetInSec, Addend, Sym});
> - Part.RelrDyn->Relocs.push_back({IS, OffsetInSec});
> + if (part.relrDyn && isec->alignment >= 2 && offsetInSec % 2 == 0) {
> + isec->relocations.push_back({expr, type, offsetInSec, addend,
> sym});
> + part.relrDyn->relocs.push_back({isec, offsetInSec});
> return;
> }
> - Part.RelaDyn->addReloc(Target->RelativeRel, IS, OffsetInSec, Sym,
> Addend,
> - Expr, Type);
> + part.relaDyn->addReloc(target->relativeRel, isec, offsetInSec, sym,
> addend,
> + expr, type);
> }
>
> template <class ELFT, class GotPltSection>
> -static void addPltEntry(PltSection *Plt, GotPltSection *GotPlt,
> - RelocationBaseSection *Rel, RelType Type,
> Symbol &Sym) {
> - Plt->addEntry<ELFT>(Sym);
> - GotPlt->addEntry(Sym);
> - Rel->addReloc(
> - {Type, GotPlt, Sym.getGotPltOffset(), !Sym.IsPreemptible, &Sym,
> 0});
> +static void addPltEntry(PltSection *plt, GotPltSection *gotPlt,
> + RelocationBaseSection *rel, RelType type,
> Symbol &sym) {
> + plt->addEntry<ELFT>(sym);
> + gotPlt->addEntry(sym);
> + rel->addReloc(
> + {type, gotPlt, sym.getGotPltOffset(), !sym.isPreemptible, &sym,
> 0});
> }
>
> -static void addGotEntry(Symbol &Sym) {
> - In.Got->addEntry(Sym);
> +static void addGotEntry(Symbol &sym) {
> + in.got->addEntry(sym);
>
> - RelExpr Expr = Sym.isTls() ? R_TLS : R_ABS;
> - uint64_t Off = Sym.getGotOffset();
> + RelExpr expr = sym.isTls() ? R_TLS : R_ABS;
> + uint64_t off = sym.getGotOffset();
>
> // If a GOT slot value can be calculated at link-time, which is now,
> // we can just fill that out.
> @@ -896,42 +896,42 @@ static void addGotEntry(Symbol &Sym) {
> // add a static relocation to a Relocations vector so that
> // InputSection::relocate will do the work for us. We may be able
> // to just write a value now, but it is a TODO.)
> - bool IsLinkTimeConstant =
> - !Sym.IsPreemptible && (!Config->Pic || isAbsolute(Sym));
> - if (IsLinkTimeConstant) {
> - In.Got->Relocations.push_back({Expr, Target->SymbolicRel, Off, 0,
> &Sym});
> + bool isLinkTimeConstant =
> + !sym.isPreemptible && (!config->isPic || isAbsolute(sym));
> + if (isLinkTimeConstant) {
> + in.got->relocations.push_back({expr, target->symbolicRel, off, 0,
> &sym});
> return;
> }
>
> // Otherwise, we emit a dynamic relocation to .rel[a].dyn so that
> // the GOT slot will be fixed at load-time.
> - if (!Sym.isTls() && !Sym.IsPreemptible && Config->Pic &&
> !isAbsolute(Sym)) {
> - addRelativeReloc(In.Got, Off, &Sym, 0, R_ABS,
> Target->SymbolicRel);
> + if (!sym.isTls() && !sym.isPreemptible && config->isPic &&
> !isAbsolute(sym)) {
> + addRelativeReloc(in.got, off, &sym, 0, R_ABS,
> target->symbolicRel);
> return;
> }
> - Main->RelaDyn->addReloc(
> - Sym.isTls() ? Target->TlsGotRel : Target->GotRel, In.Got, Off,
> &Sym, 0,
> - Sym.IsPreemptible ? R_ADDEND : R_ABS, Target->SymbolicRel);
> + mainPart->relaDyn->addReloc(
> + sym.isTls() ? target->tlsGotRel : target->gotRel, in.got, off,
> &sym, 0,
> + sym.isPreemptible ? R_ADDEND : R_ABS, target->symbolicRel);
> }
>
> // Return true if we can define a symbol in the executable that
> // contains the value/function of a symbol defined in a shared
> // library.
> -static bool canDefineSymbolInExecutable(Symbol &Sym) {
> +static bool canDefineSymbolInExecutable(Symbol &sym) {
> // If the symbol has default visibility the symbol defined in the
> // executable will preempt it.
> // Note that we want the visibility of the shared symbol itself, not
> // the visibility of the symbol in the output file we are
> producing. That is
> // why we use Sym.StOther.
> - if ((Sym.StOther & 0x3) == STV_DEFAULT)
> + if ((sym.stOther & 0x3) == STV_DEFAULT)
> return true;
>
> // If we are allowed to break address equality of functions,
> defining
> // a plt entry will allow the program to call the function in the
> // .so, but the .so and the executable will no agree on the address
> // of the function. Similar logic for objects.
> - return ((Sym.isFunc() && Config->IgnoreFunctionAddressEquality) ||
> - (Sym.isObject() && Config->IgnoreDataAddressEquality));
> + return ((sym.isFunc() && config->ignoreFunctionAddressEquality) ||
> + (sym.isObject() && config->ignoreDataAddressEquality));
> }
>
> // The reason we have to do this early scan is as follows
> @@ -948,9 +948,9 @@ static bool canDefineSymbolInExecutable(
> // complicates things for the dynamic linker and means we would have
> to reserve
> // space for the extra PT_LOAD even if we end up not using it.
> template <class ELFT, class RelTy>
> -static void processRelocAux(InputSectionBase &Sec, RelExpr Expr,
> RelType Type,
> - uint64_t Offset, Symbol &Sym, const RelTy
> &Rel,
> - int64_t Addend) {
> +static void processRelocAux(InputSectionBase &sec, RelExpr expr,
> RelType type,
> + uint64_t offset, Symbol &sym, const RelTy
> &rel,
> + int64_t addend) {
> // If the relocation is known to be a link-time constant, we know
> no dynamic
> // relocation will be created, pass the control to relocateAlloc()
> or
> // relocateNonAlloc() to resolve it.
> @@ -958,23 +958,23 @@ static void processRelocAux(InputSection
> // The behavior of an undefined weak reference is implementation
> defined. If
> // the relocation is to a weak undef, and we are producing an
> executable, let
> // relocate{,Non}Alloc() resolve it.
> - if (isStaticLinkTimeConstant(Expr, Type, Sym, Sec, Offset) ||
> - (!Config->Shared && Sym.isUndefWeak())) {
> - Sec.Relocations.push_back({Expr, Type, Offset, Addend, &Sym});
> + if (isStaticLinkTimeConstant(expr, type, sym, sec, offset) ||
> + (!config->shared && sym.isUndefWeak())) {
> + sec.relocations.push_back({expr, type, offset, addend, &sym});
> return;
> }
>
> - bool CanWrite = (Sec.Flags & SHF_WRITE) || !Config->ZText;
> - if (CanWrite) {
> - RelType Rel = Target->getDynRel(Type);
> - if (Expr == R_GOT || (Rel == Target->SymbolicRel &&
> !Sym.IsPreemptible)) {
> - addRelativeReloc(&Sec, Offset, &Sym, Addend, Expr, Type);
> + bool canWrite = (sec.flags & SHF_WRITE) || !config->zText;
> + if (canWrite) {
> + RelType rel = target->getDynRel(type);
> + if (expr == R_GOT || (rel == target->symbolicRel &&
> !sym.isPreemptible)) {
> + addRelativeReloc(&sec, offset, &sym, addend, expr, type);
> return;
> - } else if (Rel != 0) {
> - if (Config->EMachine == EM_MIPS && Rel == Target->SymbolicRel)
> - Rel = Target->RelativeRel;
> - Sec.getPartition().RelaDyn->addReloc(Rel, &Sec, Offset, &Sym,
> Addend,
> - R_ADDEND, Type);
> + } else if (rel != 0) {
> + if (config->emachine == EM_MIPS && rel == target->symbolicRel)
> + rel = target->relativeRel;
> + sec.getPartition().relaDyn->addReloc(rel, &sec, offset, &sym,
> addend,
> + R_ADDEND, type);
>
> // MIPS ABI turns using of GOT and dynamic relocations inside
> out.
> // While regular ABI uses dynamic relocations to fill up GOT
> entries
> @@ -991,19 +991,19 @@ static void processRelocAux(InputSection
> // to the GOT entry and reads the GOT entry when it needs to
> perform
> // a dynamic relocation.
> //
> https://urldefense.proofpoint.com/v2/url?u=ftp-3A__www.linux-2Dmips.org_pub_linux_mips_doc_ABI_mipsabi.pdf&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=RAkf3Vl5MWzirfmkwopuyQjQ-5uEE95ctSfXOidHyHs&e=
> p.4-19
> - if (Config->EMachine == EM_MIPS)
> - In.MipsGot->addEntry(*Sec.File, Sym, Addend, Expr);
> + if (config->emachine == EM_MIPS)
> + in.mipsGot->addEntry(*sec.file, sym, addend, expr);
> return;
> }
> }
>
> - if (!CanWrite && (Config->Pic && !isRelExpr(Expr))) {
> + if (!canWrite && (config->isPic && !isRelExpr(expr))) {
> error(
> - "can't create dynamic relocation " + toString(Type) + "
> against " +
> - (Sym.getName().empty() ? "local symbol" : "symbol: " +
> toString(Sym)) +
> + "can't create dynamic relocation " + toString(type) + "
> against " +
> + (sym.getName().empty() ? "local symbol" : "symbol: " +
> toString(sym)) +
> " in readonly segment; recompile object files with -fPIC "
> "or pass '-Wl,-z,notext' to allow text relocations in the
> output" +
> - getLocation(Sec, Sym, Offset));
> + getLocation(sec, sym, offset));
> return;
> }
>
> @@ -1013,40 +1013,40 @@ static void processRelocAux(InputSection
> // Among R_ABS relocatoin types, SymbolicRel has the same size as
> the word
> // size. Others have fewer bits and may cause runtime overflow in
> -pie/-shared
> // mode. Disallow them.
> - if (Config->Shared ||
> - (Config->Pie && Expr == R_ABS && Type != Target->SymbolicRel)) {
> + if (config->shared ||
> + (config->pie && expr == R_ABS && type != target->symbolicRel)) {
> errorOrWarn(
> - "relocation " + toString(Type) + " cannot be used against " +
> - (Sym.getName().empty() ? "local symbol" : "symbol " +
> toString(Sym)) +
> - "; recompile with -fPIC" + getLocation(Sec, Sym, Offset));
> + "relocation " + toString(type) + " cannot be used against " +
> + (sym.getName().empty() ? "local symbol" : "symbol " +
> toString(sym)) +
> + "; recompile with -fPIC" + getLocation(sec, sym, offset));
> return;
> }
>
> // If the symbol is undefined we already reported any relevant
> errors.
> - if (Sym.isUndefined())
> + if (sym.isUndefined())
> return;
>
> - if (!canDefineSymbolInExecutable(Sym)) {
> - error("cannot preempt symbol: " + toString(Sym) +
> - getLocation(Sec, Sym, Offset));
> + if (!canDefineSymbolInExecutable(sym)) {
> + error("cannot preempt symbol: " + toString(sym) +
> + getLocation(sec, sym, offset));
> return;
> }
>
> - if (Sym.isObject()) {
> + if (sym.isObject()) {
> // Produce a copy relocation.
> - if (auto *SS = dyn_cast<SharedSymbol>(&Sym)) {
> - if (!Config->ZCopyreloc)
> - error("unresolvable relocation " + toString(Type) +
> - " against symbol '" + toString(*SS) +
> + if (auto *ss = dyn_cast<SharedSymbol>(&sym)) {
> + if (!config->zCopyreloc)
> + error("unresolvable relocation " + toString(type) +
> + " against symbol '" + toString(*ss) +
> "'; recompile with -fPIC or remove '-z nocopyreloc'" +
> - getLocation(Sec, Sym, Offset));
> - addCopyRelSymbol<ELFT>(*SS);
> + getLocation(sec, sym, offset));
> + addCopyRelSymbol<ELFT>(*ss);
> }
> - Sec.Relocations.push_back({Expr, Type, Offset, Addend, &Sym});
> + sec.relocations.push_back({expr, type, offset, addend, &sym});
> return;
> }
>
> - if (Sym.isFunc()) {
> + if (sym.isFunc()) {
> // This handles a non PIC program call to function in a shared
> library. In
> // an ideal world, we could just report an error saying the
> relocation can
> // overflow at runtime. In the real world with glibc, crt1.o has a
> @@ -1074,65 +1074,65 @@ static void processRelocAux(InputSection
> // compiled without -fPIE/-fPIC and doesn't maintain ebx.
> // * If a library definition gets preempted to the executable, it
> will have
> // the wrong ebx value.
> - if (Config->Pie && Config->EMachine == EM_386)
> - errorOrWarn("symbol '" + toString(Sym) +
> + if (config->pie && config->emachine == EM_386)
> + errorOrWarn("symbol '" + toString(sym) +
> "' cannot be preempted; recompile with -fPIE" +
> - getLocation(Sec, Sym, Offset));
> - if (!Sym.isInPlt())
> - addPltEntry<ELFT>(In.Plt, In.GotPlt, In.RelaPlt,
> Target->PltRel, Sym);
> - if (!Sym.isDefined())
> + getLocation(sec, sym, offset));
> + if (!sym.isInPlt())
> + addPltEntry<ELFT>(in.plt, in.gotPlt, in.relaPlt,
> target->pltRel, sym);
> + if (!sym.isDefined())
> replaceWithDefined(
> - Sym, In.Plt,
> - Target->PltHeaderSize + Target->PltEntrySize *
> Sym.PltIndex, 0);
> - Sym.NeedsPltAddr = true;
> - Sec.Relocations.push_back({Expr, Type, Offset, Addend, &Sym});
> + sym, in.plt,
> + target->pltHeaderSize + target->pltEntrySize *
> sym.pltIndex, 0);
> + sym.needsPltAddr = true;
> + sec.relocations.push_back({expr, type, offset, addend, &sym});
> return;
> }
>
> - errorOrWarn("symbol '" + toString(Sym) + "' has no type" +
> - getLocation(Sec, Sym, Offset));
> + errorOrWarn("symbol '" + toString(sym) + "' has no type" +
> + getLocation(sec, sym, offset));
> }
>
> struct IRelativeReloc {
> - RelType Type;
> - InputSectionBase *Sec;
> - uint64_t Offset;
> - Symbol *Sym;
> + RelType type;
> + InputSectionBase *sec;
> + uint64_t offset;
> + Symbol *sym;
> };
>
> -static std::vector<IRelativeReloc> IRelativeRelocs;
> +static std::vector<IRelativeReloc> iRelativeRelocs;
>
> template <class ELFT, class RelTy>
> -static void scanReloc(InputSectionBase &Sec, OffsetGetter &GetOffset,
> RelTy *&I,
> - RelTy *End) {
> - const RelTy &Rel = *I;
> - uint32_t SymIndex = Rel.getSymbol(Config->IsMips64EL);
> - Symbol &Sym = Sec.getFile<ELFT>()->getSymbol(SymIndex);
> - RelType Type;
> +static void scanReloc(InputSectionBase &sec, OffsetGetter &getOffset,
> RelTy *&i,
> + RelTy *end) {
> + const RelTy &rel = *i;
> + uint32_t symIndex = rel.getSymbol(config->isMips64EL);
> + Symbol &sym = sec.getFile<ELFT>()->getSymbol(symIndex);
> + RelType type;
>
> // Deal with MIPS oddity.
> - if (Config->MipsN32Abi) {
> - Type = getMipsN32RelType(I, End);
> + if (config->mipsN32Abi) {
> + type = getMipsN32RelType(i, end);
> } else {
> - Type = Rel.getType(Config->IsMips64EL);
> - ++I;
> + type = rel.getType(config->isMips64EL);
> + ++i;
> }
>
> // Get an offset in an output section this relocation is applied to.
> - uint64_t Offset = GetOffset.get(Rel.r_offset);
> - if (Offset == uint64_t(-1))
> + uint64_t offset = getOffset.get(rel.r_offset);
> + if (offset == uint64_t(-1))
> return;
>
> // Error if the target symbol is undefined. Symbol index 0 may be
> used by
> // marker relocations, e.g. R_*_NONE and R_ARM_V4BX. Don't error on
> them.
> - if (SymIndex != 0 && maybeReportUndefined<ELFT>(Sym, Sec,
> Rel.r_offset))
> + if (symIndex != 0 && maybeReportUndefined<ELFT>(sym, sec,
> rel.r_offset))
> return;
>
> - const uint8_t *RelocatedAddr = Sec.data().begin() + Rel.r_offset;
> - RelExpr Expr = Target->getRelExpr(Type, Sym, RelocatedAddr);
> + const uint8_t *relocatedAddr = sec.data().begin() + rel.r_offset;
> + RelExpr expr = target->getRelExpr(type, sym, relocatedAddr);
>
> // Ignore "hint" relocations because they are only markers for
> relaxation.
> - if (oneof<R_HINT, R_NONE>(Expr))
> + if (oneof<R_HINT, R_NONE>(expr))
> return;
>
> // We can separate the small code model relocations into 2
> categories:
> @@ -1143,21 +1143,21 @@ static void scanReloc(InputSectionBase &
> // got-based small code model relocs. The .toc sections get placed
> after the
> // end of the linker allocated .got section and we do sort those so
> sections
> // addressed with small code model relocations come first.
> - if (Config->EMachine == EM_PPC64 &&
> isPPC64SmallCodeModelTocReloc(Type))
> - Sec.File->PPC64SmallCodeModelTocRelocs = true;
> + if (config->emachine == EM_PPC64 &&
> isPPC64SmallCodeModelTocReloc(type))
> + sec.file->ppc64SmallCodeModelTocRelocs = true;
>
> - if (Sym.isGnuIFunc() && !Config->ZText && Config->WarnIfuncTextrel)
> {
> + if (sym.isGnuIFunc() && !config->zText && config->warnIfuncTextrel)
> {
> warn("using ifunc symbols when text relocations are allowed may
> produce "
> "a binary that will segfault, if the object file is linked
> with "
> "old version of glibc (glibc 2.28 and earlier). If this
> applies to "
> "you, consider recompiling the object files without -fPIC
> and "
> "without -Wl,-z,notext option. Use -no-warn-ifunc-textrel to
> "
> "turn off this warning." +
> - getLocation(Sec, Sym, Offset));
> + getLocation(sec, sym, offset));
> }
>
> // Read an addend.
> - int64_t Addend = computeAddend<ELFT>(Rel, End, Sec, Expr,
> Sym.isLocal());
> + int64_t addend = computeAddend<ELFT>(rel, end, sec, expr,
> sym.isLocal());
>
> // Relax relocations.
> //
> @@ -1167,15 +1167,15 @@ static void scanReloc(InputSectionBase &
> // be resolved within the executable will actually be resolved that
> way at
> // runtime, because the main exectuable is always at the beginning
> of a search
> // list. We can leverage that fact.
> - if (!Sym.IsPreemptible && (!Sym.isGnuIFunc() ||
> Config->ZIfuncNoplt)) {
> - if (Expr == R_GOT_PC && !isAbsoluteValue(Sym)) {
> - Expr = Target->adjustRelaxExpr(Type, RelocatedAddr, Expr);
> + if (!sym.isPreemptible && (!sym.isGnuIFunc() ||
> config->zIfuncNoplt)) {
> + if (expr == R_GOT_PC && !isAbsoluteValue(sym)) {
> + expr = target->adjustRelaxExpr(type, relocatedAddr, expr);
> } else {
> // Addend of R_PPC_PLTREL24 is used to choose call stub type.
> It should be
> // ignored if optimized to R_PC.
> - if (Config->EMachine == EM_PPC && Expr == R_PPC32_PLTREL)
> - Addend = 0;
> - Expr = fromPlt(Expr);
> + if (config->emachine == EM_PPC && expr == R_PPC32_PLTREL)
> + addend = 0;
> + expr = fromPlt(expr);
> }
> }
>
> @@ -1183,39 +1183,39 @@ static void scanReloc(InputSectionBase &
> // uses their addresses, we need GOT or GOTPLT to be created.
> //
> // The 4 types that relative GOTPLT are all x86 and x86-64 specific.
> - if (oneof<R_GOTPLTONLY_PC, R_GOTPLTREL, R_GOTPLT,
> R_TLSGD_GOTPLT>(Expr)) {
> - In.GotPlt->HasGotPltOffRel = true;
> + if (oneof<R_GOTPLTONLY_PC, R_GOTPLTREL, R_GOTPLT,
> R_TLSGD_GOTPLT>(expr)) {
> + in.gotPlt->hasGotPltOffRel = true;
> } else if (oneof<R_GOTONLY_PC, R_GOTREL, R_PPC64_TOCBASE,
> R_PPC64_RELAX_TOC>(
> - Expr)) {
> - In.Got->HasGotOffRel = true;
> + expr)) {
> + in.got->hasGotOffRel = true;
> }
>
> // Process some TLS relocations, including relaxing TLS relocations.
> // Note that this function does not handle all TLS relocations.
> - if (unsigned Processed =
> - handleTlsRelocation<ELFT>(Type, Sym, Sec, Offset, Addend,
> Expr)) {
> - I += (Processed - 1);
> + if (unsigned processed =
> + handleTlsRelocation<ELFT>(type, sym, sec, offset, addend,
> expr)) {
> + i += (processed - 1);
> return;
> }
>
> // We were asked not to generate PLT entries for ifuncs. Instead,
> pass the
> // direct relocation on through.
> - if (Sym.isGnuIFunc() && Config->ZIfuncNoplt) {
> - Sym.ExportDynamic = true;
> - Main->RelaDyn->addReloc(Type, &Sec, Offset, &Sym, Addend,
> R_ADDEND, Type);
> + if (sym.isGnuIFunc() && config->zIfuncNoplt) {
> + sym.exportDynamic = true;
> + mainPart->relaDyn->addReloc(type, &sec, offset, &sym, addend,
> R_ADDEND, type);
> return;
> }
>
> // Non-preemptible ifuncs require special handling. First, handle
> the usual
> // case where the symbol isn't one of these.
> - if (!Sym.isGnuIFunc() || Sym.IsPreemptible) {
> + if (!sym.isGnuIFunc() || sym.isPreemptible) {
> // If a relocation needs PLT, we create PLT and GOTPLT slots for
> the symbol.
> - if (needsPlt(Expr) && !Sym.isInPlt())
> - addPltEntry<ELFT>(In.Plt, In.GotPlt, In.RelaPlt,
> Target->PltRel, Sym);
> + if (needsPlt(expr) && !sym.isInPlt())
> + addPltEntry<ELFT>(in.plt, in.gotPlt, in.relaPlt,
> target->pltRel, sym);
>
> // Create a GOT slot if a relocation needs GOT.
> - if (needsGot(Expr)) {
> - if (Config->EMachine == EM_MIPS) {
> + if (needsGot(expr)) {
> + if (config->emachine == EM_MIPS) {
> // MIPS ABI has special rules to process GOT entries and
> doesn't
> // require relocation entries for them. A special case is TLS
> // relocations. In that case dynamic loader applies dynamic
> @@ -1223,9 +1223,9 @@ static void scanReloc(InputSectionBase &
> // See "Global Offset Table" in Chapter 5 in the following
> document
> // for detailed description:
> //
> https://urldefense.proofpoint.com/v2/url?u=ftp-3A__www.linux-2Dmips.org_pub_linux_mips_doc_ABI_mipsabi.pdf&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=RAkf3Vl5MWzirfmkwopuyQjQ-5uEE95ctSfXOidHyHs&e=
> - In.MipsGot->addEntry(*Sec.File, Sym, Addend, Expr);
> - } else if (!Sym.isInGot()) {
> - addGotEntry(Sym);
> + in.mipsGot->addEntry(*sec.file, sym, addend, expr);
> + } else if (!sym.isInGot()) {
> + addGotEntry(sym);
> }
> }
> } else {
> @@ -1275,9 +1275,9 @@ static void scanReloc(InputSectionBase &
> // the exact same way as a GOT entry, so we can avoid needing
> to make the
> // PLT entry canonical by translating such relocations into
> IRELATIVE
> // relocations in the RelaIplt.
> - if (!Sym.isInPlt()) {
> + if (!sym.isInPlt()) {
> // Create PLT and GOTPLT slots for the symbol.
> - Sym.IsInIplt = true;
> + sym.isInIplt = true;
>
> // Create a copy of the symbol to use as the target of the
> IRELATIVE
> // relocation in the IgotPlt. This is in case we make the PLT
> canonical
> @@ -1286,12 +1286,12 @@ static void scanReloc(InputSectionBase &
> // FIXME: Creating a copy of the symbol here is a bit of a
> hack. All
> // that's really needed to create the IRELATIVE is the section
> and value,
> // so ideally we should just need to copy those.
> - auto *DirectSym = make<Defined>(cast<Defined>(Sym));
> - addPltEntry<ELFT>(In.Iplt, In.IgotPlt, In.RelaIplt,
> Target->IRelativeRel,
> - *DirectSym);
> - Sym.PltIndex = DirectSym->PltIndex;
> + auto *directSym = make<Defined>(cast<Defined>(sym));
> + addPltEntry<ELFT>(in.iplt, in.igotPlt, in.relaIplt,
> target->iRelativeRel,
> + *directSym);
> + sym.pltIndex = directSym->pltIndex;
> }
> - if (Expr == R_ABS && Addend == 0 && (Sec.Flags & SHF_WRITE)) {
> + if (expr == R_ABS && addend == 0 && (sec.flags & SHF_WRITE)) {
> // We might be able to represent this as an IRELATIVE. But we
> don't know
> // yet whether some later relocation will make the symbol point
> to a
> // canonical PLT, which would make this either a dynamic
> RELATIVE (PIC) or
> @@ -1299,32 +1299,32 @@ static void scanReloc(InputSectionBase &
> // required to process the relocation, and after scanRelocs()
> has been
> // called on all relocations, the relocation is resolved by
> // addIRelativeRelocs().
> - IRelativeRelocs.push_back({Type, &Sec, Offset, &Sym});
> + iRelativeRelocs.push_back({type, &sec, offset, &sym});
> return;
> }
> - if (needsGot(Expr)) {
> + if (needsGot(expr)) {
> // Redirect GOT accesses to point to the Igot.
> //
> // This field is also used to keep track of whether we ever
> needed a GOT
> // entry. If we did and we make the PLT canonical later, we'll
> need to
> // create a GOT entry pointing to the PLT entry for Sym.
> - Sym.GotInIgot = true;
> - } else if (!needsPlt(Expr)) {
> + sym.gotInIgot = true;
> + } else if (!needsPlt(expr)) {
> // Make the ifunc's PLT entry canonical by changing the value
> of its
> // symbol to redirect all references to point to it.
> - unsigned EntryOffset = Sym.PltIndex * Target->PltEntrySize;
> - if (Config->ZRetpolineplt)
> - EntryOffset += Target->PltHeaderSize;
> -
> - auto &D = cast<Defined>(Sym);
> - D.Section = In.Iplt;
> - D.Value = EntryOffset;
> - D.Size = 0;
> + unsigned entryOffset = sym.pltIndex * target->pltEntrySize;
> + if (config->zRetpolineplt)
> + entryOffset += target->pltHeaderSize;
> +
> + auto &d = cast<Defined>(sym);
> + d.section = in.iplt;
> + d.value = entryOffset;
> + d.size = 0;
> // It's important to set the symbol type here so that dynamic
> loaders
> // don't try to call the PLT as if it were an ifunc resolver.
> - D.Type = STT_FUNC;
> + d.type = STT_FUNC;
>
> - if (Sym.GotInIgot) {
> + if (sym.gotInIgot) {
> // We previously encountered a GOT generating reference that
> we
> // redirected to the Igot. Now that the PLT entry is
> canonical we must
> // clear the redirection to the Igot and add a GOT entry. As
> we've
> @@ -1333,74 +1333,74 @@ static void scanReloc(InputSectionBase &
> //
> // We don't need to worry about creating a MIPS GOT here
> because ifuncs
> // aren't a thing on MIPS.
> - Sym.GotInIgot = false;
> - addGotEntry(Sym);
> + sym.gotInIgot = false;
> + addGotEntry(sym);
> }
> }
> }
>
> - processRelocAux<ELFT>(Sec, Expr, Type, Offset, Sym, Rel, Addend);
> + processRelocAux<ELFT>(sec, expr, type, offset, sym, rel, addend);
> }
>
> template <class ELFT, class RelTy>
> -static void scanRelocs(InputSectionBase &Sec, ArrayRef<RelTy> Rels) {
> - OffsetGetter GetOffset(Sec);
> +static void scanRelocs(InputSectionBase &sec, ArrayRef<RelTy> rels) {
> + OffsetGetter getOffset(sec);
>
> // Not all relocations end up in Sec.Relocations, but a lot do.
> - Sec.Relocations.reserve(Rels.size());
> + sec.relocations.reserve(rels.size());
>
> - for (auto I = Rels.begin(), End = Rels.end(); I != End;)
> - scanReloc<ELFT>(Sec, GetOffset, I, End);
> + for (auto i = rels.begin(), end = rels.end(); i != end;)
> + scanReloc<ELFT>(sec, getOffset, i, end);
>
> // Sort relocations by offset for more efficient searching for
> // R_RISCV_PCREL_HI20 and R_PPC64_ADDR64.
> - if (Config->EMachine == EM_RISCV ||
> - (Config->EMachine == EM_PPC64 && Sec.Name == ".toc"))
> - llvm::stable_sort(Sec.Relocations,
> - [](const Relocation &LHS, const Relocation
> &RHS) {
> - return LHS.Offset < RHS.Offset;
> + if (config->emachine == EM_RISCV ||
> + (config->emachine == EM_PPC64 && sec.name == ".toc"))
> + llvm::stable_sort(sec.relocations,
> + [](const Relocation &lhs, const Relocation
> &rhs) {
> + return lhs.offset < rhs.offset;
> });
> }
>
> -template <class ELFT> void elf::scanRelocations(InputSectionBase &S) {
> - if (S.AreRelocsRela)
> - scanRelocs<ELFT>(S, S.relas<ELFT>());
> +template <class ELFT> void elf::scanRelocations(InputSectionBase &s) {
> + if (s.areRelocsRela)
> + scanRelocs<ELFT>(s, s.relas<ELFT>());
> else
> - scanRelocs<ELFT>(S, S.rels<ELFT>());
> + scanRelocs<ELFT>(s, s.rels<ELFT>());
> }
>
> // Figure out which representation to use for any absolute relocs to
> // non-preemptible ifuncs that we visited during scanRelocs().
> void elf::addIRelativeRelocs() {
> - for (IRelativeReloc &R : IRelativeRelocs) {
> - if (R.Sym->Type == STT_GNU_IFUNC)
> - In.RelaIplt->addReloc(
> - {Target->IRelativeRel, R.Sec, R.Offset, true, R.Sym, 0});
> - else if (Config->Pic)
> - addRelativeReloc(R.Sec, R.Offset, R.Sym, 0, R_ABS, R.Type);
> + for (IRelativeReloc &r : iRelativeRelocs) {
> + if (r.sym->type == STT_GNU_IFUNC)
> + in.relaIplt->addReloc(
> + {target->iRelativeRel, r.sec, r.offset, true, r.sym, 0});
> + else if (config->isPic)
> + addRelativeReloc(r.sec, r.offset, r.sym, 0, R_ABS, r.type);
> else
> - R.Sec->Relocations.push_back({R_ABS, R.Type, R.Offset, 0,
> R.Sym});
> + r.sec->relocations.push_back({R_ABS, r.type, r.offset, 0,
> r.sym});
> }
> - IRelativeRelocs.clear();
> + iRelativeRelocs.clear();
> }
>
> -static bool mergeCmp(const InputSection *A, const InputSection *B) {
> +static bool mergeCmp(const InputSection *a, const InputSection *b) {
> // std::merge requires a strict weak ordering.
> - if (A->OutSecOff < B->OutSecOff)
> + if (a->outSecOff < b->outSecOff)
> return true;
>
> - if (A->OutSecOff == B->OutSecOff) {
> - auto *TA = dyn_cast<ThunkSection>(A);
> - auto *TB = dyn_cast<ThunkSection>(B);
> + if (a->outSecOff == b->outSecOff) {
> + auto *ta = dyn_cast<ThunkSection>(a);
> + auto *tb = dyn_cast<ThunkSection>(b);
>
> // Check if Thunk is immediately before any specific Target
> // InputSection for example Mips LA25 Thunks.
> - if (TA && TA->getTargetInputSection() == B)
> + if (ta && ta->getTargetInputSection() == b)
> return true;
>
> // Place Thunk Sections without specific targets before
> // non-Thunk Sections.
> - if (TA && !TB && !TA->getTargetInputSection())
> + if (ta && !tb && !ta->getTargetInputSection())
> return true;
> }
>
> @@ -1410,14 +1410,14 @@ static bool mergeCmp(const InputSection
> // Call Fn on every executable InputSection accessed via the linker
> script
> // InputSectionDescription::Sections.
> static void forEachInputSectionDescription(
> - ArrayRef<OutputSection *> OutputSections,
> - llvm::function_ref<void(OutputSection *, InputSectionDescription
> *)> Fn) {
> - for (OutputSection *OS : OutputSections) {
> - if (!(OS->Flags & SHF_ALLOC) || !(OS->Flags & SHF_EXECINSTR))
> + ArrayRef<OutputSection *> outputSections,
> + llvm::function_ref<void(OutputSection *, InputSectionDescription
> *)> fn) {
> + for (OutputSection *os : outputSections) {
> + if (!(os->flags & SHF_ALLOC) || !(os->flags & SHF_EXECINSTR))
> continue;
> - for (BaseCommand *BC : OS->SectionCommands)
> - if (auto *ISD = dyn_cast<InputSectionDescription>(BC))
> - Fn(OS, ISD);
> + for (BaseCommand *bc : os->sectionCommands)
> + if (auto *isd = dyn_cast<InputSectionDescription>(bc))
> + fn(os, isd);
> }
> }
>
> @@ -1512,54 +1512,54 @@ static void forEachInputSectionDescripti
> // in the Sections vector, and recalculate the InputSection output
> section
> // offsets.
> // This may invalidate any output section offsets stored outside of
> InputSection
> -void ThunkCreator::mergeThunks(ArrayRef<OutputSection *>
> OutputSections) {
> +void ThunkCreator::mergeThunks(ArrayRef<OutputSection *>
> outputSections) {
> forEachInputSectionDescription(
> - OutputSections, [&](OutputSection *OS, InputSectionDescription
> *ISD) {
> - if (ISD->ThunkSections.empty())
> + outputSections, [&](OutputSection *os, InputSectionDescription
> *isd) {
> + if (isd->thunkSections.empty())
> return;
>
> // Remove any zero sized precreated Thunks.
> - llvm::erase_if(ISD->ThunkSections,
> - [](const std::pair<ThunkSection *, uint32_t>
> &TS) {
> - return TS.first->getSize() == 0;
> + llvm::erase_if(isd->thunkSections,
> + [](const std::pair<ThunkSection *, uint32_t>
> &ts) {
> + return ts.first->getSize() == 0;
> });
>
> // ISD->ThunkSections contains all created ThunkSections,
> including
> // those inserted in previous passes. Extract the Thunks
> created this
> // pass and order them in ascending OutSecOff.
> - std::vector<ThunkSection *> NewThunks;
> - for (const std::pair<ThunkSection *, uint32_t> TS :
> ISD->ThunkSections)
> - if (TS.second == Pass)
> - NewThunks.push_back(TS.first);
> - llvm::stable_sort(NewThunks,
> - [](const ThunkSection *A, const
> ThunkSection *B) {
> - return A->OutSecOff < B->OutSecOff;
> + std::vector<ThunkSection *> newThunks;
> + for (const std::pair<ThunkSection *, uint32_t> ts :
> isd->thunkSections)
> + if (ts.second == pass)
> + newThunks.push_back(ts.first);
> + llvm::stable_sort(newThunks,
> + [](const ThunkSection *a, const
> ThunkSection *b) {
> + return a->outSecOff < b->outSecOff;
> });
>
> // Merge sorted vectors of Thunks and InputSections by
> OutSecOff
> - std::vector<InputSection *> Tmp;
> - Tmp.reserve(ISD->Sections.size() + NewThunks.size());
> + std::vector<InputSection *> tmp;
> + tmp.reserve(isd->sections.size() + newThunks.size());
>
> - std::merge(ISD->Sections.begin(), ISD->Sections.end(),
> - NewThunks.begin(), NewThunks.end(),
> std::back_inserter(Tmp),
> + std::merge(isd->sections.begin(), isd->sections.end(),
> + newThunks.begin(), newThunks.end(),
> std::back_inserter(tmp),
> mergeCmp);
>
> - ISD->Sections = std::move(Tmp);
> + isd->sections = std::move(tmp);
> });
> }
>
> // Find or create a ThunkSection within the InputSectionDescription
> (ISD) that
> // is in range of Src. An ISD maps to a range of InputSections
> described by a
> // linker script section pattern such as { .text .text.* }.
> -ThunkSection *ThunkCreator::getISDThunkSec(OutputSection *OS,
> InputSection *IS,
> - InputSectionDescription
> *ISD,
> - uint32_t Type, uint64_t
> Src) {
> - for (std::pair<ThunkSection *, uint32_t> TP : ISD->ThunkSections) {
> - ThunkSection *TS = TP.first;
> - uint64_t TSBase = OS->Addr + TS->OutSecOff;
> - uint64_t TSLimit = TSBase + TS->getSize();
> - if (Target->inBranchRange(Type, Src, (Src > TSLimit) ? TSBase :
> TSLimit))
> - return TS;
> +ThunkSection *ThunkCreator::getISDThunkSec(OutputSection *os,
> InputSection *isec,
> + InputSectionDescription
> *isd,
> + uint32_t type, uint64_t
> src) {
> + for (std::pair<ThunkSection *, uint32_t> tp : isd->thunkSections) {
> + ThunkSection *ts = tp.first;
> + uint64_t tsBase = os->addr + ts->outSecOff;
> + uint64_t tsLimit = tsBase + ts->getSize();
> + if (target->inBranchRange(type, src, (src > tsLimit) ? tsBase :
> tsLimit))
> + return ts;
> }
>
> // No suitable ThunkSection exists. This can happen when there is a
> branch
> @@ -1567,40 +1567,40 @@ ThunkSection *ThunkCreator::getISDThunkS
> // many Thunks. Create a new ThunkSection as close to the
> InputSection as
> // possible. Error if InputSection is so large we cannot place
> ThunkSection
> // anywhere in Range.
> - uint64_t ThunkSecOff = IS->OutSecOff;
> - if (!Target->inBranchRange(Type, Src, OS->Addr + ThunkSecOff)) {
> - ThunkSecOff = IS->OutSecOff + IS->getSize();
> - if (!Target->inBranchRange(Type, Src, OS->Addr + ThunkSecOff))
> + uint64_t thunkSecOff = isec->outSecOff;
> + if (!target->inBranchRange(type, src, os->addr + thunkSecOff)) {
> + thunkSecOff = isec->outSecOff + isec->getSize();
> + if (!target->inBranchRange(type, src, os->addr + thunkSecOff))
> fatal("InputSection too large for range extension thunk " +
> - IS->getObjMsg(Src - (OS->Addr + IS->OutSecOff)));
> + isec->getObjMsg(src - (os->addr + isec->outSecOff)));
> }
> - return addThunkSection(OS, ISD, ThunkSecOff);
> + return addThunkSection(os, isd, thunkSecOff);
> }
>
> // Add a Thunk that needs to be placed in a ThunkSection that
> immediately
> // precedes its Target.
> -ThunkSection *ThunkCreator::getISThunkSec(InputSection *IS) {
> - ThunkSection *TS = ThunkedSections.lookup(IS);
> - if (TS)
> - return TS;
> +ThunkSection *ThunkCreator::getISThunkSec(InputSection *isec) {
> + ThunkSection *ts = thunkedSections.lookup(isec);
> + if (ts)
> + return ts;
>
> // Find InputSectionRange within Target Output Section (TOS) that
> the
> // InputSection (IS) that we need to precede is in.
> - OutputSection *TOS = IS->getParent();
> - for (BaseCommand *BC : TOS->SectionCommands) {
> - auto *ISD = dyn_cast<InputSectionDescription>(BC);
> - if (!ISD || ISD->Sections.empty())
> + OutputSection *tos = isec->getParent();
> + for (BaseCommand *bc : tos->sectionCommands) {
> + auto *isd = dyn_cast<InputSectionDescription>(bc);
> + if (!isd || isd->sections.empty())
> continue;
>
> - InputSection *First = ISD->Sections.front();
> - InputSection *Last = ISD->Sections.back();
> + InputSection *first = isd->sections.front();
> + InputSection *last = isd->sections.back();
>
> - if (IS->OutSecOff < First->OutSecOff || Last->OutSecOff <
> IS->OutSecOff)
> + if (isec->outSecOff < first->outSecOff || last->outSecOff <
> isec->outSecOff)
> continue;
>
> - TS = addThunkSection(TOS, ISD, IS->OutSecOff);
> - ThunkedSections[IS] = TS;
> - return TS;
> + ts = addThunkSection(tos, isd, isec->outSecOff);
> + thunkedSections[isec] = ts;
> + return ts;
> }
>
> return nullptr;
> @@ -1623,93 +1623,93 @@ ThunkSection *ThunkCreator::getISThunkSe
> // distance from a thunk to its target will be sufficiently small to
> // allow for the creation of a short thunk.
> void ThunkCreator::createInitialThunkSections(
> - ArrayRef<OutputSection *> OutputSections) {
> - uint32_t ThunkSectionSpacing = Target->getThunkSectionSpacing();
> + ArrayRef<OutputSection *> outputSections) {
> + uint32_t thunkSectionSpacing = target->getThunkSectionSpacing();
>
> forEachInputSectionDescription(
> - OutputSections, [&](OutputSection *OS, InputSectionDescription
> *ISD) {
> - if (ISD->Sections.empty())
> + outputSections, [&](OutputSection *os, InputSectionDescription
> *isd) {
> + if (isd->sections.empty())
> return;
>
> - uint32_t ISDBegin = ISD->Sections.front()->OutSecOff;
> - uint32_t ISDEnd =
> - ISD->Sections.back()->OutSecOff +
> ISD->Sections.back()->getSize();
> - uint32_t LastThunkLowerBound = -1;
> - if (ISDEnd - ISDBegin > ThunkSectionSpacing * 2)
> - LastThunkLowerBound = ISDEnd - ThunkSectionSpacing;
> -
> - uint32_t ISLimit;
> - uint32_t PrevISLimit = ISDBegin;
> - uint32_t ThunkUpperBound = ISDBegin + ThunkSectionSpacing;
> -
> - for (const InputSection *IS : ISD->Sections) {
> - ISLimit = IS->OutSecOff + IS->getSize();
> - if (ISLimit > ThunkUpperBound) {
> - addThunkSection(OS, ISD, PrevISLimit);
> - ThunkUpperBound = PrevISLimit + ThunkSectionSpacing;
> + uint32_t isdBegin = isd->sections.front()->outSecOff;
> + uint32_t isdEnd =
> + isd->sections.back()->outSecOff +
> isd->sections.back()->getSize();
> + uint32_t lastThunkLowerBound = -1;
> + if (isdEnd - isdBegin > thunkSectionSpacing * 2)
> + lastThunkLowerBound = isdEnd - thunkSectionSpacing;
> +
> + uint32_t isecLimit;
> + uint32_t prevISLimit = isdBegin;
> + uint32_t thunkUpperBound = isdBegin + thunkSectionSpacing;
> +
> + for (const InputSection *isec : isd->sections) {
> + isecLimit = isec->outSecOff + isec->getSize();
> + if (isecLimit > thunkUpperBound) {
> + addThunkSection(os, isd, prevISLimit);
> + thunkUpperBound = prevISLimit + thunkSectionSpacing;
> }
> - if (ISLimit > LastThunkLowerBound)
> + if (isecLimit > lastThunkLowerBound)
> break;
> - PrevISLimit = ISLimit;
> + prevISLimit = isecLimit;
> }
> - addThunkSection(OS, ISD, ISLimit);
> + addThunkSection(os, isd, isecLimit);
> });
> }
>
> -ThunkSection *ThunkCreator::addThunkSection(OutputSection *OS,
> - InputSectionDescription
> *ISD,
> - uint64_t Off) {
> - auto *TS = make<ThunkSection>(OS, Off);
> - TS->Partition = OS->Partition;
> - ISD->ThunkSections.push_back({TS, Pass});
> - return TS;
> +ThunkSection *ThunkCreator::addThunkSection(OutputSection *os,
> + InputSectionDescription
> *isd,
> + uint64_t off) {
> + auto *ts = make<ThunkSection>(os, off);
> + ts->partition = os->partition;
> + isd->thunkSections.push_back({ts, pass});
> + return ts;
> }
>
> -static bool isThunkSectionCompatible(InputSection *Source,
> - SectionBase *Target) {
> +static bool isThunkSectionCompatible(InputSection *source,
> + SectionBase *target) {
> // We can't reuse thunks in different loadable partitions because
> they might
> // not be loaded. But partition 1 (the main partition) will always
> be loaded.
> - if (Source->Partition != Target->Partition)
> - return Target->Partition == 1;
> + if (source->partition != target->partition)
> + return target->partition == 1;
> return true;
> }
>
> -std::pair<Thunk *, bool> ThunkCreator::getThunk(InputSection *IS,
> - Relocation &Rel,
> uint64_t Src) {
> - std::vector<Thunk *> *ThunkVec = nullptr;
> +std::pair<Thunk *, bool> ThunkCreator::getThunk(InputSection *isec,
> + Relocation &rel,
> uint64_t src) {
> + std::vector<Thunk *> *thunkVec = nullptr;
>
> // We use (section, offset) pair to find the thunk position if
> possible so
> // that we create only one thunk for aliased symbols or ICFed
> sections.
> - if (auto *D = dyn_cast<Defined>(Rel.Sym))
> - if (!D->isInPlt() && D->Section)
> - ThunkVec = &ThunkedSymbolsBySection[{D->Section->Repl,
> D->Value}];
> - if (!ThunkVec)
> - ThunkVec = &ThunkedSymbols[Rel.Sym];
> + if (auto *d = dyn_cast<Defined>(rel.sym))
> + if (!d->isInPlt() && d->section)
> + thunkVec = &thunkedSymbolsBySection[{d->section->repl,
> d->value}];
> + if (!thunkVec)
> + thunkVec = &thunkedSymbols[rel.sym];
>
> // Check existing Thunks for Sym to see if they can be reused
> - for (Thunk *T : *ThunkVec)
> - if (isThunkSectionCompatible(IS, T->getThunkTargetSym()->Section)
> &&
> - T->isCompatibleWith(*IS, Rel) &&
> - Target->inBranchRange(Rel.Type, Src,
> T->getThunkTargetSym()->getVA()))
> - return std::make_pair(T, false);
> + for (Thunk *t : *thunkVec)
> + if (isThunkSectionCompatible(isec,
> t->getThunkTargetSym()->section) &&
> + t->isCompatibleWith(*isec, rel) &&
> + target->inBranchRange(rel.type, src,
> t->getThunkTargetSym()->getVA()))
> + return std::make_pair(t, false);
>
> // No existing compatible Thunk in range, create a new one
> - Thunk *T = addThunk(*IS, Rel);
> - ThunkVec->push_back(T);
> - return std::make_pair(T, true);
> + Thunk *t = addThunk(*isec, rel);
> + thunkVec->push_back(t);
> + return std::make_pair(t, true);
> }
>
> // Return true if the relocation target is an in range Thunk.
> // Return false if the relocation is not to a Thunk. If the
> relocation target
> // was originally to a Thunk, but is no longer in range we revert the
> // relocation back to its original non-Thunk target.
> -bool ThunkCreator::normalizeExistingThunk(Relocation &Rel, uint64_t
> Src) {
> - if (Thunk *T = Thunks.lookup(Rel.Sym)) {
> - if (Target->inBranchRange(Rel.Type, Src, Rel.Sym->getVA()))
> +bool ThunkCreator::normalizeExistingThunk(Relocation &rel, uint64_t
> src) {
> + if (Thunk *t = thunks.lookup(rel.sym)) {
> + if (target->inBranchRange(rel.type, src, rel.sym->getVA()))
> return true;
> - Rel.Sym = &T->Destination;
> - if (Rel.Sym->isInPlt())
> - Rel.Expr = toPlt(Rel.Expr);
> + rel.sym = &t->destination;
> + if (rel.sym->isInPlt())
> + rel.expr = toPlt(rel.expr);
> }
> return false;
> }
> @@ -1739,15 +1739,15 @@ bool ThunkCreator::normalizeExistingThun
> // made no changes. If the target requires range extension thunks,
> currently
> // ARM, then any future change in offset between caller and callee
> risks a
> // relocation out of range error.
> -bool ThunkCreator::createThunks(ArrayRef<OutputSection *>
> OutputSections) {
> - bool AddressesChanged = false;
> +bool ThunkCreator::createThunks(ArrayRef<OutputSection *>
> outputSections) {
> + bool addressesChanged = false;
>
> - if (Pass == 0 && Target->getThunkSectionSpacing())
> - createInitialThunkSections(OutputSections);
> + if (pass == 0 && target->getThunkSectionSpacing())
> + createInitialThunkSections(outputSections);
>
> // With Thunk Size much smaller than branch range we expect to
> // converge quickly; if we get to 10 something has gone wrong.
> - if (Pass == 10)
> + if (pass == 10)
> fatal("thunk creation not converged");
>
> // Create all the Thunks and insert them into synthetic
> ThunkSections. The
> @@ -1756,57 +1756,57 @@ bool ThunkCreator::createThunks(ArrayRef
> // ThunkSections as ThunkSections are not always inserted into the
> same
> // InputSectionDescription as the caller.
> forEachInputSectionDescription(
> - OutputSections, [&](OutputSection *OS, InputSectionDescription
> *ISD) {
> - for (InputSection *IS : ISD->Sections)
> - for (Relocation &Rel : IS->Relocations) {
> - uint64_t Src = IS->getVA(Rel.Offset);
> + outputSections, [&](OutputSection *os, InputSectionDescription
> *isd) {
> + for (InputSection *isec : isd->sections)
> + for (Relocation &rel : isec->relocations) {
> + uint64_t src = isec->getVA(rel.offset);
>
> // If we are a relocation to an existing Thunk, check if
> it is
> // still in range. If not then Rel will be altered to
> point to its
> // original target so another Thunk can be generated.
> - if (Pass > 0 && normalizeExistingThunk(Rel, Src))
> + if (pass > 0 && normalizeExistingThunk(rel, src))
> continue;
>
> - if (!Target->needsThunk(Rel.Expr, Rel.Type, IS->File, Src,
> - *Rel.Sym))
> + if (!target->needsThunk(rel.expr, rel.type, isec->file,
> src,
> + *rel.sym))
> continue;
>
> - Thunk *T;
> - bool IsNew;
> - std::tie(T, IsNew) = getThunk(IS, Rel, Src);
> + Thunk *t;
> + bool isNew;
> + std::tie(t, isNew) = getThunk(isec, rel, src);
>
> - if (IsNew) {
> + if (isNew) {
> // Find or create a ThunkSection for the new Thunk
> - ThunkSection *TS;
> - if (auto *TIS = T->getTargetInputSection())
> - TS = getISThunkSec(TIS);
> + ThunkSection *ts;
> + if (auto *tis = t->getTargetInputSection())
> + ts = getISThunkSec(tis);
> else
> - TS = getISDThunkSec(OS, IS, ISD, Rel.Type, Src);
> - TS->addThunk(T);
> - Thunks[T->getThunkTargetSym()] = T;
> + ts = getISDThunkSec(os, isec, isd, rel.type, src);
> + ts->addThunk(t);
> + thunks[t->getThunkTargetSym()] = t;
> }
>
> // Redirect relocation to Thunk, we never go via the PLT
> to a Thunk
> - Rel.Sym = T->getThunkTargetSym();
> - Rel.Expr = fromPlt(Rel.Expr);
> + rel.sym = t->getThunkTargetSym();
> + rel.expr = fromPlt(rel.expr);
>
> // The addend of R_PPC_PLTREL24 should be ignored after
> changing to
> // R_PC.
> - if (Config->EMachine == EM_PPC && Rel.Type ==
> R_PPC_PLTREL24)
> - Rel.Addend = 0;
> + if (config->emachine == EM_PPC && rel.type ==
> R_PPC_PLTREL24)
> + rel.addend = 0;
> }
>
> - for (auto &P : ISD->ThunkSections)
> - AddressesChanged |= P.first->assignOffsets();
> + for (auto &p : isd->thunkSections)
> + addressesChanged |= p.first->assignOffsets();
> });
>
> - for (auto &P : ThunkedSections)
> - AddressesChanged |= P.second->assignOffsets();
> + for (auto &p : thunkedSections)
> + addressesChanged |= p.second->assignOffsets();
>
> // Merge all created synthetic ThunkSections back into OutputSection
> - mergeThunks(OutputSections);
> - ++Pass;
> - return AddressesChanged;
> + mergeThunks(outputSections);
> + ++pass;
> + return addressesChanged;
> }
>
> template void elf::scanRelocations<ELF32LE>(InputSectionBase &);
>
> Modified: lld/trunk/ELF/Relocations.h
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_Relocations.h-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=IZNXgUqBVso44zhxE6L07NsZ4SDVaDvumSQi1pNMQYw&e=
>
> ==============================================================================
> --- lld/trunk/ELF/Relocations.h (original)
> +++ lld/trunk/ELF/Relocations.h Tue Jul 9 22:00:37 2019
> @@ -102,11 +102,11 @@ enum RelExpr {
>
> // Architecture-neutral representation of relocation.
> struct Relocation {
> - RelExpr Expr;
> - RelType Type;
> - uint64_t Offset;
> - int64_t Addend;
> - Symbol *Sym;
> + RelExpr expr;
> + RelType type;
> + uint64_t offset;
> + int64_t addend;
> + Symbol *sym;
> };
>
> // This function writes undefined symbol diagnostics to an internal
> buffer.
> @@ -125,57 +125,57 @@ struct InputSectionDescription;
> class ThunkCreator {
> public:
> // Return true if Thunks have been added to OutputSections
> - bool createThunks(ArrayRef<OutputSection *> OutputSections);
> + bool createThunks(ArrayRef<OutputSection *> outputSections);
>
> // The number of completed passes of createThunks this permits us
> // to do one time initialization on Pass 0 and put a limit on the
> // number of times it can be called to prevent infinite loops.
> - uint32_t Pass = 0;
> + uint32_t pass = 0;
>
> private:
> - void mergeThunks(ArrayRef<OutputSection *> OutputSections);
> + void mergeThunks(ArrayRef<OutputSection *> outputSections);
>
> - ThunkSection *getISDThunkSec(OutputSection *OS, InputSection *IS,
> - InputSectionDescription *ISD, uint32_t
> Type,
> - uint64_t Src);
> + ThunkSection *getISDThunkSec(OutputSection *os, InputSection *isec,
> + InputSectionDescription *isd, uint32_t
> type,
> + uint64_t src);
>
> - ThunkSection *getISThunkSec(InputSection *IS);
> + ThunkSection *getISThunkSec(InputSection *isec);
>
> - void createInitialThunkSections(ArrayRef<OutputSection *>
> OutputSections);
> + void createInitialThunkSections(ArrayRef<OutputSection *>
> outputSections);
>
> - std::pair<Thunk *, bool> getThunk(InputSection *IS, Relocation &Rel,
> - uint64_t Src);
> + std::pair<Thunk *, bool> getThunk(InputSection *isec, Relocation
> &rel,
> + uint64_t src);
>
> - ThunkSection *addThunkSection(OutputSection *OS,
> InputSectionDescription *,
> - uint64_t Off);
> + ThunkSection *addThunkSection(OutputSection *os,
> InputSectionDescription *,
> + uint64_t off);
>
> - bool normalizeExistingThunk(Relocation &Rel, uint64_t Src);
> + bool normalizeExistingThunk(Relocation &rel, uint64_t src);
>
> // Record all the available Thunks for a Symbol
> llvm::DenseMap<std::pair<SectionBase *, uint64_t>,
> std::vector<Thunk *>>
> - ThunkedSymbolsBySection;
> - llvm::DenseMap<Symbol *, std::vector<Thunk *>> ThunkedSymbols;
> + thunkedSymbolsBySection;
> + llvm::DenseMap<Symbol *, std::vector<Thunk *>> thunkedSymbols;
>
> // Find a Thunk from the Thunks symbol definition, we can use this
> to find
> // the Thunk from a relocation to the Thunks symbol definition.
> - llvm::DenseMap<Symbol *, Thunk *> Thunks;
> + llvm::DenseMap<Symbol *, Thunk *> thunks;
>
> // Track InputSections that have an inline ThunkSection placed in
> front
> // an inline ThunkSection may have control fall through to the
> section below
> // so we need to make sure that there is only one of them.
> // The Mips LA25 Thunk is an example of an inline ThunkSection.
> - llvm::DenseMap<InputSection *, ThunkSection *> ThunkedSections;
> + llvm::DenseMap<InputSection *, ThunkSection *> thunkedSections;
> };
>
> // Return a int64_t to make sure we get the sign extension out of the
> way as
> // early as possible.
> template <class ELFT>
> -static inline int64_t getAddend(const typename ELFT::Rel &Rel) {
> +static inline int64_t getAddend(const typename ELFT::Rel &rel) {
> return 0;
> }
> template <class ELFT>
> -static inline int64_t getAddend(const typename ELFT::Rela &Rel) {
> - return Rel.r_addend;
> +static inline int64_t getAddend(const typename ELFT::Rela &rel) {
> + return rel.r_addend;
> }
> } // namespace elf
> } // namespace lld
>
> Modified: lld/trunk/ELF/ScriptLexer.cpp
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_ScriptLexer.cpp-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=bogt4b2e5vJ4_FiRFVmkIhIrMcuGzzNb6KD7U0ZrSTo&e=
>
> ==============================================================================
> --- lld/trunk/ELF/ScriptLexer.cpp (original)
> +++ lld/trunk/ELF/ScriptLexer.cpp Tue Jul 9 22:00:37 2019
> @@ -41,169 +41,169 @@ using namespace lld::elf;
>
> // Returns a whole line containing the current token.
> StringRef ScriptLexer::getLine() {
> - StringRef S = getCurrentMB().getBuffer();
> - StringRef Tok = Tokens[Pos - 1];
> + StringRef s = getCurrentMB().getBuffer();
> + StringRef tok = tokens[pos - 1];
>
> - size_t Pos = S.rfind('\n', Tok.data() - S.data());
> - if (Pos != StringRef::npos)
> - S = S.substr(Pos + 1);
> - return S.substr(0, S.find_first_of("\r\n"));
> + size_t pos = s.rfind('\n', tok.data() - s.data());
> + if (pos != StringRef::npos)
> + s = s.substr(pos + 1);
> + return s.substr(0, s.find_first_of("\r\n"));
> }
>
> // Returns 1-based line number of the current token.
> size_t ScriptLexer::getLineNumber() {
> - StringRef S = getCurrentMB().getBuffer();
> - StringRef Tok = Tokens[Pos - 1];
> - return S.substr(0, Tok.data() - S.data()).count('\n') + 1;
> + StringRef s = getCurrentMB().getBuffer();
> + StringRef tok = tokens[pos - 1];
> + return s.substr(0, tok.data() - s.data()).count('\n') + 1;
> }
>
> // Returns 0-based column number of the current token.
> size_t ScriptLexer::getColumnNumber() {
> - StringRef Tok = Tokens[Pos - 1];
> - return Tok.data() - getLine().data();
> + StringRef tok = tokens[pos - 1];
> + return tok.data() - getLine().data();
> }
>
> std::string ScriptLexer::getCurrentLocation() {
> - std::string Filename = getCurrentMB().getBufferIdentifier();
> - return (Filename + ":" + Twine(getLineNumber())).str();
> + std::string filename = getCurrentMB().getBufferIdentifier();
> + return (filename + ":" + Twine(getLineNumber())).str();
> }
>
> -ScriptLexer::ScriptLexer(MemoryBufferRef MB) { tokenize(MB); }
> +ScriptLexer::ScriptLexer(MemoryBufferRef mb) { tokenize(mb); }
>
> // We don't want to record cascading errors. Keep only the first one.
> -void ScriptLexer::setError(const Twine &Msg) {
> +void ScriptLexer::setError(const Twine &msg) {
> if (errorCount())
> return;
>
> - std::string S = (getCurrentLocation() + ": " + Msg).str();
> - if (Pos)
> - S += "\n>>> " + getLine().str() + "\n>>> " +
> + std::string s = (getCurrentLocation() + ": " + msg).str();
> + if (pos)
> + s += "\n>>> " + getLine().str() + "\n>>> " +
> std::string(getColumnNumber(), ' ') + "^";
> - error(S);
> + error(s);
> }
>
> // Split S into linker script tokens.
> -void ScriptLexer::tokenize(MemoryBufferRef MB) {
> - std::vector<StringRef> Vec;
> - MBs.push_back(MB);
> - StringRef S = MB.getBuffer();
> - StringRef Begin = S;
> +void ScriptLexer::tokenize(MemoryBufferRef mb) {
> + std::vector<StringRef> vec;
> + mbs.push_back(mb);
> + StringRef s = mb.getBuffer();
> + StringRef begin = s;
>
> for (;;) {
> - S = skipSpace(S);
> - if (S.empty())
> + s = skipSpace(s);
> + if (s.empty())
> break;
>
> // Quoted token. Note that double-quote characters are parts of a
> token
> // because, in a glob match context, only unquoted tokens are
> interpreted
> // as glob patterns. Double-quoted tokens are literal patterns in
> that
> // context.
> - if (S.startswith("\"")) {
> - size_t E = S.find("\"", 1);
> - if (E == StringRef::npos) {
> - StringRef Filename = MB.getBufferIdentifier();
> - size_t Lineno = Begin.substr(0, S.data() -
> Begin.data()).count('\n');
> - error(Filename + ":" + Twine(Lineno + 1) + ": unclosed
> quote");
> + if (s.startswith("\"")) {
> + size_t e = s.find("\"", 1);
> + if (e == StringRef::npos) {
> + StringRef filename = mb.getBufferIdentifier();
> + size_t lineno = begin.substr(0, s.data() -
> begin.data()).count('\n');
> + error(filename + ":" + Twine(lineno + 1) + ": unclosed
> quote");
> return;
> }
>
> - Vec.push_back(S.take_front(E + 1));
> - S = S.substr(E + 1);
> + vec.push_back(s.take_front(e + 1));
> + s = s.substr(e + 1);
> continue;
> }
>
> // ">foo" is parsed to ">" and "foo", but ">>" is parsed to ">>".
> // "|", "||", "&" and "&&" are different operators.
> - if (S.startswith("<<") || S.startswith("<=") ||
> S.startswith(">>") ||
> - S.startswith(">=") || S.startswith("||") ||
> S.startswith("&&")) {
> - Vec.push_back(S.substr(0, 2));
> - S = S.substr(2);
> + if (s.startswith("<<") || s.startswith("<=") ||
> s.startswith(">>") ||
> + s.startswith(">=") || s.startswith("||") ||
> s.startswith("&&")) {
> + vec.push_back(s.substr(0, 2));
> + s = s.substr(2);
> continue;
> }
>
> // Unquoted token. This is more relaxed than tokens in C-like
> language,
> // so that you can write "file-name.cpp" as one bare token, for
> example.
> - size_t Pos = S.find_first_not_of(
> + size_t pos = s.find_first_not_of(
> "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
> "0123456789_.$/\\~=+[]*?-!^:");
>
> // A character that cannot start a word (which is usually a
> // punctuation) forms a single character token.
> - if (Pos == 0)
> - Pos = 1;
> - Vec.push_back(S.substr(0, Pos));
> - S = S.substr(Pos);
> + if (pos == 0)
> + pos = 1;
> + vec.push_back(s.substr(0, pos));
> + s = s.substr(pos);
> }
>
> - Tokens.insert(Tokens.begin() + Pos, Vec.begin(), Vec.end());
> + tokens.insert(tokens.begin() + pos, vec.begin(), vec.end());
> }
>
> // Skip leading whitespace characters or comments.
> -StringRef ScriptLexer::skipSpace(StringRef S) {
> +StringRef ScriptLexer::skipSpace(StringRef s) {
> for (;;) {
> - if (S.startswith("/*")) {
> - size_t E = S.find("*/", 2);
> - if (E == StringRef::npos) {
> + if (s.startswith("/*")) {
> + size_t e = s.find("*/", 2);
> + if (e == StringRef::npos) {
> error("unclosed comment in a linker script");
> return "";
> }
> - S = S.substr(E + 2);
> + s = s.substr(e + 2);
> continue;
> }
> - if (S.startswith("#")) {
> - size_t E = S.find('\n', 1);
> - if (E == StringRef::npos)
> - E = S.size() - 1;
> - S = S.substr(E + 1);
> + if (s.startswith("#")) {
> + size_t e = s.find('\n', 1);
> + if (e == StringRef::npos)
> + e = s.size() - 1;
> + s = s.substr(e + 1);
> continue;
> }
> - size_t Size = S.size();
> - S = S.ltrim();
> - if (S.size() == Size)
> - return S;
> + size_t size = s.size();
> + s = s.ltrim();
> + if (s.size() == size)
> + return s;
> }
> }
>
> // An erroneous token is handled as if it were the last token before
> EOF.
> -bool ScriptLexer::atEOF() { return errorCount() || Tokens.size() ==
> Pos; }
> +bool ScriptLexer::atEOF() { return errorCount() || tokens.size() ==
> pos; }
>
> // Split a given string as an expression.
> // This function returns "3", "*" and "5" for "3*5" for example.
> -static std::vector<StringRef> tokenizeExpr(StringRef S) {
> - StringRef Ops = "+-*/:!~=<>"; // List of operators
> +static std::vector<StringRef> tokenizeExpr(StringRef s) {
> + StringRef ops = "+-*/:!~=<>"; // List of operators
>
> // Quoted strings are literal strings, so we don't want to split it.
> - if (S.startswith("\""))
> - return {S};
> + if (s.startswith("\""))
> + return {s};
>
> // Split S with operators as separators.
> - std::vector<StringRef> Ret;
> - while (!S.empty()) {
> - size_t E = S.find_first_of(Ops);
> + std::vector<StringRef> ret;
> + while (!s.empty()) {
> + size_t e = s.find_first_of(ops);
>
> // No need to split if there is no operator.
> - if (E == StringRef::npos) {
> - Ret.push_back(S);
> + if (e == StringRef::npos) {
> + ret.push_back(s);
> break;
> }
>
> // Get a token before the opreator.
> - if (E != 0)
> - Ret.push_back(S.substr(0, E));
> + if (e != 0)
> + ret.push_back(s.substr(0, e));
>
> // Get the operator as a token.
> // Keep !=, ==, >=, <=, << and >> operators as a single tokens.
> - if (S.substr(E).startswith("!=") || S.substr(E).startswith("==")
> ||
> - S.substr(E).startswith(">=") || S.substr(E).startswith("<=")
> ||
> - S.substr(E).startswith("<<") || S.substr(E).startswith(">>"))
> {
> - Ret.push_back(S.substr(E, 2));
> - S = S.substr(E + 2);
> + if (s.substr(e).startswith("!=") || s.substr(e).startswith("==")
> ||
> + s.substr(e).startswith(">=") || s.substr(e).startswith("<=")
> ||
> + s.substr(e).startswith("<<") || s.substr(e).startswith(">>"))
> {
> + ret.push_back(s.substr(e, 2));
> + s = s.substr(e + 2);
> } else {
> - Ret.push_back(S.substr(E, 1));
> - S = S.substr(E + 1);
> + ret.push_back(s.substr(e, 1));
> + s = s.substr(e + 1);
> }
> }
> - return Ret;
> + return ret;
> }
>
> // In contexts where expressions are expected, the lexer should apply
> @@ -216,14 +216,14 @@ static std::vector<StringRef> tokenizeEx
> //
> // This function may split the current token into multiple tokens.
> void ScriptLexer::maybeSplitExpr() {
> - if (!InExpr || errorCount() || atEOF())
> + if (!inExpr || errorCount() || atEOF())
> return;
>
> - std::vector<StringRef> V = tokenizeExpr(Tokens[Pos]);
> - if (V.size() == 1)
> + std::vector<StringRef> v = tokenizeExpr(tokens[pos]);
> + if (v.size() == 1)
> return;
> - Tokens.erase(Tokens.begin() + Pos);
> - Tokens.insert(Tokens.begin() + Pos, V.begin(), V.end());
> + tokens.erase(tokens.begin() + pos);
> + tokens.insert(tokens.begin() + pos, v.begin(), v.end());
> }
>
> StringRef ScriptLexer::next() {
> @@ -235,28 +235,28 @@ StringRef ScriptLexer::next() {
> setError("unexpected EOF");
> return "";
> }
> - return Tokens[Pos++];
> + return tokens[pos++];
> }
>
> StringRef ScriptLexer::peek() {
> - StringRef Tok = next();
> + StringRef tok = next();
> if (errorCount())
> return "";
> - Pos = Pos - 1;
> - return Tok;
> + pos = pos - 1;
> + return tok;
> }
>
> StringRef ScriptLexer::peek2() {
> skip();
> - StringRef Tok = next();
> + StringRef tok = next();
> if (errorCount())
> return "";
> - Pos = Pos - 2;
> - return Tok;
> + pos = pos - 2;
> + return tok;
> }
>
> -bool ScriptLexer::consume(StringRef Tok) {
> - if (peek() == Tok) {
> +bool ScriptLexer::consume(StringRef tok) {
> + if (peek() == tok) {
> skip();
> return true;
> }
> @@ -264,12 +264,12 @@ bool ScriptLexer::consume(StringRef Tok)
> }
>
> // Consumes Tok followed by ":". Space is allowed between Tok and ":".
> -bool ScriptLexer::consumeLabel(StringRef Tok) {
> - if (consume((Tok + ":").str()))
> +bool ScriptLexer::consumeLabel(StringRef tok) {
> + if (consume((tok + ":").str()))
> return true;
> - if (Tokens.size() >= Pos + 2 && Tokens[Pos] == Tok &&
> - Tokens[Pos + 1] == ":") {
> - Pos += 2;
> + if (tokens.size() >= pos + 2 && tokens[pos] == tok &&
> + tokens[pos + 1] == ":") {
> + pos += 2;
> return true;
> }
> return false;
> @@ -277,24 +277,24 @@ bool ScriptLexer::consumeLabel(StringRef
>
> void ScriptLexer::skip() { (void)next(); }
>
> -void ScriptLexer::expect(StringRef Expect) {
> +void ScriptLexer::expect(StringRef expect) {
> if (errorCount())
> return;
> - StringRef Tok = next();
> - if (Tok != Expect)
> - setError(Expect + " expected, but got " + Tok);
> + StringRef tok = next();
> + if (tok != expect)
> + setError(expect + " expected, but got " + tok);
> }
>
> // Returns true if S encloses T.
> -static bool encloses(StringRef S, StringRef T) {
> - return S.bytes_begin() <= T.bytes_begin() && T.bytes_end() <=
> S.bytes_end();
> +static bool encloses(StringRef s, StringRef t) {
> + return s.bytes_begin() <= t.bytes_begin() && t.bytes_end() <=
> s.bytes_end();
> }
>
> MemoryBufferRef ScriptLexer::getCurrentMB() {
> // Find input buffer containing the current token.
> - assert(!MBs.empty() && Pos > 0);
> - for (MemoryBufferRef MB : MBs)
> - if (encloses(MB.getBuffer(), Tokens[Pos - 1]))
> - return MB;
> + assert(!mbs.empty() && pos > 0);
> + for (MemoryBufferRef mb : mbs)
> + if (encloses(mb.getBuffer(), tokens[pos - 1]))
> + return mb;
> llvm_unreachable("getCurrentMB: failed to find a token");
> }
>
> Modified: lld/trunk/ELF/ScriptLexer.h
> URL:
> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_ScriptLexer.h-3Frev-3D365595-26r1-3D365594-26r2-3D365595-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=8bcI67_1ONNJvMd_7f1oRNJDqxMewX8FIUsqPlyyTLQ&e=
>
> ==============================================================================
> --- lld/trunk/ELF/ScriptLexer.h (original)
> +++ lld/trunk/ELF/ScriptLexer.h Tue Jul 9 22:00:37 2019
> @@ -20,25 +20,25 @@ namespace elf {
>
> class ScriptLexer {
> public:
> - explicit ScriptLexer(MemoryBufferRef MB);
> + explicit ScriptLexer(MemoryBufferRef mb);
>
> - void setError(const Twine &Msg);
> - void tokenize(MemoryBufferRef MB);
> - static StringRef skipSpace(StringRef S);
> + void setError(const Twine &msg);
> + void tokenize(MemoryBufferRef mb);
> + static StringRef skipSpace(StringRef s);
> bool atEOF();
> StringRef next();
> StringRef peek();
> StringRef peek2();
> void skip();
> - bool consume(StringRef Tok);
> - void expect(StringRef Expect);
> - bool consumeLabel(StringRef Tok);
> + bool consume(StringRef tok);
> + void expect(StringRef expect);
> + bool consumeLabel(StringRef tok);
> std::string getCurrentLocation();
>
> - std::vector<MemoryBufferRef> MBs;
> - std::vector<StringRef> Tokens;
> - bool InExpr = false;
> - size_t Pos = 0;
> + std::vector<MemoryBufferRef> mbs;
> + std::vector<StringRef> tokens;
> + bool inExpr = false;
> + size_t pos = 0;
>
> private:
> void maybeSplitExpr();
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
>
> https://urldefense.proofpoint.com/v2/url?u=https-3A__lists.llvm.org_cgi-2Dbin_mailman_listinfo_llvm-2Dcommits&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=Eb7MNyrx6jtX9VvjFSFeXuc-dD82W7PUYvgHXx9M-wg&s=DClm3bAkJCRXvX7Qg6Lof3Sv4VvnPQVozNHWV5zPg-8&e=
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190711/46862b54/attachment-0001.html>
More information about the llvm-commits
mailing list