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:
parent
b0596ab8fb
commit
1fa6b3cd17
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
14
elf/main.cc
14
elf/main.cc
@ -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
|
||||
|
@ -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
|
||||
|
22
elf/mold.h
22
elf/mold.h
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user