Re: For an armv7 context, /usr/local/llvm1[789]/lib/clang/1[789]/include/arm_bf16.h does not exist: one thing blocking a firefox build via llvm1[78]
- Reply: Mark Millard : "Re: For an armv7 context, /usr/local/llvm1[789]/lib/clang/1[789]/include/arm_bf16.h does not exist: one thing blocking a firefox build via llvm1[78]"
- In reply to: Mark Millard : "Re: For an armv7 context, /usr/local/llvm1[789]/lib/clang/1[789]/include/arm_bf16.h does not exist: one thing blocking a firefox build via llvm1[78]"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sat, 31 Aug 2024 20:39:36 UTC
On Aug 31, 2024, at 10:43, Mark Millard <marklmi@yahoo.com> wrote: > On Aug 31, 2024, at 00:16, Michal Meloun <mmel@freebsd.org> wrote: > >> On 31.08.2024 8:29, Mark Millard wrote: >>> On Aug 30, 2024, at 22:05, Mark Millard <marklmi@yahoo.com> wrote: >>>> On Aug 30, 2024, at 21:26, Mark Millard <marklmi@yahoo.com> wrote: >>>> >>>>> On Aug 30, 2024, at 20:33, Mark Millard <marklmi@yahoo.com> wrote: >>>>> >>>>>> [Subject was retitled.] >>>>>> >>>>>> On Aug 30, 2024, at 16:24, Mark Millard <marklmi@yahoo.com> wrote: >>>>>> >>>>>>> What my test-of-building got was: No <arm_bf16.h> include file found and >>>>>>> no OFlags::TMPFILE found (OFlags:: was found, TMPFILE in OFlags:: was not): >>>>>>> >>>>>>> In file included from /wrkdirs/usr/ports/www/firefox/work/firefox-129.0.2/mfbt/lz4/xxhash.c:43: >>>>>>> In file included from /wrkdirs/usr/ports/www/firefox/work/firefox-129.0.2/mfbt/lz4/xxhash.h:3434: >>>>>>> /usr/local/llvm17/lib/clang/17/include/arm_neon.h:37:10: fatal error: 'arm_bf16.h' file not found >>>>>>> 37 | #include <arm_bf16.h> >>>>>>> | ^~~~~~~~~~~~ >>>>>>> . . . >>>>>>> >>>>>>> error[E0599]: no associated item named `TMPFILE` found for struct `backend::fs::types::OFlags` in the current scope >>>>>>> --> /wrkdirs/usr/ports/www/firefox/work/firefox-129.0.2/third_party/rust/rustix/src/backend/libc/fs/syscalls.rs:144:32 >>>>>>> | >>>>>>> 144 | if oflags.contains(OFlags::TMPFILE) && crate::backend::if_glibc_is_less_than_2_25() { >>>>>>> | ^^^^^^^ associated item not found in `OFlags` >>>>>>> | >>>>>>> ::: /wrkdirs/usr/ports/www/firefox/work/firefox-129.0.2/third_party/rust/rustix/src/backend/libc/fs/types.rs:203:1 >>>>>>> | >>>>>>> 203 | / bitflags! { >>>>>>> 204 | | /// `O_*` constants for use with [`openat`]. >>>>>>> 205 | | /// >>>>>>> 206 | | /// [`openat`]: crate::fs::openat >>>>>>> ... | >>>>>>> 333 | | } >>>>>>> 334 | | } >>>>>>> | |_- associated item `TMPFILE` not found for this struct >>>>>>> | >>>>>>> . . . >>>>>>> = note: this error originates in the macro `$crate::__impl_bitflags` which comes from the expansion of the macro `bitflags` (in Nightly builds, run with -Z macro-backtrace for more info) >>>>>>> >>>>>>> . . . >>>>>>> >>>>>>> error[E0599]: no associated item named `TMPFILE` found for struct `backend::fs::types::OFlags` in the current scope >>>>>>> --> /wrkdirs/usr/ports/www/firefox/work/firefox-129.0.2/third_party/rust/rustix/src/backend/libc/fs/syscalls.rs:207:32 >>>>>>> | >>>>>>> 207 | if oflags.contains(OFlags::TMPFILE) && crate::backend::if_glibc_is_less_than_2_25() { >>>>>>> | ^^^^^^^ associated item not found in `OFlags` >>>>>>> | >>>>>>> ::: /wrkdirs/usr/ports/www/firefox/work/firefox-129.0.2/third_party/rust/rustix/src/backend/libc/fs/types.rs:203:1 >>>>>>> | >>>>>>> 203 | / bitflags! { >>>>>>> 204 | | /// `O_*` constants for use with [`openat`]. >>>>>>> 205 | | /// >>>>>>> 206 | | /// [`openat`]: crate::fs::openat >>>>>>> ... | >>>>>>> 333 | | } >>>>>>> 334 | | } >>>>>>> | |_- associated item `TMPFILE` not found for this struct >>>>>>> | >>>>>>> . . . >>>>>>> = note: this error originates in the macro `$crate::__impl_bitflags` which comes from the expansion of the macro `bitflags` (in Nightly builds, run with -Z macro-backtrace for more info) >>>>>>> >>>>>>> . . . >>>>>>> = note: this error originates in the macro `$crate::__impl_bitflags` which comes from the expansion of the macro `bitflags` (in Nightly builds, run with -Z macro-backtrace for more info) >>>>>>> >>>>>>> For more information about this error, try `rustc --explain E0599`. >>>>>>> error: could not compile `rustix` (lib) due to 2 previous errors >>>>>>> >>>>>>> >>>>>>> For reference: >>>>>>> >>>>>>> # uname -apKU >>>>>>> FreeBSD aarch64-main-pbase 15.0-CURRENT FreeBSD 15.0-CURRENT #8 main-n271819-5cbb98c8259c-dirty: Fri Aug 23 22:06:47 PDT 2024 root@aarch64-main-pbase:/usr/obj/BUILDs/main-CA76-nodbg-clang/usr/main-src/arm64.aarch64/sys/GENERIC-NODBG-CA76 arm64 aarch64 1500023 1500023 >>>>>>> >>>>>>> # ~/fbsd-based-on-what-commit.sh -C /usr/ports/ >>>>>>> 87a38a839ab8 (HEAD -> main, freebsd/main, freebsd/HEAD) net-im/dissent: update package description >>>>>>> Author: Jan Beich <jbeich@FreeBSD.org> >>>>>>> Commit: Jan Beich <jbeich@FreeBSD.org> >>>>>>> CommitDate: 2024-08-24 18:30:01 +0000 >>>>>>> branch: main >>>>>>> merge-base: 87a38a839ab83c2def100a0975a7afb29e873cf2 >>>>>>> merge-base: CommitDate: 2024-08-24 18:30:01 +0000 >>>>>>> n674987 (--first-parent --count for merge-base) >>>>>>> >>>>>>> But firefox was updated to use: nss>=3.103:security/nss to match what was >>>>>>> available. >>>>>> >>>>>> >>>>>> Using devel/llvm18 instead got the same. >>>>>> >>>>>> Looking inside even a /usr/local/llvm19/lib/clang/19/include/ >>>>>> also shows the arm_bf16.h file is not present. By contrast, >>>>>> for an aarch64 context: >>>>>> >>>>>> # file /usr/local/llvm19/lib/clang/19/include/arm_bf16.h >>>>>> /usr/local/llvm19/lib/clang/19/include/arm_bf16.h: C source, ASCII text >>>>>> >>>>>> Looking quickly at more llvm* shows: >>>>>> >>>>>> # grep -r arm_bf16 /usr/ports/devel/llvm1*/ | more >>>>>> /usr/ports/devel/llvm11/pkg-plist:%%CLANG%%llvm%%LLVM_SUFFIX%%/lib/clang/%%LLVM_RELEASE%%/include/arm_bf16.h >>>>>> /usr/ports/devel/llvm12/pkg-plist:%%CLANG%%llvm%%LLVM_SUFFIX%%/lib/clang/%%LLVM_RELEASE%%/include/arm_bf16.h >>>>>> /usr/ports/devel/llvm13/pkg-plist:%%CLANG%%llvm%%LLVM_SUFFIX%%/lib/clang/%%LLVM_RELEASE%%/include/arm_bf16.h >>>>>> /usr/ports/devel/llvm14/Makefile:_BE_INCS_ARM= arm_bf16.h arm_cde.h arm_fp16.h arm_mve.h arm_neon.h arm_sve.h >>>>>> /usr/ports/devel/llvm15/Makefile:_BE_INCS_ARM= arm_bf16.h arm_cde.h arm_fp16.h arm_mve.h arm_neon.h arm_sve.h >>>>>> /usr/ports/devel/llvm16/files/patch-backport-llvm-db49231: `arm_sve.h` and `arm_bf16.h`, and all those generated files will contain a >>>>>> /usr/ports/devel/llvm16/files/patch-backport-llvm-db49231: `arm_bf16.h` immediately before their own typedef: >>>>>> /usr/ports/devel/llvm16/files/patch-backport-llvm-db49231: #include <arm_bf16.h> >>>>>> /usr/ports/devel/llvm16/files/patch-backport-llvm-db49231: Since `arm_bf16.h` is very likely supposed to be the one true place where >>>>>> /usr/ports/devel/llvm16/files/patch-backport-llvm-db49231: OS << "#include <arm_bf16.h>\n"; >>>>>> /usr/ports/devel/llvm16/files/patch-backport-llvm-db49231: OS << "#include <arm_bf16.h>\n"; >>>>>> /usr/ports/devel/llvm16/Makefile:_BE_INCS_ARM= arm_bf16.h arm_cde.h arm_fp16.h arm_mve.h arm_neon.h arm_sve.h >>>>>> /usr/ports/devel/llvm17/Makefile:_BE_INCS_AArch64= arm_bf16.h arm_sme_draft_spec_subject_to_change.h >>>>>> /usr/ports/devel/llvm18/Makefile:_BE_INCS_AArch64= arm_bf16.h >>>>>> /usr/ports/devel/llvm19/Makefile:_BE_INCS_AArch64= arm_bf16.h >>>>>> >>>>>> llvm1[456] had _BE_INCS_ARM containing arm_bf16.h (and more). >>>>>> llvm1[789] do not. >>>>>> >>>>>> I wonder if: >>>>>> >>>>>> https://cgit.freebsd.org/ports/commit/devel/llvm17/Makefile?id=778e212f234a825c5e19612df4be2e8f838cb024 >>>>>> >>>>>> doing: >>>>>> >>>>>> -_BE_INCS_ARM= arm_bf16.h arm_cde.h arm_fp16.h arm_mve.h arm_neon.h arm_sve.h >>>>>> +_BE_INCS_ARM= arm_cde.h arm_fp16.h arm_mve.h arm_neon.h arm_sve.h >>>>>> >>>>>> was correct. I'll note that in an armv7 context: >>>>>> >>>>>> # find /usr/local/*/gcc14/ -name arm_bf16.h -print >>>>>> /usr/local/lib/gcc14/gcc/armv7-portbld-freebsd15.0/14.2.0/include/arm_bf16.h >>>>>> >>>>>> suggesting that gcc14 considers the file as not aarch64 specific but >>>>>> as armv7 compatibile. >>>>> >>>>> I got that wrong! arm vs. aarch64 have different source files with the >>>>> same name (under different paths): >>>>> >>>>> gcc/gcc/config/arm/arm_bf16.h has guard test: #ifndef _GCC_ARM_BF16_H >>>>> gcc/gcc/config/aarch64/arm_bf16.h has guard test: #ifndef _AARCH64_BF16_H_ >>>>> >>>>> (More content is different.) >>>> >>>> As for llvm*: >>>> >>>> clang/lib/Basic/Targets/ARM.cpp has: >>>> >>>> if (HasBFloat16) { >>>> Builder.defineMacro("__ARM_FEATURE_BF16", "1"); >>>> Builder.defineMacro("__ARM_FEATURE_BF16_VECTOR_ARITHMETIC", "1"); >>>> Builder.defineMacro("__ARM_BF16_FORMAT_ALTERNATIVE", "1"); >>>> } >>>> >>>> clang/lib/Basic/Targets/AArch64.cpp has: >>>> >>>> if (HasBFloat16) { >>>> Builder.defineMacro("__ARM_FEATURE_BF16", "1"); >>>> Builder.defineMacro("__ARM_FEATURE_BF16_VECTOR_ARITHMETIC", "1"); >>>> Builder.defineMacro("__ARM_BF16_FORMAT_ALTERNATIVE", "1"); >>>> } >>>> >>>> which suggests bf16 support has 32-bit support (even if it is armv8 >>>> 32-bit). Looking for AArch32 state in: >>>> >>>> DDI0487K_a_a-profile_architecture_reference_manual.pdf >>>> >>>> it says (via the AArch32 column of a table): >>>> >>>> BF16 Supported if FEAT_AA32BF16 is implemented. >>>> >>>> Looks to me like the removal of arm_bf16.h for llvm target ARM >>>> was incorrect. >>>> >>>>>> So I've put arm_bf16.h back into the llvm18 test context and sometime >>>>>> after 3 hrs I should be able to report on a firefox build attempt with >>>>>> the change (I hope). >>>>> >>>> >>> So, it no longer failed for amd_bf16.h being missing. >>> But it still has the lack-of OFlags::TMPFILE problem that stops the build. >> >> See >> lang/rust/files/armv7/patch-vendor_rustix_src_backend_libc_fs_syscalls.rs >> for inspiration. Unfortunately the exact patch depends on the rustx version, which changes a lot at this place. > > As far as I can tell, for rust conditional compilation with the > likes of (leading whitespace details might not have been > preserved): > > #[cfg(all(unix, target_env = "gnu", not(any(target_os = "freebsd", target_os = "hurd"))))] > if oflags.contains(OFlags::TMPFILE) && crate::backend::if_glibc_is_less_than_2_25() { > return openat_via_syscall(dirfd, path, oflags, mode); > } > > is not just textual preprocessing like #if . . . #endif in > C/C++. It seems that the conditional source still gets some > validation processing even though it will not generate any > code. > > If so, the error report indicates that freebsd is not getting > a definition of the likes of OFlags::TMPFILE . > > I do not know if freebsd should have a definition of > OFlags::TMPFILE (and related) vs. not. If the definition > should be present, the problem is not local to the 2 > blocks of code that are rejected. If the definition should > not be present, then the technique for handling freebsd > for armv7 is not valid and the fix might also not be > local to the 2 blocks of code. > > As I'm only trying to see if my armv7 builds can finish based > on the limited effective process address space size, at some > point I'll likely locally adjust the patching to cause > "if false {" or some such that avoids the validation > checking's rejection. > > I have no intention of running firefox --and I have no armv7 > video context set up to do so. I tried firefox-esr (still at 115.14.0) and it built for much longer and then got: /wrkdirs/usr/ports/www/firefox-esr/work/firefox-115.14.0/gfx/skia/skia/src/core/SkCpu.cpp:146:27: error: use of undeclared identifier 'getauxval' 146 | uint32_t hwcaps = getauxval(AT_HWCAP); | ^ 1 error generated. That is suggestive of arm7 firefox-esr having been broken and unmaintained for a long time. So I'm building firefox with the patching of: third_party/rust/rustix/src/backend/libc/fs/syscalls.rs <http://syscalls.rs/> in place and it has gotten past building that code. . . . time goes by . . . In my context it failed for: rustc-LLVM ERROR: out of memory Allocation failed error: could not compile `gkrust` (lib) So I can experiment some and see if I can change that status in my context. === Mark Millard marklmi at yahoo.com