From: Kirill A. Korinsky Subject: Re: llvm/sparc64: match BFD -N alignment To: Mark Kettenis Cc: semarie@online.fr, robert@openbsd.org, tech@openbsd.org Date: Tue, 18 Aug 2026 16:37:53 +0200 On Tue, 18 Aug 2026 15:23:25 +0200, Mark Kettenis wrote: > > > Date: Tue, 18 Aug 2026 15:18:01 +0200 > > From: "Kirill A. Korinsky" > > > > Robert, Sebastien, > > > > BFD aligns nonpaged PT_LOAD segments to their maximum contained section > > alignment. Do the same for SPARCV9 instead of retaining the 1 MiB maximum > > page alignment. > > > > This removes roughly 1 MiB of leading padding from ofwboot without changing > > its load address or memory layout. > > > > Here diff for the base and llvm/22 in ports. > > > > Ok? > > This is questionable. What problem are you trying to solve? > Size for floppy, ramdiskB and so on. Without it, ramdiskB won't fit. > > Index: src/gnu/llvm/lld/ELF/Driver.cpp > > =================================================================== > > RCS file: /home/cvs/src/gnu/llvm/lld/ELF/Driver.cpp,v > > diff -u -p -r1.25 Driver.cpp > > --- src/gnu/llvm/lld/ELF/Driver.cpp 30 Jul 2026 19:28:37 -0000 1.25 > > +++ src/gnu/llvm/lld/ELF/Driver.cpp 18 Aug 2026 13:01:23 -0000 > > @@ -3496,6 +3496,12 @@ template void LinkerDriver: > > // sections are non-aligned (maxPageSize set to 1) but text sections are aligned > > // to the target page size. > > ctx.arg.textAlignPageSize = ctx.arg.omagic ? getRealMaxPageSize(ctx, args) : ctx.arg.maxPageSize; > > +#ifdef __OpenBSD__ > > + // Match BFD -N semantics for SPARCV9: use the maximum contained section > > + // alignment for PT_LOAD segments instead of the 1 MiB page alignment. > > + if (ctx.arg.omagic && ctx.arg.emachine == EM_SPARCV9) > > + ctx.arg.textAlignPageSize = ctx.arg.maxPageSize; > > +#endif > > > > ctx.arg.imageBase = getImageBase(ctx, args); > > > > Index: src/gnu/llvm/lld/ELF/Writer.cpp > > =================================================================== > > RCS file: /home/cvs/src/gnu/llvm/lld/ELF/Writer.cpp,v > > diff -u -p -r1.11 Writer.cpp > > --- src/gnu/llvm/lld/ELF/Writer.cpp 30 Jul 2026 19:28:37 -0000 1.11 > > +++ src/gnu/llvm/lld/ELF/Writer.cpp 18 Aug 2026 13:01:23 -0000 > > @@ -2701,6 +2701,16 @@ template void Writer: > > ctx.out.programHeaders->offset = ctx.out.elfHeader->size; > > uint64_t off = ctx.out.elfHeader->size + ctx.out.programHeaders->size; > > > > +#ifdef __OpenBSD__ > > + // BFD's implicit script reserves 0x200 bytes before fixed-address SPARCV9 > > + // -N payloads consumed by OpenFirmware. > > + if (!ctx.arg.relocatable && ctx.arg.omagic && > > + ctx.arg.emachine == EM_SPARCV9 && > > + ctx.arg.sectionStartMap.count(".text") && > > + !ctx.script->hasSectionsCommand && !ctx.script->hasPhdrsCommands()) > > + off = std::max(off, 0x200); > > +#endif > > + > > PhdrEntry *lastRX = nullptr; > > for (Partition &part : ctx.partitions) > > for (auto &p : part.phdrs) > > Index: ports/devel/llvm/22/Makefile > > =================================================================== > > RCS file: /home/cvs/ports/devel/llvm/22/Makefile,v > > diff -u -p -r1.22 Makefile > > --- ports/devel/llvm/22/Makefile 30 Jul 2026 19:28:03 -0000 1.22 > > +++ ports/devel/llvm/22/Makefile 18 Aug 2026 13:17:33 -0000 > > @@ -2,7 +2,7 @@ LLVM_MAJOR = 22 > > LLVM_VERSION = ${LLVM_MAJOR}.1.8 > > LLVM_PKGSPEC = >=22,<23 > > > > -REVISION = 4 > > +REVISION = 5 > > > > SHARED_LIBS += LLVM 0.0 \ > > LTO 0.0 \ > > Index: ports/devel/llvm/22/patches/patch-lld_ELF_Driver_cpp > > =================================================================== > > RCS file: /home/cvs/ports/devel/llvm/22/patches/patch-lld_ELF_Driver_cpp,v > > diff -u -p -r1.3 patch-lld_ELF_Driver_cpp > > --- ports/devel/llvm/22/patches/patch-lld_ELF_Driver_cpp 30 Jul 2026 19:28:03 -0000 1.3 > > +++ ports/devel/llvm/22/patches/patch-lld_ELF_Driver_cpp 18 Aug 2026 13:14:56 -0000 > > @@ -169,7 +169,7 @@ Index: lld/ELF/Driver.cpp > > // Parses --image-base option. > > static std::optional getImageBase(Ctx &ctx, opt::InputArgList &args) { > > // Because we are using `ctx.arg.maxPageSize` here, this function has to be > > -@@ -3435,6 +3491,11 @@ template void LinkerDriver::link(opt::Inp > > +@@ -3435,6 +3491,17 @@ template void LinkerDriver::link(opt::Inp > > // 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. > > ctx.arg.commonPageSize = getCommonPageSize(ctx, args); > > @@ -178,6 +178,12 @@ Index: lld/ELF/Driver.cpp > > + // sections are non-aligned (maxPageSize set to 1) but text sections are aligned > > + // to the target page size. > > + ctx.arg.textAlignPageSize = ctx.arg.omagic ? getRealMaxPageSize(ctx, args) : ctx.arg.maxPageSize; > > ++#ifdef __OpenBSD__ > > ++ // Match BFD -N semantics for SPARCV9: use the maximum contained section > > ++ // alignment for PT_LOAD segments instead of the 1 MiB page alignment. > > ++ if (ctx.arg.omagic && ctx.arg.emachine == EM_SPARCV9) > > ++ ctx.arg.textAlignPageSize = ctx.arg.maxPageSize; > > ++#endif > > > > ctx.arg.imageBase = getImageBase(ctx, args); > > > > Index: ports/devel/llvm/22/patches/patch-lld_ELF_Writer_cpp > > =================================================================== > > RCS file: /home/cvs/ports/devel/llvm/22/patches/patch-lld_ELF_Writer_cpp,v > > diff -u -p -r1.2 patch-lld_ELF_Writer_cpp > > --- ports/devel/llvm/22/patches/patch-lld_ELF_Writer_cpp 30 Jul 2026 19:28:03 -0000 1.2 > > +++ ports/devel/llvm/22/patches/patch-lld_ELF_Writer_cpp 18 Aug 2026 13:14:56 -0000 > > @@ -183,11 +183,10 @@ Index: lld/ELF/Writer.cpp > > if (OutputSection *cmd = findSection(ctx, ".note.gnu.property", partNo)) > > addHdr(PT_GNU_PROPERTY, PF_R)->add(cmd); > > > > -@@ -2586,6 +2610,31 @@ template void Writer::fixSectionAli > > - }; > > +@@ -2587,6 +2611,31 @@ template void Writer::fixSectionAli > > } > > }; > > -+ > > + > > +#ifndef __OpenBSD__ > > + // On i386, produce binaries that are compatible with our W^X implementation > > + if (ctx.arg.emachine == EM_386) { > > @@ -212,6 +211,24 @@ Index: lld/ELF/Writer.cpp > > + } > > + } > > +#endif > > - > > ++ > > for (Partition &part : ctx.partitions) { > > prev = nullptr; > > + for (auto &p : part.phdrs) > > +@@ -2651,6 +2700,16 @@ static std::string rangeToString(uint64_t addr, uint64 > > + template void Writer::assignFileOffsets() { > > + ctx.out.programHeaders->offset = ctx.out.elfHeader->size; > > + uint64_t off = ctx.out.elfHeader->size + ctx.out.programHeaders->size; > > ++ > > ++#ifdef __OpenBSD__ > > ++ // BFD's implicit script reserves 0x200 bytes before fixed-address SPARCV9 > > ++ // -N payloads consumed by OpenFirmware. > > ++ if (!ctx.arg.relocatable && ctx.arg.omagic && > > ++ ctx.arg.emachine == EM_SPARCV9 && > > ++ ctx.arg.sectionStartMap.count(".text") && > > ++ !ctx.script->hasSectionsCommand && !ctx.script->hasPhdrsCommands()) > > ++ off = std::max(off, 0x200); > > ++#endif > > + > > + PhdrEntry *lastRX = nullptr; > > + for (Partition &part : ctx.partitions) > > > > > > > > -- > > wbr, Kirill > > > > -- wbr, Kirill