1
1
mirror of https://github.com/rui314/mold.git synced 2024-09-19 17:07:29 +03:00

[ELF] Allow to build only for x86-64 or ARM64

mold is usually built for all supported tagets, namely, x86-64, i386,
ARM32, ARM64 and RISCV64. This is a good thing because it makes cross
compilation easy. That is, as long as you have a copy of the mold linker,
it is guaranteed to work as a cross linker.

However, during a quick debug session in which you build mold many
times, you may want to build mold only for your native target. That
greatly reduces build time because it reduces the amount of code
after template instantiation.

Therefore, in this commit, I introduced new macros,
MOLD_DEBUG_X86_64_ONLY and MOLD_DEBUG_ARM64_ONLY, to build mold for
x86-64 and ARM64 only, respectively.

These flags should never be used for production. They are solely for
debugging purpose.
This commit is contained in:
Rui Ueyama 2022-04-17 12:05:46 +08:00
parent b0596ab8fb
commit 1fa6b3cd17
15 changed files with 43 additions and 71 deletions

View File

@ -1105,10 +1105,6 @@ void parse_nonpositional_args(Context<E> &ctx,
void parse_nonpositional_args(Context<E> &ctx, \
std::vector<std::string_view> &remaining)
INSTANTIATE(X86_64);
INSTANTIATE(I386);
INSTANTIATE(ARM64);
INSTANTIATE(ARM32);
INSTANTIATE(RISCV64);
INSTANTIATE_ALL;
} // namespace mold::elf

View File

@ -201,10 +201,6 @@ void gc_sections(Context<E> &ctx) {
#define INSTANTIATE(E) \
template void gc_sections(Context<E> &ctx);
INSTANTIATE(X86_64);
INSTANTIATE(I386);
INSTANTIATE(ARM64);
INSTANTIATE(ARM32);
INSTANTIATE(RISCV64);
INSTANTIATE_ALL;
} // namespace mold::elf

View File

@ -588,10 +588,6 @@ void icf_sections(Context<E> &ctx) {
#define INSTANTIATE(E) \
template void icf_sections(Context<E> &ctx);
INSTANTIATE(X86_64);
INSTANTIATE(I386);
INSTANTIATE(ARM64);
INSTANTIATE(ARM32);
INSTANTIATE(RISCV64);
INSTANTIATE_ALL;
} // namespace mold::elf

View File

@ -1454,10 +1454,6 @@ void SharedFile<E>::write_symtab(Context<E> &ctx) {
template class SharedFile<E>; \
template std::ostream &operator<<(std::ostream &, const InputFile<E> &)
INSTANTIATE(X86_64);
INSTANTIATE(I386);
INSTANTIATE(ARM64);
INSTANTIATE(ARM32);
INSTANTIATE(RISCV64);
INSTANTIATE_ALL;
} // namespace mold::elf

View File

@ -257,10 +257,6 @@ void report_undef(Context<E> &ctx, InputFile<E> &file, Symbol<E> &sym) {
template void report_undef(Context<E> &, InputFile<E> &, Symbol<E> &)
INSTANTIATE(X86_64);
INSTANTIATE(I386);
INSTANTIATE(ARM64);
INSTANTIATE(ARM32);
INSTANTIATE(RISCV64);
INSTANTIATE_ALL;
} // namespace mold::elf

View File

@ -405,10 +405,6 @@ void parse_dynamic_list(Context<E> &ctx, std::string path) {
template \
void parse_dynamic_list(Context<E> &ctx, std::string path)
INSTANTIATE(X86_64);
INSTANTIATE(I386);
INSTANTIATE(ARM64);
INSTANTIATE(ARM32);
INSTANTIATE(RISCV64);
INSTANTIATE_ALL;
} // namespace mold::elf

View File

@ -652,10 +652,6 @@ void lto_cleanup(Context<E> &ctx) {
template std::vector<ObjectFile<E> *> do_lto(Context<E> &); \
template void lto_cleanup(Context<E> &)
INSTANTIATE(X86_64);
INSTANTIATE(I386);
INSTANTIATE(ARM64);
INSTANTIATE(ARM32);
INSTANTIATE(RISCV64);
INSTANTIATE_ALL;
} // namespace mold::elf

View File

@ -382,6 +382,7 @@ static int elf_main(int argc, char **argv) {
// Redo if -m is not x86-64.
if (ctx.arg.emulation != E::e_machine) {
#if !defined(MOLD_DEBUG_X86_64_ONLY) && !defined(MOLD_DEBUG_ARM64_ONLY)
switch (ctx.arg.emulation) {
case EM_386:
return elf_main<I386>(argc, argv);
@ -392,7 +393,8 @@ static int elf_main(int argc, char **argv) {
case EM_RISCV:
return elf_main<RISCV64>(argc, argv);
}
unreachable();
#endif
Fatal(ctx) << "unknown emulation: " << ctx.arg.emulation;
}
Timer t_all(ctx, "all");
@ -759,16 +761,16 @@ static int elf_main(int argc, char **argv) {
}
int main(int argc, char **argv) {
#ifdef MOLD_DEBUG_ARM64_ONLY
return elf_main<ARM64>(argc, argv);
#else
return elf_main<X86_64>(argc, argv);
#endif
}
#define INSTANTIATE(E) \
template void read_file(Context<E> &, MappedFile<Context<E>> *);
INSTANTIATE(X86_64);
INSTANTIATE(I386);
INSTANTIATE(ARM64);
INSTANTIATE(ARM32);
INSTANTIATE(RISCV64);
INSTANTIATE_ALL;
} // namespace mold::elf

View File

@ -109,10 +109,6 @@ void print_map(Context<E> &ctx) {
#define INSTANTIATE(E) \
template void print_map(Context<E> &ctx);
INSTANTIATE(X86_64);
INSTANTIATE(I386);
INSTANTIATE(ARM64);
INSTANTIATE(ARM32);
INSTANTIATE(RISCV64);
INSTANTIATE_ALL;
} // namespace mold::elf

View File

@ -33,6 +33,28 @@
#define XXH_INLINE_ALL 1
#include <xxhash.h>
// MOLD_DEBUG_{X86_64,ARM64}_ONLY are macros to speed up builds.
// This should be used only for debugging. When you use this flag,
// you also need to pass -gc-sections to link mold.
#if defined(MOLD_DEBUG_X86_64_ONLY)
# ifdef __OPTIMIZE__
# error "MOLD_DEBUG_X86_64_ONLY is for debugging only"
# endif
# define INSTANTIATE_ALL INSTANTIATE(X86_64)
#elif defined(MOLD_DEBUG_ARM64_ONLY)
# ifdef __OPTIMIZE__
# error "MOLD_DEBUG_ARM64_ONLY is for debugging only"
# endif
# define INSTANTIATE_ALL INSTANTIATE(ARM64)
#else
# define INSTANTIATE_ALL \
INSTANTIATE(X86_64); \
INSTANTIATE(I386); \
INSTANTIATE(ARM64); \
INSTANTIATE(ARM32); \
INSTANTIATE(RISCV64)
#endif
namespace mold::elf {
static constexpr i32 SHA256_SIZE = 32;

View File

@ -2845,10 +2845,6 @@ void RelocSection<E>::copy_buf(Context<E> &ctx) {
template i64 BuildId::size(Context<E> &) const; \
template bool is_relro(Context<E> &, Chunk<E> *);
INSTANTIATE(X86_64);
INSTANTIATE(I386);
INSTANTIATE(ARM64);
INSTANTIATE(ARM32);
INSTANTIATE(RISCV64);
INSTANTIATE_ALL;
} // namespace mold::elf

View File

@ -135,10 +135,6 @@ OutputFile<E>::open(Context<E> &ctx, std::string path, i64 filesize, i64 perm) {
#define INSTANTIATE(E) \
template class OutputFile<E>;
INSTANTIATE(X86_64);
INSTANTIATE(I386);
INSTANTIATE(ARM64);
INSTANTIATE(ARM32);
INSTANTIATE(RISCV64);
INSTANTIATE_ALL;
} // namespace mold::elf

View File

@ -1672,10 +1672,6 @@ void write_dependency_file(Context<E> &ctx) {
template i64 compress_debug_sections(Context<E> &); \
template void write_dependency_file(Context<E> &);
INSTANTIATE(X86_64);
INSTANTIATE(I386);
INSTANTIATE(ARM64);
INSTANTIATE(ARM32);
INSTANTIATE(RISCV64);
INSTANTIATE_ALL;
} // namespace mold::elf

View File

@ -588,10 +588,6 @@ void combine_objects(Context<E> &ctx, std::span<std::string_view> file_args) {
#define INSTANTIATE(E) \
template void combine_objects(Context<E> &, std::span<std::string_view>);
INSTANTIATE(X86_64);
INSTANTIATE(I386);
INSTANTIATE(ARM64);
INSTANTIATE(ARM32);
INSTANTIATE(RISCV64);
INSTANTIATE_ALL;
} // namespace mold::elf

View File

@ -312,10 +312,6 @@ void process_run_subcommand(Context<E> &ctx, int argc, char **argv) {
std::function<void()> *); \
template void process_run_subcommand(Context<E> &, int, char **)
INSTANTIATE(X86_64);
INSTANTIATE(I386);
INSTANTIATE(ARM64);
INSTANTIATE(ARM32);
INSTANTIATE(RISCV64);
INSTANTIATE_ALL;
} // namespace mold::elf