1
1
mirror of https://github.com/rui314/mold.git synced 2024-10-26 13:10:46 +03:00

Compare commits

...

10 Commits

Author SHA1 Message Date
Chen Wang
663e9f094d
Merge 18cacabec7 into 5b8594979b 2024-08-14 12:55:10 +01:00
Rui Ueyama
5b8594979b Reorganize directory structure 2024-08-14 20:52:09 +09:00
Rui Ueyama
7571305cd1 Fix CI 2024-08-14 20:06:28 +09:00
Rui Ueyama
0631f9750e Fix a Docker image build failure
Fixes https://github.com/rui314/mold/issues/1330
2024-08-14 19:10:40 +09:00
Rui Ueyama
b51d6ab5cb Avoid LD_PRELOAD 2024-08-14 19:10:40 +09:00
Rui Ueyama
93c4f35615 Fix minor issues 2024-08-14 17:38:53 +09:00
Rui Ueyama
510b2d68c0 Reorganize directory structure 2024-08-14 16:23:25 +09:00
Rui Ueyama
d6d8d2e494 [LoongArch] Fix symbol value computation for the extreme code model
The LoongArch extreme code model uses the following instructions to
materialize a 64-bit value in a regiter.

  pcalau12i $t1, %pc_hi20(g2)
  addi.d    $t0, $zero, %pc_lo12(g2)
  lu32i.d   $t0, %pc64_lo20(g2)
  lu52i.d   $t0, $t0, %pc64_hi12(g2)

The previous relocation formula expected that `page(pc)` would be
consistent for all the instructions, but this assumption is incorrect
if the instruction sequence crosses a 4 KiB boundary.

Now, the LoongArch psABI requires that the machine instructions must be
consecutive, and the relocations for lu32.d and lu52i.d uses
`page(pc - 8)` and `page(pc - 16)` instead of `page(pc)`.

This psABI change gave me an impression that the LoongArch's extreme code
model was poorly designed and inadequately tested. If these instructions
must be consecutive, only a single relocation referring to the beginning
of the instructions would suffice, which relocates all the following four
instructions at once.

Maybe we do not need to support the relocations for the extreme code model
because the code model was buggy at the spec level, which suggests that no
one is using them. But I'm not sure if it is safe to remove them, so let's
just follow the psABI change.
2024-08-14 13:52:12 +09:00
Rui Ueyama
9e0c1c81dd Refactor 2024-08-13 20:52:38 +09:00
Chen Wang
18cacabec7 docs: fixed a minor typo
Signed-off-by: Chen Wang <wangchen20@iscas.ac.cn>
2024-08-08 09:31:46 +08:00
480 changed files with 221 additions and 274 deletions

View File

@ -252,7 +252,7 @@ if(NOT APPLE AND NOT WIN32)
# Remove the default `lib` prefix
set_target_properties(mold-wrapper PROPERTIES PREFIX "")
target_link_libraries(mold-wrapper PRIVATE ${CMAKE_DL_LIBS})
target_sources(mold-wrapper PRIVATE elf/mold-wrapper.c)
target_sources(mold-wrapper PRIVATE src/mold-wrapper.c)
endif()
# If atomics doesn't work by default, add -latomic.
@ -284,15 +284,15 @@ add_custom_target(git_hash
COMMAND ${CMAKE_COMMAND}
-DSOURCE_DIR=${CMAKE_SOURCE_DIR}
-DOUTPUT_FILE=${CMAKE_BINARY_DIR}/git-hash.cc
-P ${CMAKE_SOURCE_DIR}/common/update-git-hash.cmake
DEPENDS common/update-git-hash.cmake
-P ${CMAKE_SOURCE_DIR}/lib/update-git-hash.cmake
DEPENDS lib/update-git-hash.cmake
BYPRODUCTS git-hash.cc
VERBATIM)
add_dependencies(mold git_hash)
# Create config.h file
configure_file(common/config.h.in config.h)
configure_file(lib/config.h.in config.h)
include_directories(${CMAKE_CURRENT_BINARY_DIR})
# Almost all functions are template in mold which take a target type
@ -308,35 +308,35 @@ list(APPEND MOLD_ELF_TARGETS
S390X SPARC64 M68K SH4 ALPHA LOONGARCH32 LOONGARCH64)
list(APPEND MOLD_ELF_TEMPLATE_FILES
elf/arch-loongarch.cc
elf/arch-riscv.cc
elf/cmdline.cc
elf/gc-sections.cc
elf/gdb-index.cc
elf/icf.cc
elf/input-files.cc
elf/input-sections.cc
elf/linker-script.cc
elf/main.cc
elf/mapfile.cc
elf/output-chunks.cc
elf/passes.cc
elf/relocatable.cc
elf/shrink-sections.cc
elf/thunks.cc
elf/tls.cc
src/arch-loongarch.cc
src/arch-riscv.cc
src/cmdline.cc
src/gc-sections.cc
src/gdb-index.cc
src/icf.cc
src/input-files.cc
src/input-sections.cc
src/linker-script.cc
src/main.cc
src/mapfile.cc
src/output-chunks.cc
src/passes.cc
src/relocatable.cc
src/shrink-sections.cc
src/thunks.cc
src/tls.cc
)
if(WIN32 AND NOT MINGW)
list(APPEND MOLD_ELF_TEMPLATE_FILES elf/lto-win32.cc)
list(APPEND MOLD_ELF_TEMPLATE_FILES src/lto-win32.cc)
else()
list(APPEND MOLD_ELF_TEMPLATE_FILES elf/lto-unix.cc)
list(APPEND MOLD_ELF_TEMPLATE_FILES src/lto-unix.cc)
endif()
if(WIN32)
list(APPEND MOLD_ELF_TEMPLATE_FILES elf/subprocess-win32.cc)
list(APPEND MOLD_ELF_TEMPLATE_FILES src/subprocess-win32.cc)
else()
list(APPEND MOLD_ELF_TEMPLATE_FILES elf/subprocess-unix.cc)
list(APPEND MOLD_ELF_TEMPLATE_FILES src/subprocess-unix.cc)
endif()
function(mold_instantiate_templates SOURCE TARGET)
@ -358,46 +358,46 @@ endforeach()
# Add other non-template source files.
target_sources(mold PRIVATE
common/compress.cc
common/crc32.cc
common/demangle.cc
common/filepath.cc
common/glob.cc
common/hyperloglog.cc
common/malloc.cc
common/multi-glob.cc
common/perf.cc
common/random.cc
common/tar.cc
elf/arch-alpha.cc
elf/arch-arm32.cc
elf/arch-arm64.cc
elf/arch-i386.cc
elf/arch-m68k.cc
elf/arch-ppc32.cc
elf/arch-ppc64v1.cc
elf/arch-ppc64v2.cc
elf/arch-s390x.cc
elf/arch-sh4.cc
elf/arch-sparc64.cc
elf/arch-x86-64.cc
elf/config.cc
elf/elf.cc
git-hash.cc
lib/compress.cc
lib/crc32.cc
lib/demangle.cc
lib/elf.cc
lib/filepath.cc
lib/glob.cc
lib/hyperloglog.cc
lib/malloc.cc
lib/multi-glob.cc
lib/perf.cc
lib/random.cc
lib/tar.cc
src/arch-alpha.cc
src/arch-arm32.cc
src/arch-arm64.cc
src/arch-i386.cc
src/arch-m68k.cc
src/arch-ppc32.cc
src/arch-ppc64v1.cc
src/arch-ppc64v2.cc
src/arch-s390x.cc
src/arch-sh4.cc
src/arch-sparc64.cc
src/arch-x86-64.cc
src/config.cc
third-party/rust-demangle/rust-demangle.c
)
if(WIN32)
target_sources(mold PRIVATE
common/jobs-win32.cc
common/mapped-file-win32.cc
common/signal-win32.cc
lib/jobs-win32.cc
lib/mapped-file-win32.cc
lib/signal-win32.cc
)
else()
target_sources(mold PRIVATE
common/jobs-unix.cc
common/mapped-file-unix.cc
common/signal-unix.cc
lib/jobs-unix.cc
lib/mapped-file-unix.cc
lib/signal-unix.cc
)
endif()
@ -425,7 +425,7 @@ if(BUILD_TESTING)
endif()
if(${UNIX})
add_subdirectory(test/elf)
add_subdirectory(test)
endif()
endif()

View File

@ -116,7 +116,7 @@ A static file is created by `ar`, whose command line arguments are
similar to `tar`. A static library contains the symbol table which
offers a quick way to look up an object file for a defined symbol,
but mold does not use the static library's symbol table. mold
doesdn't need a symbol table to exist in an archive, and if exists,
doesn't need a symbol table to exist in an archive, and if exists,
mold just ignores it.
See also: DSO (dynamic library)

View File

@ -1,6 +1,6 @@
#include "mold.h"
#include "elf.h"
namespace mold::elf {
namespace mold {
static std::string unknown_type(u32 r_type) {
char buf[50];
@ -1059,4 +1059,4 @@ std::string rel_to_string<LOONGARCH32>(u32 r_type) {
return rel_to_string<LOONGARCH64>(r_type);
}
} // namespace mold::elf
} // namespace mold

View File

@ -1,13 +1,13 @@
#pragma once
#include "../common/integers.h"
#include "integers.h"
#include <concepts>
#include <ostream>
#include <string>
#include <type_traits>
namespace mold::elf {
namespace mold {
struct X86_64;
struct I386;
@ -1856,7 +1856,7 @@ template <>
struct ElfRel<SH4> {
ElfRel() = default;
// Addend is ignored except for base relocations because even though
// Addend is ignored except for base relocations because even though
// SH4 is RELA, r_addend is ignored in most cases and works as if it
// were REL.
ElfRel(u64 offset, u32 type, u32 sym, i64 addend)
@ -2313,4 +2313,4 @@ struct LOONGARCH32 {
static constexpr u32 R_FUNCALL[] = { R_LARCH_B26, R_LARCH_CALL36 };
};
} // namespace mold::elf
} // namespace mold

View File

@ -1,7 +1,7 @@
#pragma once
#include "common.h"
#include "../elf/elf.h"
#include "elf.h"
namespace mold {
@ -36,8 +36,6 @@ bool is_text_file(MappedFile *mf) {
template <typename E, typename Context, typename MappedFile>
inline bool is_gcc_lto_obj(Context &ctx, MappedFile *mf) {
using namespace mold::elf;
const char *data = mf->get_contents().data();
ElfEhdr<E> &ehdr = *(ElfEhdr<E> *)data;
ElfShdr<E> *sh_begin = (ElfShdr<E> *)(data + ehdr.e_shoff);
@ -91,8 +89,6 @@ inline bool is_gcc_lto_obj(Context &ctx, MappedFile *mf) {
template <typename Context, typename MappedFile>
FileType get_file_type(Context &ctx, MappedFile *mf) {
using namespace elf;
std::string_view data = mf->get_contents();
if (data.empty())

View File

@ -26,12 +26,13 @@ if ! docker image ls mold-gentoo | grep -q mold-gentoo; then
cat <<EOF | docker build -t mold-gentoo -
FROM gentoo/stage3
RUN emerge-webrsync
RUN echo 'USE="X ssl elogind -systemd corefonts truetype jpeg jpeg2k tiff zstd static-libs binary"' >> /etc/portage/make.conf && \
RUN echo 'USE="X ssl elogind -systemd corefonts truetype jpeg jpeg2k tiff zstd static-libs binary -perl"' >> /etc/portage/make.conf && \
echo 'ACCEPT_KEYWORDS="~amd64"' >> /etc/portage/make.conf && \
echo 'ACCEPT_LICENSE="* -@EULA"' >> /etc/portage/make.conf && \
echo 'FEATURES="\${FEATURE} noclean nostrip ccache -ipc-sandbox -network-sandbox -pid-sandbox -sandbox"' >> /etc/portage/make.conf && \
echo 'CCACHE_DIR="/ccache"' >> /etc/portage/make.conf
RUN emerge gdb lld clang vim emacs strace ccache xeyes dev-build/cmake dev-vcs/git && rm -rf /var/tmp/portage
echo 'CCACHE_DIR="/ccache"' >> /etc/portage/make.conf && \
emerge gdb lld clang vim emacs strace ccache xeyes dev-build/cmake dev-vcs/git && \
rm -rf /var/tmp/portage
EOF
set +e
fi

View File

@ -36,7 +36,7 @@
#include "mold.h"
namespace mold::elf {
namespace mold {
using E = ALPHA;
@ -327,4 +327,4 @@ void AlphaGotSection::copy_buf(Context<E> &ctx) {
}
}
} // namespace mold::elf
} // namespace mold

View File

@ -37,7 +37,7 @@
#include <tbb/parallel_for_each.h>
#include <tbb/parallel_sort.h>
namespace mold::elf {
namespace mold {
using E = ARM32;
@ -787,4 +787,4 @@ void fixup_arm_exidx_section(Context<E> &ctx) {
}
}
} // namespace mold::elf
} // namespace mold

View File

@ -19,7 +19,7 @@
#include "mold.h"
namespace mold::elf {
namespace mold {
using E = ARM64;
@ -628,4 +628,4 @@ void Thunk<E>::copy_buf(Context<E> &ctx) {
}
}
} // namespace mold::elf
} // namespace mold

View File

@ -35,7 +35,7 @@
#include "mold.h"
namespace mold::elf {
namespace mold {
using E = I386;
@ -226,7 +226,7 @@ static void relax_gd_to_le(u8 *loc, ElfRel<E> rel, u64 val) {
}
// Relax LD to LE
static void relax_ld_to_le(u8 *loc, ElfRel<E> rel, u64 val) {
static void relax_ld_to_le(u8 *loc, ElfRel<E> rel, u64 tls_size) {
switch (rel.r_type) {
case R_386_PLT32:
case R_386_PC32: {
@ -235,7 +235,7 @@ static void relax_ld_to_le(u8 *loc, ElfRel<E> rel, u64 val) {
0x2d, 0, 0, 0, 0, // sub $tls_size, %eax
};
memcpy(loc - 2, insn, sizeof(insn));
*(ul32 *)(loc + 5) = val;
*(ul32 *)(loc + 5) = tls_size;
break;
}
case R_386_GOT32:
@ -246,7 +246,7 @@ static void relax_ld_to_le(u8 *loc, ElfRel<E> rel, u64 val) {
0x90, // nop
};
memcpy(loc - 2, insn, sizeof(insn));
*(ul32 *)(loc + 5) = val;
*(ul32 *)(loc + 5) = tls_size;
break;
}
default:
@ -374,7 +374,7 @@ void InputSection<E>::apply_reloc_alloc(Context<E> &ctx, u8 *base) {
case R_386_TLS_LDM:
if (ctx.got->has_tlsld(ctx))
*(ul32 *)loc = ctx.got->get_tlsld_addr(ctx) + A - GOT;
else
else
relax_ld_to_le(loc, rels[++i], ctx.tp_addr - ctx.tls_begin);
break;
case R_386_TLS_LDO_32:
@ -613,4 +613,4 @@ void InputSection<E>::scan_relocations(Context<E> &ctx) {
}
}
} // namespace mold::elf
} // namespace mold

View File

@ -25,7 +25,7 @@
#include "mold.h"
namespace mold::elf {
namespace mold {
using E = MOLD_TARGET;
@ -51,7 +51,7 @@ static u64 hi20(u64 val, u64 pc) {
return bits(page(val + 0x800) - page(pc), 31, 12);
}
static u64 hi64(u64 val, u64 pc) {
static u64 higher20(u64 val, u64 pc) {
// A PC-relative 64-bit address is materialized with the following
// instructions for the large code model:
//
@ -65,21 +65,15 @@ static u64 hi64(u64 val, u64 pc) {
// ADDI.D adds a sign-extended 12 bit value to a register. LU32I.D and
// LU52I.D simply set bits to [51:31] and to [63:53], respectively.
//
// Compensating all the sign-extensions is a bit complicated.
u64 x = page(val) - page(pc);
if (val & 0x800)
x += 0x1000 - 0x1'0000'0000;
if (x & 0x8000'0000)
x += 0x1'0000'0000;
return x;
}
static u64 higher20(u64 val, u64 pc) {
return bits(hi64(val, pc), 51, 32);
// Compensating all the sign-extensions is a bit complicated. The
// psABI gave the following formula.
val = val + 0x8000'0000 + ((val & 0x800) ? (0x1000 - 0x1'0000'0000) : 0);
return bits(page(val) - page(pc - 8), 51, 32);
}
static u64 highest12(u64 val, u64 pc) {
return bits(hi64(val, pc), 63, 52);
val = val + 0x8000'0000 + ((val & 0x800) ? (0x1000 - 0x1'0000'0000) : 0);
return bits(page(val) - page(pc - 12), 63, 52);
}
static void write_k12(u8 *loc, u32 val) {
@ -983,6 +977,6 @@ void shrink_section(Context<E> &ctx, InputSection<E> &isec, bool use_rvc) {
isec.sh_size -= delta;
}
} // namespace mold::elf
} // namespace mold
#endif

View File

@ -16,7 +16,7 @@
#include "mold.h"
namespace mold::elf {
namespace mold {
using E = M68K;
@ -322,4 +322,4 @@ void InputSection<E>::scan_relocations(Context<E> &ctx) {
}
}
} // namespace mold::elf
} // namespace mold

View File

@ -42,7 +42,7 @@
#include "mold.h"
namespace mold::elf {
namespace mold {
using E = PPC32;
@ -450,4 +450,4 @@ void Thunk<E>::copy_buf(Context<E> &ctx) {
}
}
} // namespace mold::elf
} // namespace mold

View File

@ -50,7 +50,7 @@
#include <algorithm>
#include <tbb/parallel_for_each.h>
namespace mold::elf {
namespace mold {
using E = PPC64V1;
@ -689,4 +689,4 @@ void PPC64OpdSection::copy_buf(Context<E> &ctx) {
}
}
} // namespace mold::elf
} // namespace mold

View File

@ -82,7 +82,7 @@
#include "mold.h"
namespace mold::elf {
namespace mold {
using E = PPC64V2;
@ -677,4 +677,4 @@ u64 get_eflags(Context<E> &ctx) {
return 2;
}
} // namespace mold::elf
} // namespace mold

View File

@ -19,14 +19,13 @@
#if MOLD_RV64LE || MOLD_RV64BE || MOLD_RV32LE || MOLD_RV32BE
#include "elf.h"
#include "mold.h"
#include <regex>
#include <tbb/parallel_for.h>
#include <tbb/parallel_for_each.h>
namespace mold::elf {
namespace mold {
using E = MOLD_TARGET;
@ -1233,6 +1232,6 @@ void RiscvAttributesSection<E>::copy_buf(Context<E> &ctx) {
write_vector(ctx.buf + this->shdr.sh_offset, contents);
}
} // namespace mold::elf
} // namespace mold
#endif

View File

@ -37,7 +37,7 @@
#include "mold.h"
namespace mold::elf {
namespace mold {
using E = S390X;
@ -486,4 +486,4 @@ void InputSection<E>::scan_relocations(Context<E> &ctx) {
}
}
} // namespace mold::elf
} // namespace mold

View File

@ -60,7 +60,7 @@
#include "mold.h"
namespace mold::elf {
namespace mold {
using E = SH4;
@ -373,4 +373,4 @@ void InputSection<E>::scan_relocations(Context<E> &ctx) {
}
}
} // namespace mold::elf
} // namespace mold

View File

@ -58,7 +58,7 @@
#include "mold.h"
namespace mold::elf {
namespace mold {
using E = SPARC64;
@ -651,4 +651,4 @@ void InputSection<E>::scan_relocations(Context<E> &ctx) {
}
}
} // namespace mold::elf
} // namespace mold

View File

@ -30,7 +30,7 @@
#include <tbb/parallel_for_each.h>
namespace mold::elf {
namespace mold {
using E = X86_64;
@ -908,4 +908,4 @@ void rewrite_endbr(Context<E> &ctx) {
keep(sym);
}
} // namespace mold::elf
} // namespace mold

View File

@ -15,7 +15,7 @@
# define STDERR_FILENO (_fileno(stderr))
#endif
namespace mold::elf {
namespace mold {
inline const char helpmsg[] = R"(
Options:
@ -1524,4 +1524,4 @@ using E = MOLD_TARGET;
template std::vector<std::string_view> expand_response_files(Context<E> &, char **);
template std::vector<std::string> parse_nonpositional_args(Context<E> &ctx);
} // namespace mold::elf
} // namespace mold

View File

@ -1,7 +1,7 @@
#include "mold.h"
#include "config.h"
namespace mold::elf {
namespace mold {
std::string get_mold_version() {
if (mold_git_hash.empty())
@ -10,4 +10,4 @@ std::string get_mold_version() {
"; compatible with GNU ld)";
}
} // namespace mold::elf
} // namespace mold

View File

@ -7,7 +7,7 @@
#include <tbb/concurrent_vector.h>
#include <tbb/parallel_for_each.h>
namespace mold::elf {
namespace mold {
template <typename E>
static bool should_keep(const InputSection<E> &isec) {
@ -172,4 +172,4 @@ using E = MOLD_TARGET;
template void gc_sections(Context<E> &ctx);
} // namespace mold::elf
} // namespace mold

View File

@ -60,7 +60,7 @@
#include <tbb/parallel_for_each.h>
#include <tbb/parallel_sort.h>
namespace mold::elf {
namespace mold {
enum DwarfKind { DWARF2_32, DWARF5_32, DWARF2_64, DWARF5_64 };
@ -791,4 +791,4 @@ using E = MOLD_TARGET;
template void write_gdb_index(Context<E> &);
} // namespace mold::elf
} // namespace mold

View File

@ -65,7 +65,7 @@
// conditions.
#include "mold.h"
#include "../common/siphash.h"
#include "../lib/siphash.h"
#include <array>
#include <cstdio>
@ -91,7 +91,7 @@ template <> struct hash<Digest> {
};
}
namespace mold::elf {
namespace mold {
static u8 hmac_key[16];
@ -612,4 +612,4 @@ using E = MOLD_TARGET;
template void icf_sections(Context<E> &ctx);
} // namespace mold::elf
} // namespace mold

View File

@ -8,7 +8,7 @@
# include <unistd.h>
#endif
namespace mold::elf {
namespace mold {
// If we haven't seen the same `key` before, create a new instance
// of Symbol and returns it. Otherwise, returns the previously-
@ -243,7 +243,7 @@ static bool is_known_section_type(const ElfShdr<E> &shdr) {
return true;
if (SHT_LOOS <= ty && ty <= SHT_HIOS && !(flags & SHF_OS_NONCONFORMING))
return true;
if (is_x86<E> && ty == SHT_X86_64_UNWIND)
if (is_x86_64<E> && ty == SHT_X86_64_UNWIND)
return true;
if (is_arm32<E> && (ty == SHT_ARM_EXIDX || ty == SHT_ARM_ATTRIBUTES))
return true;
@ -1497,4 +1497,4 @@ template std::string_view demangle(const Symbol<E> &);
template std::ostream &operator<<(std::ostream &, const Symbol<E> &);
template std::ostream &operator<<(std::ostream &, const InputFile<E> &);
} // namespace mold::elf
} // namespace mold

View File

@ -4,7 +4,7 @@
#include <zlib.h>
#include <zstd.h>
namespace mold::elf {
namespace mold {
typedef enum {
NONE, ERROR, COPYREL, DYN_COPYREL, PLT, CPLT, DYN_CPLT, DYNREL,
@ -675,4 +675,4 @@ template bool cie_equals(const CieRecord<E> &, const CieRecord<E> &);
template class InputSection<E>;
template class MergeableSection<E>;
} // namespace mold::elf
} // namespace mold

View File

@ -8,7 +8,7 @@
#include <cctype>
#include <iomanip>
namespace mold::elf {
namespace mold {
static std::string_view get_line(std::string_view input, const char *pos) {
assert(input.data() <= pos);
@ -421,4 +421,4 @@ template class Script<E>;
template
std::vector<DynamicPattern> parse_dynamic_list(Context<E> &, std::string_view);
} // namespace mold::elf
} // namespace mold

View File

@ -95,7 +95,7 @@
# define LOG std::ostringstream()
#endif
namespace mold::elf {
namespace mold {
// Global variables
// We store LTO-related information to global variables,
@ -746,4 +746,4 @@ template ObjectFile<E> *read_lto_object(Context<E> &, MappedFile *);
template std::vector<ObjectFile<E> *> do_lto(Context<E> &);
template void lto_cleanup(Context<E> &);
} // namespace mold::elf
} // namespace mold

View File

@ -1,7 +1,7 @@
#include "mold.h"
#include "lto.h"
namespace mold::elf {
namespace mold {
template <typename E>
ObjectFile<E> *read_lto_object(Context<E> &ctx, MappedFile *mf) {
@ -22,4 +22,4 @@ template ObjectFile<E> *read_lto_object(Context<E> &, MappedFile *);
template std::vector<ObjectFile<E> *> do_lto(Context<E> &);
template void lto_cleanup(Context<E> &);
} // namespace mold::elf
} // namespace mold

View File

@ -1,6 +1,6 @@
#pragma once
#include "../common/integers.h"
#include "../lib/integers.h"
namespace mold {

View File

@ -1,6 +1,6 @@
#include "mold.h"
#include "../common/archive-file.h"
#include "../common/output-file.h"
#include "../lib/archive-file.h"
#include "../lib/output-file.h"
#include <cstring>
#include <functional>
@ -23,11 +23,11 @@
#ifdef MOLD_X86_64
int main(int argc, char **argv) {
return mold::elf::elf_main<mold::elf::X86_64>(argc, argv);
return mold::mold_main<mold::X86_64>(argc, argv);
}
#endif
namespace mold::elf {
namespace mold {
// Read the beginning of a given file and returns its machine type
// (e.g. EM_X86_64 or EM_386).
@ -340,7 +340,7 @@ static void read_input_files(Context<E> &ctx, std::span<std::string> args) {
}
template <typename E>
int elf_main(int argc, char **argv) {
int mold_main(int argc, char **argv) {
Context<E> ctx;
// Process -run option first. process_run_subcommand() does not return.
@ -716,6 +716,6 @@ int elf_main(int argc, char **argv) {
using E = MOLD_TARGET;
template int elf_main<E>(int, char **);
template int mold_main<E>(int, char **);
} // namespace mold::elf
} // namespace mold

View File

@ -7,7 +7,7 @@
#include <tbb/parallel_for_each.h>
#include <unordered_map>
namespace mold::elf {
namespace mold {
template <typename E>
using Map =
@ -114,4 +114,4 @@ using E = MOLD_TARGET;
template void print_map(Context<E> &ctx);
} // namespace mold::elf
} // namespace mold

View File

@ -1,7 +1,7 @@
#pragma once
#include "elf.h"
#include "../common/common.h"
#include "../lib/common.h"
#include "../lib/elf.h"
#include <atomic>
#include <bitset>
@ -34,7 +34,7 @@
# include <unistd.h>
#endif
namespace mold::elf {
namespace mold {
template <typename E> class InputFile;
template <typename E> class InputSection;
@ -1748,6 +1748,9 @@ struct Context {
arg.entry = get_symbol(*this, "_start");
arg.fini = get_symbol(*this, "_fini");
arg.init = get_symbol(*this, "_init");
if constexpr (is_sparc<E>)
extra.tls_get_addr = get_symbol(*this, "__tls_get_addr");
}
Context(const Context<E> &) = delete;
@ -2035,9 +2038,7 @@ template <typename E>
void read_file(Context<E> &ctx, ReaderContext &rctx, MappedFile *mf);
template <typename E>
int elf_main(int argc, char **argv);
int main(int argc, char **argv);
int mold_main(int argc, char **argv);
template <typename E>
std::ostream &operator<<(std::ostream &out, const InputFile<E> &file);
@ -2992,4 +2993,4 @@ inline bool is_c_identifier(std::string_view s) {
return true;
}
} // namespace mold::elf
} // namespace mold

View File

@ -9,7 +9,7 @@
#include <tbb/parallel_scan.h>
#include <tbb/parallel_sort.h>
namespace mold::elf {
namespace mold {
// The hash function for .hash.
static u32 elf_hash(std::string_view name) {
@ -2954,4 +2954,4 @@ template OutputSection<E> *find_section(Context<E> &, std::string_view);
template i64 to_phdr_flags(Context<E> &ctx, Chunk<E> *chunk);
template ElfSym<E> to_output_esym(Context<E> &, Symbol<E> &, u32, U32<E> *);
} // namespace mold::elf
} // namespace mold

View File

@ -1,6 +1,6 @@
#include "mold.h"
#include "blake3.h"
#include "../common/output-file.h"
#include "../lib/output-file.h"
#include <fstream>
#include <functional>
@ -13,49 +13,49 @@
#include <tbb/partitioner.h>
#include <unordered_set>
namespace mold::elf {
namespace mold {
// Since elf_main is a template, we can't run it without a type parameter.
// We speculatively run elf_main with X86_64, and if the speculation was
// Since mold_main is a template, we can't run it without a type parameter.
// We speculatively run mold_main with X86_64, and if the speculation was
// wrong, re-run it with an actual machine type.
template <typename E>
int redo_main(Context<E> &ctx, int argc, char **argv) {
std::string_view target = ctx.arg.emulation;
if (target == I386::target_name)
return elf_main<I386>(argc, argv);
return mold_main<I386>(argc, argv);
if (target == ARM64::target_name)
return elf_main<ARM64>(argc, argv);
return mold_main<ARM64>(argc, argv);
if (target == ARM32::target_name)
return elf_main<ARM32>(argc, argv);
return mold_main<ARM32>(argc, argv);
if (target == RV64LE::target_name)
return elf_main<RV64LE>(argc, argv);
return mold_main<RV64LE>(argc, argv);
if (target == RV64BE::target_name)
return elf_main<RV64BE>(argc, argv);
return mold_main<RV64BE>(argc, argv);
if (target == RV32LE::target_name)
return elf_main<RV32LE>(argc, argv);
return mold_main<RV32LE>(argc, argv);
if (target == RV32BE::target_name)
return elf_main<RV32BE>(argc, argv);
return mold_main<RV32BE>(argc, argv);
if (target == PPC32::target_name)
return elf_main<PPC32>(argc, argv);
return mold_main<PPC32>(argc, argv);
if (target == PPC64V1::target_name)
return elf_main<PPC64V1>(argc, argv);
return mold_main<PPC64V1>(argc, argv);
if (target == PPC64V2::target_name)
return elf_main<PPC64V2>(argc, argv);
return mold_main<PPC64V2>(argc, argv);
if (target == S390X::target_name)
return elf_main<S390X>(argc, argv);
return mold_main<S390X>(argc, argv);
if (target == SPARC64::target_name)
return elf_main<SPARC64>(argc, argv);
return mold_main<SPARC64>(argc, argv);
if (target == M68K::target_name)
return elf_main<M68K>(argc, argv);
return mold_main<M68K>(argc, argv);
if (target == SH4::target_name)
return elf_main<SH4>(argc, argv);
return mold_main<SH4>(argc, argv);
if (target == ALPHA::target_name)
return elf_main<ALPHA>(argc, argv);
return mold_main<ALPHA>(argc, argv);
if (target == LOONGARCH32::target_name)
return elf_main<LOONGARCH32>(argc, argv);
return mold_main<LOONGARCH32>(argc, argv);
if (target == LOONGARCH64::target_name)
return elf_main<LOONGARCH64>(argc, argv);
return mold_main<LOONGARCH64>(argc, argv);
unreachable();
}
@ -190,9 +190,6 @@ void create_synthetic_sections(Context<E> &ctx) {
if constexpr (is_ppc64v2<E>)
ctx.extra.save_restore = push(new PPC64SaveRestoreSection);
if constexpr (is_sparc<E>)
ctx.extra.tls_get_addr = get_symbol(ctx, "__tls_get_addr");
if constexpr (is_alpha<E>)
ctx.extra.got = push(new AlphaGotSection);
}
@ -3286,4 +3283,4 @@ template void write_separate_debug_file(Context<E> &);
template void write_dependency_file(Context<E> &);
template void show_stats(Context<E> &);
} // namespace mold::elf
} // namespace mold

View File

@ -35,7 +35,7 @@
#include <tbb/parallel_for.h>
#include <tbb/parallel_for_each.h>
namespace mold::elf {
namespace mold {
// Create linker-synthesized sections
template <typename E>
@ -194,4 +194,4 @@ using E = MOLD_TARGET;
template void combine_objects(Context<E> &);
} // namespace mold::elf
} // namespace mold

View File

@ -62,7 +62,7 @@
#include <tbb/parallel_for_each.h>
namespace mold::elf {
namespace mold {
using E = MOLD_TARGET;
@ -142,6 +142,6 @@ i64 compute_distance<E>(Context<E> &ctx, Symbol<E> &sym,
return S + A - P;
}
} // namespace mold::elf
} // namespace mold
#endif

View File

@ -9,7 +9,7 @@
#include <sys/wait.h>
#include <unistd.h>
namespace mold::elf {
namespace mold {
#ifdef MOLD_X86_64
static int pipe_write_fd = -1;
@ -126,4 +126,4 @@ using E = MOLD_TARGET;
template void process_run_subcommand(Context<E> &, int, char **);
} // namespace mold::elf
} // namespace mold

View File

@ -1,6 +1,6 @@
#include "mold.h"
namespace mold::elf {
namespace mold {
#ifdef MOLD_X86_64
void fork_child() {}
@ -17,4 +17,4 @@ using E = MOLD_TARGET;
template void process_run_subcommand(Context<E> &, int, char **);
} // namespace mold::elf
} // namespace mold

View File

@ -27,7 +27,7 @@
#include <tbb/parallel_for.h>
#include <tbb/parallel_for_each.h>
namespace mold::elf {
namespace mold {
using E = MOLD_TARGET;
@ -294,6 +294,6 @@ void OutputSection<E>::create_range_extension_thunks(Context<E> &ctx) {
std::max<u32>(this->shdr.sh_addralign, 1 << isec->p2align);
}
} // namespace mold::elf
} // namespace mold
#endif

View File

@ -122,7 +122,7 @@
#include "mold.h"
namespace mold::elf {
namespace mold {
// Returns the TP address which can be used for efficient TLV accesses in
// the main executable. TP at runtime refers to a per-process TLS block
@ -189,4 +189,4 @@ using E = MOLD_TARGET;
template u64 get_tp_addr<E>(const ElfPhdr<E> &);
template u64 get_dtp_addr<E>(const ElfPhdr<E> &);
} // namespace mold::elf
} // namespace mold

View File

@ -69,10 +69,10 @@ function(add_target ARCH TRIPLE)
file(GLOB ALL_TESTS RELATIVE ${CMAKE_CURRENT_LIST_DIR} CONFIGURE_DEPENDS
"*.sh")
list(FILTER ALL_TESTS EXCLUDE REGEX "_")
list(FILTER ALL_TESTS EXCLUDE REGEX "^arch-")
file(GLOB TESTS RELATIVE ${CMAKE_CURRENT_LIST_DIR} CONFIGURE_DEPENDS
"${ARCH}_*.sh")
"arch-${ARCH}-*.sh")
list(APPEND TESTS ${ALL_TESTS})

View File

@ -1,8 +1,6 @@
#!/bin/bash
. $(dirname $0)/common.inc
[ $MACHINE = aarch64 ] || skip
cat <<EOF | $CC -c -o $t/a.o -fPIC -xc -
#include <stdio.h>

Some files were not shown because too many files have changed in this diff Show More