Re: Any known way to build devel/llvm* ( such as devel/llvm19 ) with --threads=1 for its linker activity during the build?

Mark Millard <[email protected]>
Newsgroups gmane.os.freebsd.devel.toolchain,gmane.os.freebsd.devel.arm
Message-ID <[email protected]>
On Aug 4, 2024, at 14:31, Mark Millard <[email protected]> wrote:

> On Aug 3, 2024, at 23:07, Mark Millard <[email protected]> wrote:
> 
>> My recent attempts to build devel/llvm18 and devel/llvm19 in an armv7 context (native or aarch64-as-armv7) have had /usr/bin/ld failures that stop the build and report as:
>> 
>> LLVM ERROR: out of memory
>> Allocation failed
>> 
>> (no system OOM activity or notices, so just a process size/fragmentation issue, or so I would expect).
>> 
>> On native armv7 I also had rust 1.79.0 fail that way so --but aarch64-as-armv7 built it okay.
>> 
>> I'm curious if --threads=1 use for the linker might allow the devel/llvm* builds to complete at this point. Similarly for rust. (top showed that the ld activity was multi-threaded.)
>> 
>> Note: The structure of the poudriere-devel based native build attempts is historical and it used to work. Similarly for the aarch64-as-armv7 based build attempts. For now I'd just be exploring changes that might allow much of my historical overall structure to still work. But I expect that things are just growing to the point building is starting to be problematical with process address spaces that are bounded by a limit somewhat under 4 GiBytes.
>> 
>> 
>> Native armv7 was a 2 GiByte OrangePi+ 2ed (4 cores) that had
>> at boot time:
>> 
>> AVAIL_RAM+SWAP == 1958Mi+3685Mi == 5643Mi
>> 
>> and later had "Max(imum)Obs(erved)" figures:
>> 
>> Mem: . . .,
>> 1728Mi MaxObsActive, 275192Ki MaxObsWired, 1952Mi MaxObs(Act+Wir+Lndry)
>> 
>> Swap: 3685Mi Total, . . .,
>> 1535Mi MaxObsUsed, 3177Mi MaxObs(Act+Lndry+SwapUsed),
>> 3398Mi MaxObs(A+Wir+L+SU), 3449Mi (A+W+L+SU+InAct)
>> 
>> 
>> The aarch64-as-armv7 was a Win DevKit 2023 that has 8 cores and:
>> 
>> AVAIL_RAM+SWAP == 31311Mi+120831Mi == 152142Mi
>> 
>> So lots of 4 GiByte or smaller processes would fit.
>> 
> 
> Absent finding a way to get --threads=1 to be what is used, I
> made the following crude way to test, built it, installed it
> in the armv7 directory tree used for aarch64-as-armv7, and
> then started an aarch64-as-armv7 test of building devel/llvm19
> to see what the consequences are (leading whitespace details
> might not be preserved):
> 
> # git -C /usr/main-src/ diff contrib/llvm-project/
> diff --git a/contrib/llvm-project/lld/ELF/Driver.cpp b/contrib/llvm-project/lld/ELF/Driver.cpp
> index 8b2c32b15348..299daf7dd6fa 100644
> --- a/contrib/llvm-project/lld/ELF/Driver.cpp
> +++ b/contrib/llvm-project/lld/ELF/Driver.cpp
> @@ -1587,6 +1587,9 @@ static void readConfigs(opt::InputArgList &args) {
>             arg->getValue() + "'");
>     parallel::strategy = hardware_concurrency(threads);
>     config->thinLTOJobs = v;
> +  } else if (sizeof(void*) <= 4) {
> +    log("set maximum concurrency to 1, specify --threads= to change");
> +    parallel::strategy = hardware_concurrency(1);
>   } else if (parallel::strategy.compute_thread_count() > 16) {
>     log("set maximum concurrency to 16, specify --threads= to change");
>     parallel::strategy = hardware_concurrency(16);
> 
> Basically, if the process address space has to be "small", avoid
> any default memory use tradeoffs that multi-threading the linker
> might involve --even if that means taking more time.
> 
> We will see if:
> 
> [00:00:33] [07] [00:00:00] Building   devel/llvm19@default | llvm19-19.1.0.r1
> 
> still fails to build as armv7 vs. if the change leads it to
> manage to build as armv7.

The link attempt for "-o bin/llvm-exegesis" still failed:

LLVM ERROR: out of memory
Allocation failed


A potentially interesting note is that:

https://llvm.org/docs/CommandGuide/llvm-exegesis.html

reports:

QUOTE
llvm-exegesis currently only supports X86 (64-bit only), ARM (AArch64 only), MIPS, and PowerPC (PowerPC64LE only) on Linux for benchmarking. Not all benchmarking functionality is guaranteed to work on every platform. llvm-exegesis also has a separate analysis mode that is supported on every platform that LLVM is.
END QUOTE


===
Mark Millard
marklmi at yahoo.com
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.