Architecture specific change in rpms/golang-github-chi.git
by githook-noreply@fedoraproject.org
The package rpms/golang-github-chi.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/golang-github-chi.git/commit/?id=....
Change:
+%ifnarch s390x
Thanks.
Full change:
============
commit 19f78c9a6cfe8cfc8463cc98aeeba6dfd1d724f3
Author: Robert-Andr Mauchin <zebob.m(a)gmail.com>
Date: Wed Jan 29 18:21:06 2020 +0100
Update to 4.0.3
Signed-off-by: Robert-Andr Mauchin <zebob.m(a)gmail.com>
diff --git a/.gitignore b/.gitignore
index b44540a..21ba6cb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,2 @@
/chi-4.0.2.tar.gz
+/chi-4.0.3.tar.gz
diff --git a/golang-github-chi.spec b/golang-github-chi.spec
index cc801a5..214271e 100644
--- a/golang-github-chi.spec
+++ b/golang-github-chi.spec
@@ -1,9 +1,12 @@
# Generated by go2rpm
+# local network access fails on s390x
+%ifnarch s390x
%bcond_without check
+%endif
# https://github.com/go-chi/chi
%global goipath github.com/go-chi/chi
-Version: 4.0.2
+Version: 4.0.3
%gometa
@@ -25,7 +28,7 @@ client-side applications.}
%global godocs _examples CHANGELOG.md CONTRIBUTING.md README.md
Name: %{goname}
-Release: 3%{?dist}
+Release: 1%{?dist}
Summary: Lightweight, idiomatic and composable router for building Go HTTP services
License: MIT
@@ -56,6 +59,9 @@ BuildRequires: golang(golang.org/x/net/http2)
%gopkgfiles
%changelog
+* Wed Jan 29 17:24:14 CET 2020 Robert-Andr Mauchin <zebob.m(a)gmail.com> - 4.0.3-1
+- Update to 4.0.3
+
* Tue Jan 28 2020 Fedora Release Engineering <releng(a)fedoraproject.org> - 4.0.2-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
diff --git a/sources b/sources
index 2111b5b..a915dfe 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (chi-4.0.2.tar.gz) = 246593497a1ea6a0858c4285eb1f178103937ff5f44131e943f2e93166ccca1b1a0852a8316c6dd566cf7b452651ded3371d5f4db3ae086eb8ba6a0b331d9648
+SHA512 (chi-4.0.3.tar.gz) = da1efcb32e3172ae890ec48c368438c4b2f64bc772065962e7ff7a03edae59e693c382d5a102e68a872ccb96c51aa76c7a88a2947d4cec733e4825eba98d422c
4 years, 2 months
Architecture specific change in rpms/rust-conv.git
by githook-noreply@fedoraproject.org
The package rpms/rust-conv.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/rust-conv.git/commit/?id=ecfd5c22....
Change:
+ExclusiveArch: %{rust_arches}
Thanks.
Full change:
============
commit ecfd5c22b868a10fa4c870333974b99a9417d44d
Author: Randy Barlow <randy(a)electronsweatshop.com>
Date: Wed Jan 29 10:36:01 2020 -0500
Initial import
Signed-off-by: Randy Barlow <randy(a)electronsweatshop.com>
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..4eb30d9
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/conv-0.3.3.crate
diff --git a/rust-conv.spec b/rust-conv.spec
new file mode 100644
index 0000000..1d17018
--- /dev/null
+++ b/rust-conv.spec
@@ -0,0 +1,82 @@
+# Generated by rust2rpm 13
+# Upstream requires a much older quickcheck that is available in Fedora, so disable tests for now.
+%bcond_with check
+%global debug_package %{nil}
+
+%global crate conv
+
+Name: rust-%{crate}
+Version: 0.3.3
+Release: 1%{?dist}
+Summary: Number of conversion traits with more specific semantics
+
+# Upstream license specification: MIT
+License: MIT
+URL: https://crates.io/crates/conv
+Source: %{crates_source}
+
+ExclusiveArch: %{rust_arches}
+%if %{__cargo_skip_build}
+BuildArch: noarch
+%endif
+
+BuildRequires: dos2unix
+BuildRequires: rust-packaging
+
+%global _description %{expand:
+Number of conversion traits with more specific semantics than those provided by
+'as' or 'From'/'Into'.}
+
+%description %{_description}
+
+%package devel
+Summary: %{summary}
+License: MIT
+BuildArch: noarch
+
+%description devel %{_description}
+
+This package contains library source intended for building other packages
+which use "%{crate}" crate.
+
+%files devel
+%doc README.md
+%license LICENSE
+%{cargo_registry}/%{crate}-%{version_no_tilde}/
+
+%package -n %{name}+default-devel
+Summary: %{summary}
+License: MIT
+BuildArch: noarch
+
+%description -n %{name}+default-devel %{_description}
+
+This package contains library source intended for building other packages
+which use "default" feature of "%{crate}" crate.
+
+%files -n %{name}+default-devel
+%license LICENSE
+%ghost %{cargo_registry}/%{crate}-%{version_no_tilde}/Cargo.toml
+
+%prep
+%autosetup -n %{crate}-%{version_no_tilde} -p1
+dos2unix README.md
+%cargo_prep
+
+%generate_buildrequires
+%cargo_generate_buildrequires
+
+%build
+%cargo_build
+
+%install
+%cargo_install
+
+%if %{with check}
+%check
+%cargo_test
+%endif
+
+%changelog
+* Tue Jan 21 11:59:45 EST 2020 Randy Barlow <randy(a)electronsweatshop.com> - 0.3.3-1
+- Initial package
diff --git a/sources b/sources
new file mode 100644
index 0000000..1f73a3a
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+SHA512 (conv-0.3.3.crate) = f050cff8528f0fb5a8dd936995c423c5478afc47041c3a8cc8611ceae3228098b80589fdadf78d0028e960fa354768440dd7084cf295a29f2c6aeb554f47a8cb
4 years, 2 months
Architecture specific change in rpms/llvm.git
by githook-noreply@fedoraproject.org
The package rpms/llvm.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/llvm.git/commit/?id=8ddd41e8d9076...
https://src.fedoraproject.org/cgit/rpms/llvm.git/commit/?id=acf22be74c375....
Change:
-%ifnarch s390 s390x
+%ifarch s390 %{arm} %ix86
Thanks.
Full change:
============
commit 00a5db5f3a8841eae6489e40313a222d69dd1203
Author: Tom Stellard <tstellar(a)redhat.com>
Date: Tue Jan 21 21:34:25 2020 +0000
Rebuild after previous build failed to strip binaries
diff --git a/llvm.spec b/llvm.spec
index aaac536..4c2d016 100644
--- a/llvm.spec
+++ b/llvm.spec
@@ -14,7 +14,7 @@
%global min_ver 0
%global patch_ver 1
#%%global rc_ver 3
-%global baserelease 3
+%global baserelease 4
%if %{with compat_build}
@@ -485,6 +485,9 @@ fi
%endif
%changelog
+* Tue Jan 21 2020 Tom Stellard <tstellar(a)redhat.com> - 9.0.1-4
+- Rebuild after previous build failed to strip binaries
+
* Fri Jan 17 2020 Tom Stellard <tstellar(a)redhat.com> - 9.0.1-3
- Add explicit Requires from sub-packages to llvm-libs
commit f61fd6e5576ed6ff7904fa695905e580ece2e3e5
Author: Tom Stellard <tstellar(a)redhat.com>
Date: Tue Jan 21 14:22:18 2020 +0000
tests.yml: Add a test to check size of libLLVM.so
There is a bug in the build system that can cause binary stripping
to fail without failing the build, so add a check to ensure that
libLLVM.so is stripped.
https://bugzilla.redhat.com/show_bug.cgi?id=1793250
diff --git a/tests/tests.yml b/tests/tests.yml
index f620568..e17357f 100644
--- a/tests/tests.yml
+++ b/tests/tests.yml
@@ -14,6 +14,15 @@
- rust-sanity:
dir: ./
run: cargo new hello && cd hello && cargo run
+ # There is a bug in the build process when it runs out of disk space
+ # while stripping binaries, which causes the strip to fail, but does
+ # not fail the build. This results in a libLLVM.so that is over 2GB
+ # which breaks the nightly compose. So this test checks that libLLVM.so
+ # is less than 100MB to ensure it was successfully stripped.
+ # https://bugzilla.redhat.com/show_bug.cgi?id=1793250
+ - libllvm-size:
+ dir: ./
+ run: test `stat -L -c %s /usr/lib64/libLLVM.so` -lt 100000000
# This test ensures that the spec file still builds correctly with
# %global compat_build 1
# FIXME: This fails, because the CI system has a hard-coded timeout of 4
commit 96d4e517c5297d66428983d5f5536f8d6c587d75
Author: Tom Stellard <tstellar(a)redhat.com>
Date: Fri Jan 17 20:06:47 2020 +0000
Add explicit Requires from sub-packages to llvm-libs
RPMDiff complains that these requires are missing.
diff --git a/llvm.spec b/llvm.spec
index 79da708..aaac536 100644
--- a/llvm.spec
+++ b/llvm.spec
@@ -14,7 +14,7 @@
%global min_ver 0
%global patch_ver 1
#%%global rc_ver 3
-%global baserelease 2
+%global baserelease 3
%if %{with compat_build}
@@ -97,6 +97,7 @@ tools as well as libraries with equivalent functionality.
%package devel
Summary: Libraries and header files for LLVM
Requires: %{name}%{?_isa} = %{version}-%{release}
+Requires: %{name}-libs%{?_isa} = %{version}-%{release}
# The installed LLVM cmake files will add -ledit to the linker flags for any
# app that requires the libLLVMLineEditor, so we need to make sure
# libedit-devel is available.
@@ -136,6 +137,7 @@ Static libraries for the LLVM compiler infrastructure.
%package test
Summary: LLVM regression tests
Requires: %{name}%{?_isa} = %{version}-%{release}
+Requires: %{name}-libs%{?_isa} = %{version}-%{release}
Requires: python3-lit
# The regression tests need gold.
Requires: binutils
@@ -483,6 +485,9 @@ fi
%endif
%changelog
+* Fri Jan 17 2020 Tom Stellard <tstellar(a)redhat.com> - 9.0.1-3
+- Add explicit Requires from sub-packages to llvm-libs
+
* Fri Jan 10 2020 Tom Stellard <tstellar(a)redhat.com> - 9.0.1-2
- Fix crash with kernel bpf self-tests
commit d7b5dc38f6f69f92653a87434b14a094c5a96bff
Author: Tom Stellard <tstellar(a)redhat.com>
Date: Fri Jan 10 01:24:14 2020 +0000
Fix crash with kernel bpf self-tests
diff --git a/0001-BPF-Handling-type-conversions-correctly-for-CO-RE.patch b/0001-BPF-Handling-type-conversions-correctly-for-CO-RE.patch
new file mode 100644
index 0000000..bfde9bc
--- /dev/null
+++ b/0001-BPF-Handling-type-conversions-correctly-for-CO-RE.patch
@@ -0,0 +1,2510 @@
+From 20253836fbb1baf5c7cd6fb6558bd12dff682855 Mon Sep 17 00:00:00 2001
+From: Yonghong Song <yhs(a)fb.com>
+Date: Fri, 2 Aug 2019 23:16:44 +0000
+Subject: [PATCH] [BPF] Handling type conversions correctly for CO-RE
+
+With newly added debuginfo type
+metadata for preserve_array_access_index() intrinsic,
+this patch did the following two things:
+ (1). checking validity before adding a new access index
+ to the access chain.
+ (2). calculating access byte offset in IR phase
+ BPFAbstractMemberAccess instead of when BTF is emitted.
+
+For (1), the metadata provided by all preserve_*_access_index()
+intrinsics are used to check whether the to-be-added type
+is a proper struct/union member or array element.
+
+For (2), with all available metadata, calculating access byte
+offset becomes easier in BPFAbstractMemberAccess IR phase.
+This enables us to remove the unnecessary complexity in
+BTFDebug.cpp.
+
+New tests are added for
+ . user explicit casting to array/structure/union
+ . global variable (or its dereference) as the source of base
+ . multi demensional arrays
+ . array access given a base pointer
+ . cases where we won't generate relocation if we cannot find
+ type name.
+
+Differential Revision: https://reviews.llvm.org/D65618
+
+llvm-svn: 367735
+(cherry picked from commit 37d24a696bf74f4830f2582d2f36256ca1b6bb30)
+---
+ llvm/lib/Target/BPF/BPFAbstractMemberAccess.cpp | 332 +++++++++++++++++----
+ llvm/lib/Target/BPF/BTFDebug.cpp | 110 +------
+ llvm/lib/Target/BPF/BTFDebug.h | 15 +-
+ .../CodeGen/BPF/CORE/offset-reloc-cast-array-1.ll | 124 ++++++++
+ .../CodeGen/BPF/CORE/offset-reloc-cast-array-2.ll | 131 ++++++++
+ .../CodeGen/BPF/CORE/offset-reloc-cast-struct-1.ll | 112 +++++++
+ .../CodeGen/BPF/CORE/offset-reloc-cast-struct-2.ll | 117 ++++++++
+ .../CodeGen/BPF/CORE/offset-reloc-cast-struct-3.ll | 116 +++++++
+ .../CodeGen/BPF/CORE/offset-reloc-cast-union-1.ll | 117 ++++++++
+ .../CodeGen/BPF/CORE/offset-reloc-cast-union-2.ll | 118 ++++++++
+ .../test/CodeGen/BPF/CORE/offset-reloc-global-1.ll | 79 +++++
+ .../test/CodeGen/BPF/CORE/offset-reloc-global-2.ll | 95 ++++++
+ .../test/CodeGen/BPF/CORE/offset-reloc-global-3.ll | 84 ++++++
+ llvm/test/CodeGen/BPF/CORE/offset-reloc-ignore.ll | 62 ++++
+ .../CodeGen/BPF/CORE/offset-reloc-multi-array-1.ll | 101 +++++++
+ .../CodeGen/BPF/CORE/offset-reloc-multi-array-2.ll | 107 +++++++
+ .../CodeGen/BPF/CORE/offset-reloc-pointer-1.ll | 83 ++++++
+ .../CodeGen/BPF/CORE/offset-reloc-pointer-2.ll | 85 ++++++
+ .../BPF/CORE/offset-reloc-struct-anonymous.ll | 2 +-
+ .../CodeGen/BPF/CORE/offset-reloc-struct-array.ll | 2 +-
+ .../CodeGen/BPF/CORE/offset-reloc-typedef-array.ll | 2 +-
+ llvm/test/CodeGen/BPF/CORE/offset-reloc-typedef.ll | 2 +-
+ 22 files changed, 1812 insertions(+), 184 deletions(-)
+ create mode 100644 llvm/test/CodeGen/BPF/CORE/offset-reloc-cast-array-1.ll
+ create mode 100644 llvm/test/CodeGen/BPF/CORE/offset-reloc-cast-array-2.ll
+ create mode 100644 llvm/test/CodeGen/BPF/CORE/offset-reloc-cast-struct-1.ll
+ create mode 100644 llvm/test/CodeGen/BPF/CORE/offset-reloc-cast-struct-2.ll
+ create mode 100644 llvm/test/CodeGen/BPF/CORE/offset-reloc-cast-struct-3.ll
+ create mode 100644 llvm/test/CodeGen/BPF/CORE/offset-reloc-cast-union-1.ll
+ create mode 100644 llvm/test/CodeGen/BPF/CORE/offset-reloc-cast-union-2.ll
+ create mode 100644 llvm/test/CodeGen/BPF/CORE/offset-reloc-global-1.ll
+ create mode 100644 llvm/test/CodeGen/BPF/CORE/offset-reloc-global-2.ll
+ create mode 100644 llvm/test/CodeGen/BPF/CORE/offset-reloc-global-3.ll
+ create mode 100644 llvm/test/CodeGen/BPF/CORE/offset-reloc-ignore.ll
+ create mode 100644 llvm/test/CodeGen/BPF/CORE/offset-reloc-multi-array-1.ll
+ create mode 100644 llvm/test/CodeGen/BPF/CORE/offset-reloc-multi-array-2.ll
+ create mode 100644 llvm/test/CodeGen/BPF/CORE/offset-reloc-pointer-1.ll
+ create mode 100644 llvm/test/CodeGen/BPF/CORE/offset-reloc-pointer-2.ll
+
+diff --git a/llvm/lib/Target/BPF/BPFAbstractMemberAccess.cpp b/llvm/lib/Target/BPF/BPFAbstractMemberAccess.cpp
+index 509484b..f55f6f9 100644
+--- a/llvm/lib/Target/BPF/BPFAbstractMemberAccess.cpp
++++ b/llvm/lib/Target/BPF/BPFAbstractMemberAccess.cpp
+@@ -65,6 +65,7 @@
+ #include "llvm/IR/Value.h"
+ #include "llvm/Pass.h"
+ #include "llvm/Transforms/Utils/BasicBlockUtils.h"
++#include <stack>
+
+ #define DEBUG_TYPE "bpf-abstract-member-access"
+
+@@ -106,18 +107,24 @@ private:
+
+ bool doTransformation(Module &M);
+
+- void traceAICall(CallInst *Call, uint32_t Kind);
+- void traceBitCast(BitCastInst *BitCast, CallInst *Parent, uint32_t Kind);
+- void traceGEP(GetElementPtrInst *GEP, CallInst *Parent, uint32_t Kind);
++ void traceAICall(CallInst *Call, uint32_t Kind, const MDNode *ParentMeta,
++ uint32_t ParentAI);
++ void traceBitCast(BitCastInst *BitCast, CallInst *Parent, uint32_t Kind,
++ const MDNode *ParentMeta, uint32_t ParentAI);
++ void traceGEP(GetElementPtrInst *GEP, CallInst *Parent, uint32_t Kind,
++ const MDNode *ParentMeta, uint32_t ParentAI);
+ void collectAICallChains(Module &M, Function &F);
+
+- bool IsPreserveDIAccessIndexCall(const CallInst *Call, uint32_t &Kind);
++ bool IsPreserveDIAccessIndexCall(const CallInst *Call, uint32_t &Kind,
++ const MDNode *&TypeMeta, uint32_t &AccessIndex);
++ bool IsValidAIChain(const MDNode *ParentMeta, uint32_t ParentAI,
++ const MDNode *ChildMeta);
+ bool removePreserveAccessIndexIntrinsic(Module &M);
+ void replaceWithGEP(std::vector<CallInst *> &CallList,
+ uint32_t NumOfZerosIndex, uint32_t DIIndex);
+
+ Value *computeBaseAndAccessKey(CallInst *Call, std::string &AccessKey,
+- uint32_t Kind, MDNode *&TypeMeta);
++ uint32_t Kind, MDNode *&BaseMeta);
+ bool getAccessIndex(const Value *IndexValue, uint64_t &AccessIndex);
+ bool transformGEPChain(Module &M, CallInst *Call, uint32_t Kind);
+ };
+@@ -141,9 +148,53 @@ bool BPFAbstractMemberAccess::runOnModule(Module &M) {
+ return doTransformation(M);
+ }
+
++static bool SkipDIDerivedTag(unsigned Tag) {
++ if (Tag != dwarf::DW_TAG_typedef && Tag != dwarf::DW_TAG_const_type &&
++ Tag != dwarf::DW_TAG_volatile_type &&
++ Tag != dwarf::DW_TAG_restrict_type &&
++ Tag != dwarf::DW_TAG_member)
++ return false;
++ return true;
++}
++
++static DIType * stripQualifiers(DIType *Ty) {
++ while (auto *DTy = dyn_cast<DIDerivedType>(Ty)) {
++ if (!SkipDIDerivedTag(DTy->getTag()))
++ break;
++ Ty = DTy->getBaseType();
++ }
++ return Ty;
++}
++
++static const DIType * stripQualifiers(const DIType *Ty) {
++ while (auto *DTy = dyn_cast<DIDerivedType>(Ty)) {
++ if (!SkipDIDerivedTag(DTy->getTag()))
++ break;
++ Ty = DTy->getBaseType();
++ }
++ return Ty;
++}
++
++static uint32_t calcArraySize(const DICompositeType *CTy, uint32_t StartDim) {
++ DINodeArray Elements = CTy->getElements();
++ uint32_t DimSize = 1;
++ for (uint32_t I = StartDim; I < Elements.size(); ++I) {
++ if (auto *Element = dyn_cast_or_null<DINode>(Elements[I]))
++ if (Element->getTag() == dwarf::DW_TAG_subrange_type) {
++ const DISubrange *SR = cast<DISubrange>(Element);
++ auto *CI = SR->getCount().dyn_cast<ConstantInt *>();
++ DimSize *= CI->getSExtValue();
++ }
++ }
++
++ return DimSize;
++}
++
+ /// Check whether a call is a preserve_*_access_index intrinsic call or not.
+ bool BPFAbstractMemberAccess::IsPreserveDIAccessIndexCall(const CallInst *Call,
+- uint32_t &Kind) {
++ uint32_t &Kind,
++ const MDNode *&TypeMeta,
++ uint32_t &AccessIndex) {
+ if (!Call)
+ return false;
+
+@@ -152,14 +203,29 @@ bool BPFAbstractMemberAccess::IsPreserveDIAccessIndexCall(const CallInst *Call,
+ return false;
+ if (GV->getName().startswith("llvm.preserve.array.access.index")) {
+ Kind = BPFPreserveArrayAI;
++ TypeMeta = Call->getMetadata(LLVMContext::MD_preserve_access_index);
++ if (!TypeMeta)
++ report_fatal_error("Missing metadata for llvm.preserve.array.access.index intrinsic");
++ AccessIndex = cast<ConstantInt>(Call->getArgOperand(2))
++ ->getZExtValue();
+ return true;
+ }
+ if (GV->getName().startswith("llvm.preserve.union.access.index")) {
+ Kind = BPFPreserveUnionAI;
++ TypeMeta = Call->getMetadata(LLVMContext::MD_preserve_access_index);
++ if (!TypeMeta)
++ report_fatal_error("Missing metadata for llvm.preserve.union.access.index intrinsic");
++ AccessIndex = cast<ConstantInt>(Call->getArgOperand(1))
++ ->getZExtValue();
+ return true;
+ }
+ if (GV->getName().startswith("llvm.preserve.struct.access.index")) {
+ Kind = BPFPreserveStructAI;
++ TypeMeta = Call->getMetadata(LLVMContext::MD_preserve_access_index);
++ if (!TypeMeta)
++ report_fatal_error("Missing metadata for llvm.preserve.struct.access.index intrinsic");
++ AccessIndex = cast<ConstantInt>(Call->getArgOperand(2))
++ ->getZExtValue();
+ return true;
+ }
+
+@@ -200,7 +266,9 @@ bool BPFAbstractMemberAccess::removePreserveAccessIndexIntrinsic(Module &M) {
+ for (auto &I : BB) {
+ auto *Call = dyn_cast<CallInst>(&I);
+ uint32_t Kind;
+- if (!IsPreserveDIAccessIndexCall(Call, Kind))
++ const MDNode *TypeMeta;
++ uint32_t AccessIndex;
++ if (!IsPreserveDIAccessIndexCall(Call, Kind, TypeMeta, AccessIndex))
+ continue;
+
+ Found = true;
+@@ -232,25 +300,79 @@ bool BPFAbstractMemberAccess::removePreserveAccessIndexIntrinsic(Module &M) {
+ return Found;
+ }
+
+-void BPFAbstractMemberAccess::traceAICall(CallInst *Call, uint32_t Kind) {
++/// Check whether the access index chain is valid. We check
++/// here because there may be type casts between two
++/// access indexes. We want to ensure memory access still valid.
++bool BPFAbstractMemberAccess::IsValidAIChain(const MDNode *ParentType,
++ uint32_t ParentAI,
++ const MDNode *ChildType) {
++ const DIType *PType = stripQualifiers(cast<DIType>(ParentType));
++ const DIType *CType = stripQualifiers(cast<DIType>(ChildType));
++
++ // Child is a derived/pointer type, which is due to type casting.
++ // Pointer type cannot be in the middle of chain.
++ if (const auto *PtrTy = dyn_cast<DIDerivedType>(CType))
++ return false;
++
++ // Parent is a pointer type.
++ if (const auto *PtrTy = dyn_cast<DIDerivedType>(PType)) {
++ if (PtrTy->getTag() != dwarf::DW_TAG_pointer_type)
++ return false;
++ return stripQualifiers(PtrTy->getBaseType()) == CType;
++ }
++
++ // Otherwise, struct/union/array types
++ const auto *PTy = dyn_cast<DICompositeType>(PType);
++ const auto *CTy = dyn_cast<DICompositeType>(CType);
++ assert(PTy && CTy && "ParentType or ChildType is null or not composite");
++
++ uint32_t PTyTag = PTy->getTag();
++ assert(PTyTag == dwarf::DW_TAG_array_type ||
++ PTyTag == dwarf::DW_TAG_structure_type ||
++ PTyTag == dwarf::DW_TAG_union_type);
++
++ uint32_t CTyTag = CTy->getTag();
++ assert(CTyTag == dwarf::DW_TAG_array_type ||
++ CTyTag == dwarf::DW_TAG_structure_type ||
++ CTyTag == dwarf::DW_TAG_union_type);
++
++ // Multi dimensional arrays, base element should be the same
++ if (PTyTag == dwarf::DW_TAG_array_type && PTyTag == CTyTag)
++ return PTy->getBaseType() == CTy->getBaseType();
++
++ DIType *Ty;
++ if (PTyTag == dwarf::DW_TAG_array_type)
++ Ty = PTy->getBaseType();
++ else
++ Ty = dyn_cast<DIType>(PTy->getElements()[ParentAI]);
++
++ return dyn_cast<DICompositeType>(stripQualifiers(Ty)) == CTy;
++}
++
++void BPFAbstractMemberAccess::traceAICall(CallInst *Call, uint32_t Kind,
++ const MDNode *ParentMeta,
++ uint32_t ParentAI) {
+ for (User *U : Call->users()) {
+ Instruction *Inst = dyn_cast<Instruction>(U);
+ if (!Inst)
+ continue;
+
+ if (auto *BI = dyn_cast<BitCastInst>(Inst)) {
+- traceBitCast(BI, Call, Kind);
++ traceBitCast(BI, Call, Kind, ParentMeta, ParentAI);
+ } else if (auto *CI = dyn_cast<CallInst>(Inst)) {
+ uint32_t CIKind;
+- if (IsPreserveDIAccessIndexCall(CI, CIKind)) {
++ const MDNode *ChildMeta;
++ uint32_t ChildAI;
++ if (IsPreserveDIAccessIndexCall(CI, CIKind, ChildMeta, ChildAI) &&
++ IsValidAIChain(ParentMeta, ParentAI, ChildMeta)) {
+ AIChain[CI] = std::make_pair(Call, Kind);
+- traceAICall(CI, CIKind);
++ traceAICall(CI, CIKind, ChildMeta, ChildAI);
+ } else {
+ BaseAICalls[Call] = Kind;
+ }
+ } else if (auto *GI = dyn_cast<GetElementPtrInst>(Inst)) {
+ if (GI->hasAllZeroIndices())
+- traceGEP(GI, Call, Kind);
++ traceGEP(GI, Call, Kind, ParentMeta, ParentAI);
+ else
+ BaseAICalls[Call] = Kind;
+ }
+@@ -258,25 +380,30 @@ void BPFAbstractMemberAccess::traceAICall(CallInst *Call, uint32_t Kind) {
+ }
+
+ void BPFAbstractMemberAccess::traceBitCast(BitCastInst *BitCast,
+- CallInst *Parent, uint32_t Kind) {
++ CallInst *Parent, uint32_t Kind,
++ const MDNode *ParentMeta,
++ uint32_t ParentAI) {
+ for (User *U : BitCast->users()) {
+ Instruction *Inst = dyn_cast<Instruction>(U);
+ if (!Inst)
+ continue;
+
+ if (auto *BI = dyn_cast<BitCastInst>(Inst)) {
+- traceBitCast(BI, Parent, Kind);
++ traceBitCast(BI, Parent, Kind, ParentMeta, ParentAI);
+ } else if (auto *CI = dyn_cast<CallInst>(Inst)) {
+ uint32_t CIKind;
+- if (IsPreserveDIAccessIndexCall(CI, CIKind)) {
++ const MDNode *ChildMeta;
++ uint32_t ChildAI;
++ if (IsPreserveDIAccessIndexCall(CI, CIKind, ChildMeta, ChildAI) &&
++ IsValidAIChain(ParentMeta, ParentAI, ChildMeta)) {
+ AIChain[CI] = std::make_pair(Parent, Kind);
+- traceAICall(CI, CIKind);
++ traceAICall(CI, CIKind, ChildMeta, ChildAI);
+ } else {
+ BaseAICalls[Parent] = Kind;
+ }
+ } else if (auto *GI = dyn_cast<GetElementPtrInst>(Inst)) {
+ if (GI->hasAllZeroIndices())
+- traceGEP(GI, Parent, Kind);
++ traceGEP(GI, Parent, Kind, ParentMeta, ParentAI);
+ else
+ BaseAICalls[Parent] = Kind;
+ }
+@@ -284,25 +411,29 @@ void BPFAbstractMemberAccess::traceBitCast(BitCastInst *BitCast,
+ }
+
+ void BPFAbstractMemberAccess::traceGEP(GetElementPtrInst *GEP, CallInst *Parent,
+- uint32_t Kind) {
++ uint32_t Kind, const MDNode *ParentMeta,
++ uint32_t ParentAI) {
+ for (User *U : GEP->users()) {
+ Instruction *Inst = dyn_cast<Instruction>(U);
+ if (!Inst)
+ continue;
+
+ if (auto *BI = dyn_cast<BitCastInst>(Inst)) {
+- traceBitCast(BI, Parent, Kind);
++ traceBitCast(BI, Parent, Kind, ParentMeta, ParentAI);
+ } else if (auto *CI = dyn_cast<CallInst>(Inst)) {
+ uint32_t CIKind;
+- if (IsPreserveDIAccessIndexCall(CI, CIKind)) {
++ const MDNode *ChildMeta;
++ uint32_t ChildAI;
++ if (IsPreserveDIAccessIndexCall(CI, CIKind, ChildMeta, ChildAI) &&
++ IsValidAIChain(ParentMeta, ParentAI, ChildMeta)) {
+ AIChain[CI] = std::make_pair(Parent, Kind);
+- traceAICall(CI, CIKind);
++ traceAICall(CI, CIKind, ChildMeta, ChildAI);
+ } else {
+ BaseAICalls[Parent] = Kind;
+ }
+ } else if (auto *GI = dyn_cast<GetElementPtrInst>(Inst)) {
+ if (GI->hasAllZeroIndices())
+- traceGEP(GI, Parent, Kind);
++ traceGEP(GI, Parent, Kind, ParentMeta, ParentAI);
+ else
+ BaseAICalls[Parent] = Kind;
+ }
+@@ -316,12 +447,14 @@ void BPFAbstractMemberAccess::collectAICallChains(Module &M, Function &F) {
+ for (auto &BB : F)
+ for (auto &I : BB) {
+ uint32_t Kind;
++ const MDNode *TypeMeta;
++ uint32_t AccessIndex;
+ auto *Call = dyn_cast<CallInst>(&I);
+- if (!IsPreserveDIAccessIndexCall(Call, Kind) ||
++ if (!IsPreserveDIAccessIndexCall(Call, Kind, TypeMeta, AccessIndex) ||
+ AIChain.find(Call) != AIChain.end())
+ continue;
+
+- traceAICall(Call, Kind);
++ traceAICall(Call, Kind, TypeMeta, AccessIndex);
+ }
+ }
+
+@@ -344,62 +477,131 @@ Value *BPFAbstractMemberAccess::computeBaseAndAccessKey(CallInst *Call,
+ uint32_t Kind,
+ MDNode *&TypeMeta) {
+ Value *Base = nullptr;
+- std::vector<uint64_t> AccessIndices;
+- uint64_t TypeNameIndex = 0;
+- std::string LastTypeName;
++ std::string TypeName;
++ std::stack<std::pair<CallInst *, uint32_t>> CallStack;
+
++ // Put the access chain into a stack with the top as the head of the chain.
+ while (Call) {
+- // Base of original corresponding GEP
+- Base = Call->getArgOperand(0);
++ CallStack.push(std::make_pair(Call, Kind));
++ Kind = AIChain[Call].second;
++ Call = AIChain[Call].first;
++ }
+
+- // Type Name
+- std::string TypeName;
+- MDNode *MDN;
++ // The access offset from the base of the head of chain is also
++ // calculated here as all debuginfo types are available.
++
++ // Get type name and calculate the first index.
++ // We only want to get type name from structure or union.
++ // If user wants a relocation like
++ // int *p; ... __builtin_preserve_access_index(&p[4]) ...
++ // or
++ // int a[10][20]; ... __builtin_preserve_access_index(&a[2][3]) ...
++ // we will skip them.
++ uint32_t FirstIndex = 0;
++ uint32_t AccessOffset = 0;
++ while (CallStack.size()) {
++ auto StackElem = CallStack.top();
++ Call = StackElem.first;
++ Kind = StackElem.second;
++
++ if (!Base)
++ Base = Call->getArgOperand(0);
++
++ MDNode *MDN = Call->getMetadata(LLVMContext::MD_preserve_access_index);
++ DIType *Ty = stripQualifiers(cast<DIType>(MDN));
+ if (Kind == BPFPreserveUnionAI || Kind == BPFPreserveStructAI) {
+- MDN = Call->getMetadata(LLVMContext::MD_preserve_access_index);
+- if (!MDN)
+- return nullptr;
++ // struct or union type
++ TypeName = Ty->getName();
++ TypeMeta = Ty;
++ AccessOffset += FirstIndex * Ty->getSizeInBits() >> 3;
++ break;
++ }
+
+- DIType *Ty = dyn_cast<DIType>(MDN);
+- if (!Ty)
++ // Array entries will always be consumed for accumulative initial index.
++ CallStack.pop();
++
++ // BPFPreserveArrayAI
++ uint64_t AccessIndex;
++ if (!getAccessIndex(Call->getArgOperand(2), AccessIndex))
++ return nullptr;
++
++ DIType *BaseTy = nullptr;
++ bool CheckElemType = false;
++ if (const auto *CTy = dyn_cast<DICompositeType>(Ty)) {
++ // array type
++ assert(CTy->getTag() == dwarf::DW_TAG_array_type);
++
++
++ FirstIndex += AccessIndex * calcArraySize(CTy, 1);
++ BaseTy = stripQualifiers(CTy->getBaseType());
++ CheckElemType = CTy->getElements().size() == 1;
++ } else {
++ // pointer type
++ auto *DTy = cast<DIDerivedType>(Ty);
++ assert(DTy->getTag() == dwarf::DW_TAG_pointer_type);
++
++ BaseTy = stripQualifiers(DTy->getBaseType());
++ CTy = dyn_cast<DICompositeType>(BaseTy);
++ if (!CTy) {
++ CheckElemType = true;
++ } else if (CTy->getTag() != dwarf::DW_TAG_array_type) {
++ FirstIndex += AccessIndex;
++ CheckElemType = true;
++ } else {
++ FirstIndex += AccessIndex * calcArraySize(CTy, 0);
++ }
++ }
++
++ if (CheckElemType) {
++ auto *CTy = dyn_cast<DICompositeType>(BaseTy);
++ if (!CTy)
+ return nullptr;
+
+- TypeName = Ty->getName();
++ unsigned CTag = CTy->getTag();
++ if (CTag != dwarf::DW_TAG_structure_type && CTag != dwarf::DW_TAG_union_type)
++ return nullptr;
++ else
++ TypeName = CTy->getName();
++ TypeMeta = CTy;
++ AccessOffset += FirstIndex * CTy->getSizeInBits() >> 3;
++ break;
+ }
++ }
++ assert(TypeName.size());
++ AccessKey += std::to_string(FirstIndex);
++
++ // Traverse the rest of access chain to complete offset calculation
++ // and access key construction.
++ while (CallStack.size()) {
++ auto StackElem = CallStack.top();
++ Call = StackElem.first;
++ Kind = StackElem.second;
++ CallStack.pop();
+
+ // Access Index
+ uint64_t AccessIndex;
+ uint32_t ArgIndex = (Kind == BPFPreserveUnionAI) ? 1 : 2;
+ if (!getAccessIndex(Call->getArgOperand(ArgIndex), AccessIndex))
+ return nullptr;
+-
+- AccessIndices.push_back(AccessIndex);
+- if (TypeName.size()) {
+- TypeNameIndex = AccessIndices.size() - 1;
+- LastTypeName = TypeName;
+- TypeMeta = MDN;
++ AccessKey += ":" + std::to_string(AccessIndex);
++
++ MDNode *MDN = Call->getMetadata(LLVMContext::MD_preserve_access_index);
++ // At this stage, it cannot be pointer type.
++ auto *CTy = cast<DICompositeType>(stripQualifiers(cast<DIType>(MDN)));
++ uint32_t Tag = CTy->getTag();
++ if (Tag == dwarf::DW_TAG_structure_type) {
++ auto *MemberTy = cast<DIDerivedType>(CTy->getElements()[AccessIndex]);
++ AccessOffset += MemberTy->getOffsetInBits() >> 3;
++ } else if (Tag == dwarf::DW_TAG_array_type) {
++ auto *EltTy = stripQualifiers(CTy->getBaseType());
++ AccessOffset += AccessIndex * calcArraySize(CTy, 1) *
++ EltTy->getSizeInBits() >> 3;
+ }
+-
+- Kind = AIChain[Call].second;
+- Call = AIChain[Call].first;
+ }
+
+- // The intial type name is required.
+- // FIXME: if the initial type access is an array index, e.g.,
+- // &a[3].b.c, only one dimentional array is supported.
+- if (!LastTypeName.size() || AccessIndices.size() > TypeNameIndex + 2)
+- return nullptr;
+-
+- // Construct the type string AccessKey.
+- for (unsigned I = 0; I < AccessIndices.size(); ++I)
+- AccessKey = std::to_string(AccessIndices[I]) + ":" + AccessKey;
+-
+- if (TypeNameIndex == AccessIndices.size() - 1)
+- AccessKey = "0:" + AccessKey;
+-
+ // Access key is the type name + access string, uniquely identifying
+ // one kernel memory access.
+- AccessKey = LastTypeName + ":" + AccessKey;
++ AccessKey = TypeName + ":" + std::to_string(AccessOffset) + "$" + AccessKey;
+
+ return Base;
+ }
+@@ -409,7 +611,7 @@ Value *BPFAbstractMemberAccess::computeBaseAndAccessKey(CallInst *Call,
+ bool BPFAbstractMemberAccess::transformGEPChain(Module &M, CallInst *Call,
+ uint32_t Kind) {
+ std::string AccessKey;
+- MDNode *TypeMeta = nullptr;
++ MDNode *TypeMeta;
+ Value *Base =
+ computeBaseAndAccessKey(Call, AccessKey, Kind, TypeMeta);
+ if (!Base)
+@@ -419,7 +621,7 @@ bool BPFAbstractMemberAccess::transformGEPChain(Module &M, CallInst *Call,
+ // For any original GEP Call and Base %2 like
+ // %4 = bitcast %struct.net_device** %dev1 to i64*
+ // it is transformed to:
+- // %6 = load __BTF_0:sk_buff:0:0:2:0:
++ // %6 = load sk_buff:50:$0:0:0:2:0
+ // %7 = bitcast %struct.sk_buff* %2 to i8*
+ // %8 = getelementptr i8, i8* %7, %6
+ // %9 = bitcast i8* %8 to i64*
+@@ -432,9 +634,7 @@ bool BPFAbstractMemberAccess::transformGEPChain(Module &M, CallInst *Call,
+ GV = new GlobalVariable(M, Type::getInt64Ty(BB->getContext()), false,
+ GlobalVariable::ExternalLinkage, NULL, AccessKey);
+ GV->addAttribute(BPFCoreSharedInfo::AmaAttr);
+- // Set the metadata (debuginfo types) for the global.
+- if (TypeMeta)
+- GV->setMetadata(LLVMContext::MD_preserve_access_index, TypeMeta);
++ GV->setMetadata(LLVMContext::MD_preserve_access_index, TypeMeta);
+ GEPGlobals[AccessKey] = GV;
+ } else {
+ GV = GEPGlobals[AccessKey];
+diff --git a/llvm/lib/Target/BPF/BTFDebug.cpp b/llvm/lib/Target/BPF/BTFDebug.cpp
+index 5c542e7..9b966eb 100644
+--- a/llvm/lib/Target/BPF/BTFDebug.cpp
++++ b/llvm/lib/Target/BPF/BTFDebug.cpp
+@@ -30,18 +30,6 @@ static const char *BTFKindStr[] = {
+ #include "BTF.def"
+ };
+
+-static const DIType * stripQualifiers(const DIType *Ty) {
+- while (const auto *DTy = dyn_cast<DIDerivedType>(Ty)) {
+- unsigned Tag = DTy->getTag();
+- if (Tag != dwarf::DW_TAG_typedef && Tag != dwarf::DW_TAG_const_type &&
+- Tag != dwarf::DW_TAG_volatile_type && Tag != dwarf::DW_TAG_restrict_type)
+- break;
+- Ty = DTy->getBaseType();
+- }
+-
+- return Ty;
+-}
+-
+ /// Emit a BTF common type.
+ void BTFTypeBase::emitType(MCStreamer &OS) {
+ OS.AddComment(std::string(BTFKindStr[Kind]) + "(id = " + std::to_string(Id) +
+@@ -196,9 +184,7 @@ void BTFTypeEnum::emitType(MCStreamer &OS) {
+ }
+ }
+
+-BTFTypeArray::BTFTypeArray(const DIType *Ty, uint32_t ElemTypeId,
+- uint32_t ElemSize, uint32_t NumElems)
+- : ElemTyNoQual(Ty), ElemSize(ElemSize) {
++BTFTypeArray::BTFTypeArray(uint32_t ElemTypeId, uint32_t NumElems) {
+ Kind = BTF::BTF_KIND_ARRAY;
+ BTFType.NameOff = 0;
+ BTFType.Info = Kind << 24;
+@@ -219,9 +205,6 @@ void BTFTypeArray::completeType(BTFDebug &BDebug) {
+ // created during initial type traversal. Just
+ // retrieve that type id.
+ ArrayInfo.IndexType = BDebug.getArrayIndexTypeId();
+-
+- ElemTypeNoQual = ElemTyNoQual ? BDebug.getTypeId(ElemTyNoQual)
+- : ArrayInfo.ElemType;
+ }
+
+ void BTFTypeArray::emitType(MCStreamer &OS) {
+@@ -231,12 +214,6 @@ void BTFTypeArray::emitType(MCStreamer &OS) {
+ OS.EmitIntValue(ArrayInfo.Nelems, 4);
+ }
+
+-void BTFTypeArray::getLocInfo(uint32_t Loc, uint32_t &LocOffset,
+- uint32_t &ElementTypeId) {
+- ElementTypeId = ElemTypeNoQual;
+- LocOffset = Loc * ElemSize;
+-}
+-
+ /// Represent either a struct or a union.
+ BTFTypeStruct::BTFTypeStruct(const DICompositeType *STy, bool IsStruct,
+ bool HasBitField, uint32_t Vlen)
+@@ -268,7 +245,6 @@ void BTFTypeStruct::completeType(BTFDebug &BDebug) {
+ }
+ const auto *BaseTy = DDTy->getBaseType();
+ BTFMember.Type = BDebug.getTypeId(BaseTy);
+- MemberTypeNoQual.push_back(BDebug.getTypeId(stripQualifiers(BaseTy)));
+ Members.push_back(BTFMember);
+ }
+ }
+@@ -285,15 +261,6 @@ void BTFTypeStruct::emitType(MCStreamer &OS) {
+
+ std::string BTFTypeStruct::getName() { return STy->getName(); }
+
+-void BTFTypeStruct::getMemberInfo(uint32_t Loc, uint32_t &MemberOffset,
+- uint32_t &MemberType) {
+- MemberType = MemberTypeNoQual[Loc];
+- MemberOffset =
+- HasBitField ? Members[Loc].Offset & 0xffffff : Members[Loc].Offset;
+-}
+-
+-uint32_t BTFTypeStruct::getStructSize() { return STy->getSizeInBits() >> 3; }
+-
+ /// The Func kind represents both subprogram and pointee of function
+ /// pointers. If the FuncName is empty, it represents a pointee of function
+ /// pointer. Otherwise, it represents a subprogram. The func arg names
+@@ -511,12 +478,10 @@ void BTFDebug::visitArrayType(const DICompositeType *CTy, uint32_t &TypeId) {
+ visitTypeEntry(ElemType, ElemTypeId, false, false);
+
+ // Strip qualifiers from element type to get accurate element size.
+- ElemType = stripQualifiers(ElemType);
+ ElemSize = ElemType->getSizeInBits() >> 3;
+
+ if (!CTy->getSizeInBits()) {
+- auto TypeEntry = llvm::make_unique<BTFTypeArray>(ElemType, ElemTypeId, 0, 0);
+- ArrayTypes.push_back(TypeEntry.get());
++ auto TypeEntry = llvm::make_unique<BTFTypeArray>(ElemTypeId, 0);
+ ElemTypeId = addType(std::move(TypeEntry), CTy);
+ } else {
+ // Visit array dimensions.
+@@ -527,12 +492,9 @@ void BTFDebug::visitArrayType(const DICompositeType *CTy, uint32_t &TypeId) {
+ const DISubrange *SR = cast<DISubrange>(Element);
+ auto *CI = SR->getCount().dyn_cast<ConstantInt *>();
+ int64_t Count = CI->getSExtValue();
+- const DIType *ArrayElemTy = (I == 0) ? ElemType : nullptr;
+
+ auto TypeEntry =
+- llvm::make_unique<BTFTypeArray>(ArrayElemTy, ElemTypeId,
+- ElemSize, Count);
+- ArrayTypes.push_back(TypeEntry.get());
++ llvm::make_unique<BTFTypeArray>(ElemTypeId, Count);
+ if (I == 0)
+ ElemTypeId = addType(std::move(TypeEntry), CTy);
+ else
+@@ -1002,74 +964,22 @@ unsigned BTFDebug::populateStructType(const DIType *Ty) {
+ return Id;
+ }
+
+-// Find struct/array debuginfo types given a type id.
+-void BTFDebug::setTypeFromId(uint32_t TypeId, BTFTypeStruct **PrevStructType,
+- BTFTypeArray **PrevArrayType) {
+- for (const auto &StructType : StructTypes) {
+- if (StructType->getId() == TypeId) {
+- *PrevStructType = StructType;
+- return;
+- }
+- }
+- for (const auto &ArrayType : ArrayTypes) {
+- if (ArrayType->getId() == TypeId) {
+- *PrevArrayType = ArrayType;
+- return;
+- }
+- }
+-}
+-
+ /// Generate a struct member offset relocation.
+ void BTFDebug::generateOffsetReloc(const MachineInstr *MI,
+ const MCSymbol *ORSym, DIType *RootTy,
+ StringRef AccessPattern) {
+- BTFTypeStruct *PrevStructType = nullptr;
+- BTFTypeArray *PrevArrayType = nullptr;
+ unsigned RootId = populateStructType(RootTy);
+- setTypeFromId(RootId, &PrevStructType, &PrevArrayType);
+- unsigned RootTySize = PrevStructType->getStructSize();
+- StringRef IndexPattern = AccessPattern.substr(AccessPattern.find_first_of(':') + 1);
++ size_t FirstDollar = AccessPattern.find_first_of('$');
++ size_t FirstColon = AccessPattern.find_first_of(':');
++ StringRef IndexPattern = AccessPattern.substr(FirstDollar + 1);
++ StringRef OffsetStr = AccessPattern.substr(FirstColon + 1,
++ FirstDollar - FirstColon);
+
+ BTFOffsetReloc OffsetReloc;
+ OffsetReloc.Label = ORSym;
+- OffsetReloc.OffsetNameOff = addString(IndexPattern.drop_back());
++ OffsetReloc.OffsetNameOff = addString(IndexPattern);
+ OffsetReloc.TypeID = RootId;
+-
+- uint32_t Start = 0, End = 0, Offset = 0;
+- bool FirstAccess = true;
+- for (auto C : IndexPattern) {
+- if (C != ':') {
+- End++;
+- } else {
+- std::string SubStr = IndexPattern.substr(Start, End - Start);
+- int Loc = std::stoi(SubStr);
+-
+- if (FirstAccess) {
+- Offset = Loc * RootTySize;
+- FirstAccess = false;
+- } else if (PrevStructType) {
+- uint32_t MemberOffset, MemberTypeId;
+- PrevStructType->getMemberInfo(Loc, MemberOffset, MemberTypeId);
+-
+- Offset += MemberOffset >> 3;
+- PrevStructType = nullptr;
+- setTypeFromId(MemberTypeId, &PrevStructType, &PrevArrayType);
+- } else if (PrevArrayType) {
+- uint32_t LocOffset, ElementTypeId;
+- PrevArrayType->getLocInfo(Loc, LocOffset, ElementTypeId);
+-
+- Offset += LocOffset;
+- PrevArrayType = nullptr;
+- setTypeFromId(ElementTypeId, &PrevStructType, &PrevArrayType);
+- } else {
+- llvm_unreachable("Internal Error: BTF offset relocation type traversal error");
+- }
+-
+- Start = End + 1;
+- End = Start;
+- }
+- }
+- AccessOffsets[AccessPattern.str()] = Offset;
++ AccessOffsets[AccessPattern.str()] = std::stoi(OffsetStr);
+ OffsetRelocTable[SecNameOff].push_back(OffsetReloc);
+ }
+
+diff --git a/llvm/lib/Target/BPF/BTFDebug.h b/llvm/lib/Target/BPF/BTFDebug.h
+index e210d18..a79527d 100644
+--- a/llvm/lib/Target/BPF/BTFDebug.h
++++ b/llvm/lib/Target/BPF/BTFDebug.h
+@@ -104,18 +104,13 @@ public:
+
+ /// Handle array type.
+ class BTFTypeArray : public BTFTypeBase {
+- const DIType *ElemTyNoQual;
+- uint32_t ElemSize;
+ struct BTF::BTFArray ArrayInfo;
+- uint32_t ElemTypeNoQual;
+
+ public:
+- BTFTypeArray(const DIType *Ty, uint32_t ElemTypeId,
+- uint32_t ElemSize, uint32_t NumElems);
++ BTFTypeArray(uint32_t ElemTypeId, uint32_t NumElems);
+ uint32_t getSize() { return BTFTypeBase::getSize() + BTF::BTFArraySize; }
+ void completeType(BTFDebug &BDebug);
+ void emitType(MCStreamer &OS);
+- void getLocInfo(uint32_t Loc, uint32_t &LocOffset, uint32_t &ElementTypeId);
+ };
+
+ /// Handle struct/union type.
+@@ -123,7 +118,6 @@ class BTFTypeStruct : public BTFTypeBase {
+ const DICompositeType *STy;
+ bool HasBitField;
+ std::vector<struct BTF::BTFMember> Members;
+- std::vector<uint32_t> MemberTypeNoQual;
+
+ public:
+ BTFTypeStruct(const DICompositeType *STy, bool IsStruct, bool HasBitField,
+@@ -134,8 +128,6 @@ public:
+ void completeType(BTFDebug &BDebug);
+ void emitType(MCStreamer &OS);
+ std::string getName();
+- void getMemberInfo(uint32_t Loc, uint32_t &Offset, uint32_t &MemberType);
+- uint32_t getStructSize();
+ };
+
+ /// Handle function pointer.
+@@ -262,7 +254,6 @@ class BTFDebug : public DebugHandlerBase {
+ StringMap<std::vector<std::string>> FileContent;
+ std::map<std::string, std::unique_ptr<BTFKindDataSec>> DataSecEntries;
+ std::vector<BTFTypeStruct *> StructTypes;
+- std::vector<BTFTypeArray *> ArrayTypes;
+ std::map<std::string, int64_t> AccessOffsets;
+ std::map<StringRef, std::pair<bool, std::vector<BTFTypeDerived *>>>
+ FixupDerivedTypes;
+@@ -312,10 +303,6 @@ class BTFDebug : public DebugHandlerBase {
+ void generateOffsetReloc(const MachineInstr *MI, const MCSymbol *ORSym,
+ DIType *RootTy, StringRef AccessPattern);
+
+- /// Set the to-be-traversed Struct/Array Type based on TypeId.
+- void setTypeFromId(uint32_t TypeId, BTFTypeStruct **PrevStructType,
+- BTFTypeArray **PrevArrayType);
+-
+ /// Populating unprocessed struct type.
+ unsigned populateStructType(const DIType *Ty);
+
+diff --git a/llvm/test/CodeGen/BPF/CORE/offset-reloc-cast-array-1.ll b/llvm/test/CodeGen/BPF/CORE/offset-reloc-cast-array-1.ll
+new file mode 100644
+index 0000000..9e291cd
+--- /dev/null
++++ b/llvm/test/CodeGen/BPF/CORE/offset-reloc-cast-array-1.ll
+@@ -0,0 +1,124 @@
++; RUN: llc -march=bpfel -filetype=asm -o - %s | FileCheck -check-prefixes=CHECK %s
++; RUN: llc -march=bpfeb -filetype=asm -o - %s | FileCheck -check-prefixes=CHECK %s
++; Source code:
++; struct v1 {int a; int b;};
++; typedef struct v1 __v1;
++; typedef __v1 arr[4];
++; struct v3 { char c; int d[100]; };
++; #define _(x) (__builtin_preserve_access_index(x))
++; #define cast_to_arr(x) ((arr *)(x))
++; int get_value(const int *arg);
++; int test(struct v3 *arg) {
++; return get_value(_(&cast_to_arr(&arg->d[0])[0][2].b));
++; }
++; Compilation flag:
++; clang -target bpf -O2 -g -S -emit-llvm test.c
++
++%struct.v3 = type { i8, [100 x i32] }
++%struct.v1 = type { i32, i32 }
++
++; Function Attrs: nounwind
++define dso_local i32 @test(%struct.v3* %arg) local_unnamed_addr #0 !dbg !22 {
++entry:
++ call void @llvm.dbg.value(metadata %struct.v3* %arg, metadata !32, metadata !DIExpression()), !dbg !33
++ %0 = tail call [100 x i32]* @llvm.preserve.struct.access.index.p0a100i32.p0s_struct.v3s(%struct.v3* %arg, i32 1, i32 1), !dbg !34, !llvm.preserve.access.index !26
++ %1 = tail call i32* @llvm.preserve.array.access.index.p0i32.p0a100i32([100 x i32]* %0, i32 1, i32 0), !dbg !34, !llvm.preserve.access.index !15
++ %2 = bitcast i32* %1 to [4 x %struct.v1]*, !dbg !34
++ %3 = tail call [4 x %struct.v1]* @llvm.preserve.array.access.index.p0a4s_struct.v1s.p0a4s_struct.v1s([4 x %struct.v1]* %2, i32 0, i32 0), !dbg !34, !llvm.preserve.access.index !4
++ %4 = tail call %struct.v1* @llvm.preserve.array.access.index.p0s_struct.v1s.p0a4s_struct.v1s([4 x %struct.v1]* %3, i32 1, i32 2), !dbg !34, !llvm.preserve.access.index !5
++ %5 = tail call i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.v1s(%struct.v1* %4, i32 1, i32 1), !dbg !34, !llvm.preserve.access.index !8
++ %call = tail call i32 @get_value(i32* %5) #4, !dbg !35
++ ret i32 %call, !dbg !36
++}
++
++; CHECK: r2 = 4
++; CHECK: r1 += r2
++; CHECK: r2 = 20
++; CHECK: r1 += r2
++; CHECK: call get_value
++
++; CHECK: .long 1 # BTF_KIND_STRUCT(id = [[TID1:[0-9]+]])
++; CHECK: .long 100 # BTF_KIND_STRUCT(id = [[TID2:[0-9]+]])
++
++; CHECK: .ascii "v3" # string offset=1
++; CHECK: .ascii ".text" # string offset=46
++; CHECK: .ascii "0:1:0" # string offset=52
++; CHECK: .ascii "2:1" # string offset=107
++
++; CHECK: .long 12 # OffsetReloc
++; CHECK-NEXT: .long 46 # Offset reloc section string offset=46
++; CHECK-NEXT: .long 2
++; CHECK-NEXT: .long .Ltmp{{[0-9]+}}
++; CHECK-NEXT: .long [[TID1]]
++; CHECK-NEXT: .long 52
++; CHECK-NEXT: .long .Ltmp{{[0-9]+}}
++; CHECK-NEXT: .long [[TID2]]
++; CHECK-NEXT: .long 107
++
++declare dso_local i32 @get_value(i32*) local_unnamed_addr #1
++
++; Function Attrs: nounwind readnone
++declare [100 x i32]* @llvm.preserve.struct.access.index.p0a100i32.p0s_struct.v3s(%struct.v3*, i32, i32) #2
++
++; Function Attrs: nounwind readnone
++declare i32* @llvm.preserve.array.access.index.p0i32.p0a100i32([100 x i32]*, i32, i32) #2
++
++; Function Attrs: nounwind readnone
++declare [4 x %struct.v1]* @llvm.preserve.array.access.index.p0a4s_struct.v1s.p0a4s_struct.v1s([4 x %struct.v1]*, i32, i32) #2
++
++; Function Attrs: nounwind readnone
++declare %struct.v1* @llvm.preserve.array.access.index.p0s_struct.v1s.p0a4s_struct.v1s([4 x %struct.v1]*, i32, i32) #2
++
++; Function Attrs: nounwind readnone
++declare i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.v1s(%struct.v1*, i32, i32) #2
++
++; Function Attrs: nounwind readnone speculatable willreturn
++declare void @llvm.dbg.value(metadata, metadata, metadata) #3
++
++attributes #0 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
++attributes #1 = { "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
++attributes #2 = { nounwind readnone }
++attributes #3 = { nounwind readnone speculatable willreturn }
++attributes #4 = { nounwind }
++
++!llvm.dbg.cu = !{!0}
++!llvm.module.flags = !{!18, !19, !20}
++!llvm.ident = !{!21}
++
++!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 10.0.0 (trunk 367256) (llvm/trunk 367266)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, retainedTypes: !3, nameTableKind: None)
++!1 = !DIFile(filename: "test.c", directory: "/tmp/home/yhs/work/tests/llvm/cast")
++!2 = !{}
++!3 = !{!4, !15, !5}
++!4 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !5, size: 64)
++!5 = !DIDerivedType(tag: DW_TAG_typedef, name: "arr", file: !1, line: 3, baseType: !6)
++!6 = !DICompositeType(tag: DW_TAG_array_type, baseType: !7, size: 256, elements: !13)
++!7 = !DIDerivedType(tag: DW_TAG_typedef, name: "__v1", file: !1, line: 2, baseType: !8)
++!8 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "v1", file: !1, line: 1, size: 64, elements: !9)
++!9 = !{!10, !12}
++!10 = !DIDerivedType(tag: DW_TAG_member, name: "a", scope: !8, file: !1, line: 1, baseType: !11, size: 32)
++!11 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
++!12 = !DIDerivedType(tag: DW_TAG_member, name: "b", scope: !8, file: !1, line: 1, baseType: !11, size: 32, offset: 32)
++!13 = !{!14}
++!14 = !DISubrange(count: 4)
++!15 = !DICompositeType(tag: DW_TAG_array_type, baseType: !11, size: 3200, elements: !16)
++!16 = !{!17}
++!17 = !DISubrange(count: 100)
++!18 = !{i32 2, !"Dwarf Version", i32 4}
++!19 = !{i32 2, !"Debug Info Version", i32 3}
++!20 = !{i32 1, !"wchar_size", i32 4}
++!21 = !{!"clang version 10.0.0 (trunk 367256) (llvm/trunk 367266)"}
++!22 = distinct !DISubprogram(name: "test", scope: !1, file: !1, line: 8, type: !23, scopeLine: 8, flags: DIFlagPrototyped, isDefinition: true, isOptimized: true, unit: !0, retainedNodes: !31)
++!23 = !DISubroutineType(types: !24)
++!24 = !{!11, !25}
++!25 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !26, size: 64)
++!26 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "v3", file: !1, line: 4, size: 3232, elements: !27)
++!27 = !{!28, !30}
++!28 = !DIDerivedType(tag: DW_TAG_member, name: "c", scope: !26, file: !1, line: 4, baseType: !29, size: 8)
++!29 = !DIBasicType(name: "char", size: 8, encoding: DW_ATE_signed_char)
++!30 = !DIDerivedType(tag: DW_TAG_member, name: "d", scope: !26, file: !1, line: 4, baseType: !15, size: 3200, offset: 32)
++!31 = !{!32}
++!32 = !DILocalVariable(name: "arg", arg: 1, scope: !22, file: !1, line: 8, type: !25)
++!33 = !DILocation(line: 0, scope: !22)
++!34 = !DILocation(line: 9, column: 20, scope: !22)
++!35 = !DILocation(line: 9, column: 10, scope: !22)
++!36 = !DILocation(line: 9, column: 3, scope: !22)
+diff --git a/llvm/test/CodeGen/BPF/CORE/offset-reloc-cast-array-2.ll b/llvm/test/CodeGen/BPF/CORE/offset-reloc-cast-array-2.ll
+new file mode 100644
+index 0000000..7903179
+--- /dev/null
++++ b/llvm/test/CodeGen/BPF/CORE/offset-reloc-cast-array-2.ll
+@@ -0,0 +1,131 @@
++; RUN: llc -march=bpfel -filetype=asm -o - %s | FileCheck -check-prefixes=CHECK %s
++; RUN: llc -march=bpfeb -filetype=asm -o - %s | FileCheck -check-prefixes=CHECK %s
++; Source code:
++; struct v1 {int a; int b;};
++; typedef struct v1 __v1;
++; typedef __v1 arr[4][4];
++; struct v3 { char c; int d[100]; };
++; #define _(x) (__builtin_preserve_access_index(x))
++; #define cast_to_arr(x) ((arr *)(x))
++; int get_value(const int *arg);
++; int test(struct v3 *arg) {
++; return get_value(_(&cast_to_arr(&arg->d[0])[0][2][3].b));
++; }
++; Compilation flag:
++; clang -target bpf -O2 -g -S -emit-llvm test.c
++
++%struct.v3 = type { i8, [100 x i32] }
++%struct.v1 = type { i32, i32 }
++
++; Function Attrs: nounwind
++define dso_local i32 @test(%struct.v3* %arg) local_unnamed_addr #0 !dbg !24 {
++entry:
++ call void @llvm.dbg.value(metadata %struct.v3* %arg, metadata !34, metadata !DIExpression()), !dbg !35
++ %0 = tail call [100 x i32]* @llvm.preserve.struct.access.index.p0a100i32.p0s_struct.v3s(%struct.v3* %arg, i32 1, i32 1), !dbg !36, !llvm.preserve.access.index !28
++ %1 = tail call i32* @llvm.preserve.array.access.index.p0i32.p0a100i32([100 x i32]* %0, i32 1, i32 0), !dbg !36, !llvm.preserve.access.index !15
++ %2 = bitcast i32* %1 to [4 x [4 x %struct.v1]]*, !dbg !36
++ %3 = tail call [4 x [4 x %struct.v1]]* @llvm.preserve.array.access.index.p0a4a4s_struct.v1s.p0a4a4s_struct.v1s([4 x [4 x %struct.v1]]* %2, i32 0, i32 0), !dbg !36, !llvm.preserve.access.index !4
++ %4 = tail call [4 x %struct.v1]* @llvm.preserve.array.access.index.p0a4s_struct.v1s.p0a4a4s_struct.v1s([4 x [4 x %struct.v1]]* %3, i32 1, i32 2), !dbg !36, !llvm.preserve.access.index !5
++ %5 = tail call %struct.v1* @llvm.preserve.array.access.index.p0s_struct.v1s.p0a4s_struct.v1s([4 x %struct.v1]* %4, i32 1, i32 3), !dbg !36, !llvm.preserve.access.index !18
++ %6 = tail call i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.v1s(%struct.v1* %5, i32 1, i32 1), !dbg !36, !llvm.preserve.access.index !8
++ %call = tail call i32 @get_value(i32* %6) #4, !dbg !37
++ ret i32 %call, !dbg !38
++}
++
++; CHECK: r2 = 4
++; CHECK: r1 += r2
++; CHECK: r2 = 92
++; CHECK: r1 += r2
++; CHECK: call get_value
++
++; CHECK: .long 1 # BTF_KIND_STRUCT(id = [[TID1:[0-9]+]])
++; CHECK: .long 100 # BTF_KIND_STRUCT(id = [[TID2:[0-9]+]])
++
++; CHECK: .ascii "v3" # string offset=1
++; CHECK: .ascii ".text" # string offset=46
++; CHECK: .ascii "0:1:0" # string offset=52
++; CHECK: .ascii "v1" # string offset=100
++; CHECK: .ascii "11:1" # string offset=107
++
++; CHECK: .long 12 # OffsetReloc
++; CHECK-NEXT: .long 46 # Offset reloc section string offset=46
++; CHECK-NEXT: .long 2
++; CHECK-NEXT: .long .Ltmp{{[0-9]+}}
++; CHECK-NEXT: .long [[TID1]]
++; CHECK-NEXT: .long 52
++; CHECK-NEXT: .long .Ltmp{{[0-9]+}}
++; CHECK-NEXT: .long [[TID2]]
++; CHECK-NEXT: .long 107
++
++declare dso_local i32 @get_value(i32*) local_unnamed_addr #1
++
++; Function Attrs: nounwind readnone
++declare [100 x i32]* @llvm.preserve.struct.access.index.p0a100i32.p0s_struct.v3s(%struct.v3*, i32, i32) #2
++
++; Function Attrs: nounwind readnone
++declare i32* @llvm.preserve.array.access.index.p0i32.p0a100i32([100 x i32]*, i32, i32) #2
++
++; Function Attrs: nounwind readnone
++declare [4 x [4 x %struct.v1]]* @llvm.preserve.array.access.index.p0a4a4s_struct.v1s.p0a4a4s_struct.v1s([4 x [4 x %struct.v1]]*, i32, i32) #2
++
++; Function Attrs: nounwind readnone
++declare [4 x %struct.v1]* @llvm.preserve.array.access.index.p0a4s_struct.v1s.p0a4a4s_struct.v1s([4 x [4 x %struct.v1]]*, i32, i32) #2
++
++; Function Attrs: nounwind readnone
++declare %struct.v1* @llvm.preserve.array.access.index.p0s_struct.v1s.p0a4s_struct.v1s([4 x %struct.v1]*, i32, i32) #2
++
++; Function Attrs: nounwind readnone
++declare i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.v1s(%struct.v1*, i32, i32) #2
++
++; Function Attrs: nounwind readnone speculatable willreturn
++declare void @llvm.dbg.value(metadata, metadata, metadata) #3
++
++attributes #0 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
++attributes #1 = { "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
++attributes #2 = { nounwind readnone }
++attributes #3 = { nounwind readnone speculatable willreturn }
++attributes #4 = { nounwind }
++
++!llvm.dbg.cu = !{!0}
++!llvm.module.flags = !{!20, !21, !22}
++!llvm.ident = !{!23}
++
++!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 10.0.0 (trunk 367256) (llvm/trunk 367266)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, retainedTypes: !3, nameTableKind: None)
++!1 = !DIFile(filename: "test.c", directory: "/tmp/home/yhs/work/tests/llvm/cast")
++!2 = !{}
++!3 = !{!4, !15, !5, !18}
++!4 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !5, size: 64)
++!5 = !DIDerivedType(tag: DW_TAG_typedef, name: "arr", file: !1, line: 3, baseType: !6)
++!6 = !DICompositeType(tag: DW_TAG_array_type, baseType: !7, size: 1024, elements: !13)
++!7 = !DIDerivedType(tag: DW_TAG_typedef, name: "__v1", file: !1, line: 2, baseType: !8)
++!8 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "v1", file: !1, line: 1, size: 64, elements: !9)
++!9 = !{!10, !12}
++!10 = !DIDerivedType(tag: DW_TAG_member, name: "a", scope: !8, file: !1, line: 1, baseType: !11, size: 32)
++!11 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
++!12 = !DIDerivedType(tag: DW_TAG_member, name: "b", scope: !8, file: !1, line: 1, baseType: !11, size: 32, offset: 32)
++!13 = !{!14, !14}
++!14 = !DISubrange(count: 4)
++!15 = !DICompositeType(tag: DW_TAG_array_type, baseType: !11, size: 3200, elements: !16)
++!16 = !{!17}
++!17 = !DISubrange(count: 100)
++!18 = !DICompositeType(tag: DW_TAG_array_type, baseType: !7, size: 256, elements: !19)
++!19 = !{!14}
++!20 = !{i32 2, !"Dwarf Version", i32 4}
++!21 = !{i32 2, !"Debug Info Version", i32 3}
++!22 = !{i32 1, !"wchar_size", i32 4}
++!23 = !{!"clang version 10.0.0 (trunk 367256) (llvm/trunk 367266)"}
++!24 = distinct !DISubprogram(name: "test", scope: !1, file: !1, line: 8, type: !25, scopeLine: 8, flags: DIFlagPrototyped, isDefinition: true, isOptimized: true, unit: !0, retainedNodes: !33)
++!25 = !DISubroutineType(types: !26)
++!26 = !{!11, !27}
++!27 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !28, size: 64)
++!28 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "v3", file: !1, line: 4, size: 3232, elements: !29)
++!29 = !{!30, !32}
++!30 = !DIDerivedType(tag: DW_TAG_member, name: "c", scope: !28, file: !1, line: 4, baseType: !31, size: 8)
++!31 = !DIBasicType(name: "char", size: 8, encoding: DW_ATE_signed_char)
++!32 = !DIDerivedType(tag: DW_TAG_member, name: "d", scope: !28, file: !1, line: 4, baseType: !15, size: 3200, offset: 32)
++!33 = !{!34}
++!34 = !DILocalVariable(name: "arg", arg: 1, scope: !24, file: !1, line: 8, type: !27)
++!35 = !DILocation(line: 0, scope: !24)
++!36 = !DILocation(line: 9, column: 20, scope: !24)
++!37 = !DILocation(line: 9, column: 10, scope: !24)
++!38 = !DILocation(line: 9, column: 3, scope: !24)
+diff --git a/llvm/test/CodeGen/BPF/CORE/offset-reloc-cast-struct-1.ll b/llvm/test/CodeGen/BPF/CORE/offset-reloc-cast-struct-1.ll
+new file mode 100644
+index 0000000..a97c6a0
+--- /dev/null
++++ b/llvm/test/CodeGen/BPF/CORE/offset-reloc-cast-struct-1.ll
+@@ -0,0 +1,112 @@
++; RUN: llc -march=bpfel -filetype=asm -o - %s | FileCheck -check-prefixes=CHECK %s
++; RUN: llc -march=bpfeb -filetype=asm -o - %s | FileCheck -check-prefixes=CHECK %s
++; Source code:
++; struct v1 { int a; int b; };
++; struct v2 { int c; int d; };
++; struct v3 { char c; struct v2 d; };
++; #define _(x) (__builtin_preserve_access_index(x))
++; #define cast_to_v1(x) ((struct v1 *)(x))
++; int get_value(const int *arg);
++; int test(struct v3 *arg) {
++; return get_value(_(&cast_to_v1(&arg->d)->b));
++; }
++; Compilation flag:
++; clang -target bpf -O2 -g -S -emit-llvm test.c
++
++%struct.v3 = type { i8, %struct.v2 }
++%struct.v2 = type { i32, i32 }
++%struct.v1 = type { i32, i32 }
++
++; Function Attrs: nounwind
++define dso_local i32 @test(%struct.v3* %arg) local_unnamed_addr #0 !dbg !14 {
++entry:
++ call void @llvm.dbg.value(metadata %struct.v3* %arg, metadata !28, metadata !DIExpression()), !dbg !29
++ %0 = tail call %struct.v2* @llvm.preserve.struct.access.index.p0s_struct.v2s.p0s_struct.v3s(%struct.v3* %arg, i32 1, i32 1), !dbg !30, !llvm.preserve.access.index !18
++ %1 = bitcast %struct.v2* %0 to %struct.v1*, !dbg !30
++ %2 = tail call i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.v1s(%struct.v1* %1, i32 1, i32 1), !dbg !30, !llvm.preserve.access.index !5
++ %call = tail call i32 @get_value(i32* %2) #4, !dbg !31
++ ret i32 %call, !dbg !32
++}
++
++; CHECK: r2 = 4
++; CHECK: r1 += r2
++; CHECK: r2 = 4
++; CHECK: r1 += r2
++; CHECK: call get_value
++
++; CHECK: .long 1 # BTF_KIND_STRUCT(id = [[V3_TID:[0-9]+]])
++; CHECK: .long 81 # BTF_KIND_STRUCT(id = [[V1_TID:[0-9]+]])
++
++; CHECK: .ascii "v3" # string offset=1
++; CHECK-NEXT: .byte 0
++; CHECK: .ascii ".text" # string offset=[[SEC_STR:[0-9]+]]
++; CHECK-NEXT: .byte 0
++; CHECK: .ascii "0:1" # string offset=[[ACCESS_STR:[0-9]+]]
++; CHECK-NEXT: .byte 0
++; CHECK: .ascii "v1" # string offset=81
++; CHECK-NEXT: .byte 0
++
++; CHECK: .long 12 # OffsetReloc
++; CHECK-NEXT: .long [[SEC_STR]] # Offset reloc section string offset=[[SEC_STR]]
++; CHECK-NEXT: .long 2
++; CHECK-NEXT: .long .Ltmp{{[0-9]+}}
++; CHECK-NEXT: .long [[V3_TID]]
++; CHECK-NEXT: .long [[ACCESS_STR]]
++; CHECK-NEXT: .long .Ltmp{{[0-9]+}}
++; CHECK-NEXT: .long [[V1_TID]]
++; CHECK-NEXT: .long [[ACCESS_STR]]
++
++declare dso_local i32 @get_value(i32*) local_unnamed_addr #1
++
++; Function Attrs: nounwind readnone
++declare %struct.v2* @llvm.preserve.struct.access.index.p0s_struct.v2s.p0s_struct.v3s(%struct.v3*, i32, i32) #2
++
++; Function Attrs: nounwind readnone
++declare i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.v1s(%struct.v1*, i32, i32) #2
++
++; Function Attrs: nounwind readnone speculatable willreturn
++declare void @llvm.dbg.value(metadata, metadata, metadata) #3
++
++attributes #0 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
++attributes #1 = { "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
++attributes #2 = { nounwind readnone }
++attributes #3 = { nounwind readnone speculatable willreturn }
++attributes #4 = { nounwind }
++
++!llvm.dbg.cu = !{!0}
++!llvm.module.flags = !{!10, !11, !12}
++!llvm.ident = !{!13}
++
++!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 10.0.0 (trunk 367256) (llvm/trunk 367266)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, retainedTypes: !3, nameTableKind: None)
++!1 = !DIFile(filename: "test.c", directory: "/tmp/home/yhs/work/tests/llvm/cast")
++!2 = !{}
++!3 = !{!4}
++!4 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !5, size: 64)
++!5 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "v1", file: !1, line: 1, size: 64, elements: !6)
++!6 = !{!7, !9}
++!7 = !DIDerivedType(tag: DW_TAG_member, name: "a", scope: !5, file: !1, line: 1, baseType: !8, size: 32)
++!8 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
++!9 = !DIDerivedType(tag: DW_TAG_member, name: "b", scope: !5, file: !1, line: 1, baseType: !8, size: 32, offset: 32)
++!10 = !{i32 2, !"Dwarf Version", i32 4}
++!11 = !{i32 2, !"Debug Info Version", i32 3}
++!12 = !{i32 1, !"wchar_size", i32 4}
++!13 = !{!"clang version 10.0.0 (trunk 367256) (llvm/trunk 367266)"}
++!14 = distinct !DISubprogram(name: "test", scope: !1, file: !1, line: 7, type: !15, scopeLine: 7, flags: DIFlagPrototyped, isDefinition: true, isOptimized: true, unit: !0, retainedNodes: !27)
++!15 = !DISubroutineType(types: !16)
++!16 = !{!8, !17}
++!17 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !18, size: 64)
++!18 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "v3", file: !1, line: 3, size: 96, elements: !19)
++!19 = !{!20, !22}
++!20 = !DIDerivedType(tag: DW_TAG_member, name: "c", scope: !18, file: !1, line: 3, baseType: !21, size: 8)
++!21 = !DIBasicType(name: "char", size: 8, encoding: DW_ATE_signed_char)
++!22 = !DIDerivedType(tag: DW_TAG_member, name: "d", scope: !18, file: !1, line: 3, baseType: !23, size: 64, offset: 32)
++!23 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "v2", file: !1, line: 2, size: 64, elements: !24)
++!24 = !{!25, !26}
++!25 = !DIDerivedType(tag: DW_TAG_member, name: "c", scope: !23, file: !1, line: 2, baseType: !8, size: 32)
++!26 = !DIDerivedType(tag: DW_TAG_member, name: "d", scope: !23, file: !1, line: 2, baseType: !8, size: 32, offset: 32)
++!27 = !{!28}
++!28 = !DILocalVariable(name: "arg", arg: 1, scope: !14, file: !1, line: 7, type: !17)
++!29 = !DILocation(line: 0, scope: !14)
++!30 = !DILocation(line: 8, column: 20, scope: !14)
++!31 = !DILocation(line: 8, column: 10, scope: !14)
++!32 = !DILocation(line: 8, column: 3, scope: !14)
+diff --git a/llvm/test/CodeGen/BPF/CORE/offset-reloc-cast-struct-2.ll b/llvm/test/CodeGen/BPF/CORE/offset-reloc-cast-struct-2.ll
+new file mode 100644
+index 0000000..f65b3f3
+--- /dev/null
++++ b/llvm/test/CodeGen/BPF/CORE/offset-reloc-cast-struct-2.ll
+@@ -0,0 +1,117 @@
++; RUN: llc -march=bpfel -filetype=asm -o - %s | FileCheck -check-prefixes=CHECK %s
++; RUN: llc -march=bpfeb -filetype=asm -o - %s | FileCheck -check-prefixes=CHECK %s
++; Source code:
++; struct v1 { int a; int b; };
++; typedef struct v1 __v1;
++; struct v2 { int c; int d; };
++; typedef struct v2 __v2;
++; struct v3 { char c; volatile const __v2 d; };
++; typedef struct v3 __v3;
++; #define _(x) (__builtin_preserve_access_index(x))
++; #define cast_to_v1(x) ((__v1 *)(x))
++; int get_value(const int *arg);
++; int test(__v3 *arg) {
++; return get_value(_(&cast_to_v1(&arg->d)->b));
++; }
++; Compilation flag:
++; clang -target bpf -O2 -g -S -emit-llvm test.c
++
++%struct.v3 = type { i8, %struct.v2 }
++%struct.v2 = type { i32, i32 }
++%struct.v1 = type { i32, i32 }
++
++; Function Attrs: nounwind
++define dso_local i32 @test(%struct.v3* %arg) local_unnamed_addr #0 !dbg !15 {
++entry:
++ call void @llvm.dbg.value(metadata %struct.v3* %arg, metadata !33, metadata !DIExpression()), !dbg !34
++ %0 = tail call %struct.v2* @llvm.preserve.struct.access.index.p0s_struct.v2s.p0s_struct.v3s(%struct.v3* %arg, i32 1, i32 1), !dbg !35, !llvm.preserve.access.index !20
++ %1 = bitcast %struct.v2* %0 to %struct.v1*, !dbg !35
++ %2 = tail call i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.v1s(%struct.v1* %1, i32 1, i32 1), !dbg !35, !llvm.preserve.access.index !6
++ %call = tail call i32 @get_value(i32* %2) #4, !dbg !36
++ ret i32 %call, !dbg !37
++}
++
++; CHECK: r2 = 4
++; CHECK: r1 += r2
++; CHECK: r2 = 4
++; CHECK: r1 += r2
++; CHECK: call get_value
++
++; CHECK: .long 6 # BTF_KIND_STRUCT(id = [[TID1:[0-9]+]])
++; CHECK: .long 91 # BTF_KIND_STRUCT(id = [[TID2:[0-9]+]])
++
++; CHECK: .ascii "v3" # string offset=6
++; CHECK: .ascii ".text" # string offset=39
++; CHECK: .ascii "0:1" # string offset=45
++; CHECK: .ascii "v1" # string offset=91
++
++
++; CHECK: .long 12 # OffsetReloc
++; CHECK-NEXT: .long 39 # Offset reloc section string offset=39
++; CHECK-NEXT: .long 2
++; CHECK-NEXT: .long .Ltmp{{[0-9]+}}
++; CHECK-NEXT: .long [[TID1]]
++; CHECK-NEXT: .long 45
++; CHECK-NEXT: .long .Ltmp{{[0-9]+}}
++; CHECK-NEXT: .long [[TID2]]
++; CHECK-NEXT: .long 45
++
++declare dso_local i32 @get_value(i32*) local_unnamed_addr #1
++
++; Function Attrs: nounwind readnone
++declare %struct.v2* @llvm.preserve.struct.access.index.p0s_struct.v2s.p0s_struct.v3s(%struct.v3*, i32, i32) #2
++
++; Function Attrs: nounwind readnone
++declare i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.v1s(%struct.v1*, i32, i32) #2
++
++; Function Attrs: nounwind readnone speculatable willreturn
++declare void @llvm.dbg.value(metadata, metadata, metadata) #3
++
++attributes #0 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
++attributes #1 = { "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
++attributes #2 = { nounwind readnone }
++attributes #3 = { nounwind readnone speculatable willreturn }
++attributes #4 = { nounwind }
++
++!llvm.dbg.cu = !{!0}
++!llvm.module.flags = !{!11, !12, !13}
++!llvm.ident = !{!14}
++
++!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 10.0.0 (trunk 367256) (llvm/trunk 367266)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, retainedTypes: !3, nameTableKind: None)
++!1 = !DIFile(filename: "test.c", directory: "/tmp/home/yhs/work/tests/llvm/cast")
++!2 = !{}
++!3 = !{!4}
++!4 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !5, size: 64)
++!5 = !DIDerivedType(tag: DW_TAG_typedef, name: "__v1", file: !1, line: 2, baseType: !6)
++!6 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "v1", file: !1, line: 1, size: 64, elements: !7)
++!7 = !{!8, !10}
++!8 = !DIDerivedType(tag: DW_TAG_member, name: "a", scope: !6, file: !1, line: 1, baseType: !9, size: 32)
++!9 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
++!10 = !DIDerivedType(tag: DW_TAG_member, name: "b", scope: !6, file: !1, line: 1, baseType: !9, size: 32, offset: 32)
++!11 = !{i32 2, !"Dwarf Version", i32 4}
++!12 = !{i32 2, !"Debug Info Version", i32 3}
++!13 = !{i32 1, !"wchar_size", i32 4}
++!14 = !{!"clang version 10.0.0 (trunk 367256) (llvm/trunk 367266)"}
++!15 = distinct !DISubprogram(name: "test", scope: !1, file: !1, line: 10, type: !16, scopeLine: 10, flags: DIFlagPrototyped, isDefinition: true, isOptimized: true, unit: !0, retainedNodes: !32)
++!16 = !DISubroutineType(types: !17)
++!17 = !{!9, !18}
++!18 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !19, size: 64)
++!19 = !DIDerivedType(tag: DW_TAG_typedef, name: "__v3", file: !1, line: 6, baseType: !20)
++!20 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "v3", file: !1, line: 5, size: 96, elements: !21)
++!21 = !{!22, !24}
++!22 = !DIDerivedType(tag: DW_TAG_member, name: "c", scope: !20, file: !1, line: 5, baseType: !23, size: 8)
++!23 = !DIBasicType(name: "char", size: 8, encoding: DW_ATE_signed_char)
++!24 = !DIDerivedType(tag: DW_TAG_member, name: "d", scope: !20, file: !1, line: 5, baseType: !25, size: 64, offset: 32)
++!25 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !26)
++!26 = !DIDerivedType(tag: DW_TAG_volatile_type, baseType: !27)
++!27 = !DIDerivedType(tag: DW_TAG_typedef, name: "__v2", file: !1, line: 4, baseType: !28)
++!28 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "v2", file: !1, line: 3, size: 64, elements: !29)
++!29 = !{!30, !31}
++!30 = !DIDerivedType(tag: DW_TAG_member, name: "c", scope: !28, file: !1, line: 3, baseType: !9, size: 32)
++!31 = !DIDerivedType(tag: DW_TAG_member, name: "d", scope: !28, file: !1, line: 3, baseType: !9, size: 32, offset: 32)
++!32 = !{!33}
++!33 = !DILocalVariable(name: "arg", arg: 1, scope: !15, file: !1, line: 10, type: !18)
++!34 = !DILocation(line: 0, scope: !15)
++!35 = !DILocation(line: 11, column: 20, scope: !15)
++!36 = !DILocation(line: 11, column: 10, scope: !15)
++!37 = !DILocation(line: 11, column: 3, scope: !15)
+diff --git a/llvm/test/CodeGen/BPF/CORE/offset-reloc-cast-struct-3.ll b/llvm/test/CodeGen/BPF/CORE/offset-reloc-cast-struct-3.ll
+new file mode 100644
+index 0000000..ed78b84
+--- /dev/null
++++ b/llvm/test/CodeGen/BPF/CORE/offset-reloc-cast-struct-3.ll
+@@ -0,0 +1,116 @@
++; RUN: llc -march=bpfel -filetype=asm -o - %s | FileCheck -check-prefixes=CHECK %s
++; RUN: llc -march=bpfeb -filetype=asm -o - %s | FileCheck -check-prefixes=CHECK %s
++; Source code:
++; struct v1 { int a; int b; };
++; typedef struct v1 __v1;
++; typedef int __int;
++; struct v3 { char c; __int d[40]; };
++; typedef struct v3 __v3;
++; #define _(x) (__builtin_preserve_access_index(x))
++; #define cast_to_v1(x) ((__v1 *)(x))
++; int get_value(const int *arg);
++; int test(__v3 *arg) {
++; return get_value(_(&cast_to_v1(&arg->d[4])->b));
++; }
++; Compilation flag:
++; clang -target bpf -O2 -g -S -emit-llvm test.c
++
++%struct.v3 = type { i8, [40 x i32] }
++%struct.v1 = type { i32, i32 }
++
++; Function Attrs: nounwind
++define dso_local i32 @test(%struct.v3* %arg) local_unnamed_addr #0 !dbg !19 {
++entry:
++ call void @llvm.dbg.value(metadata %struct.v3* %arg, metadata !30, metadata !DIExpression()), !dbg !31
++ %0 = tail call [40 x i32]* @llvm.preserve.struct.access.index.p0a40i32.p0s_struct.v3s(%struct.v3* %arg, i32 1, i32 1), !dbg !32, !llvm.preserve.access.index !24
++ %1 = tail call i32* @llvm.preserve.array.access.index.p0i32.p0a40i32([40 x i32]* %0, i32 1, i32 4), !dbg !32, !llvm.preserve.access.index !11
++ %2 = bitcast i32* %1 to %struct.v1*, !dbg !32
++ %3 = tail call i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.v1s(%struct.v1* %2, i32 1, i32 1), !dbg !32, !llvm.preserve.access.index !6
++ %call = tail call i32 @get_value(i32* %3) #4, !dbg !33
++ ret i32 %call, !dbg !34
++}
++
++; CHECK: r2 = 20
++; CHECK: r1 += r2
++; CHECK: r2 = 4
++; CHECK: r1 += r2
++; CHECK: call get_value
++
++; CHECK: .long 6 # BTF_KIND_STRUCT(id = [[TID1:[0-9]+]])
++; CHECK: .long 111 # BTF_KIND_STRUCT(id = [[TID2:[0-9]+]])
++
++; CHECK: .ascii "v3" # string offset=6
++; CHECK: .ascii ".text" # string offset=57
++; CHECK: .ascii "0:1:4" # string offset=63
++; CHECK: .ascii "v1" # string offset=111
++; CHECK: .ascii "0:1" # string offset=118
++
++; CHECK: .long 12 # OffsetReloc
++; CHECK-NEXT: .long 57 # Offset reloc section string offset=57
++; CHECK-NEXT: .long 2
++; CHECK-NEXT: .long .Ltmp{{[0-9]+}}
++; CHECK-NEXT: .long [[TID1]]
++; CHECK-NEXT: .long 63
++; CHECK-NEXT: .long .Ltmp{{[0-9]+}}
++; CHECK-NEXT: .long [[TID2]]
++; CHECK-NEXT: .long 118
++
++declare dso_local i32 @get_value(i32*) local_unnamed_addr #1
++
++; Function Attrs: nounwind readnone
++declare [40 x i32]* @llvm.preserve.struct.access.index.p0a40i32.p0s_struct.v3s(%struct.v3*, i32, i32) #2
++
++; Function Attrs: nounwind readnone
++declare i32* @llvm.preserve.array.access.index.p0i32.p0a40i32([40 x i32]*, i32, i32) #2
++
++; Function Attrs: nounwind readnone
++declare i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.v1s(%struct.v1*, i32, i32) #2
++
++; Function Attrs: nounwind readnone speculatable willreturn
++declare void @llvm.dbg.value(metadata, metadata, metadata) #3
++
++attributes #0 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
++attributes #1 = { "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
++attributes #2 = { nounwind readnone }
++attributes #3 = { nounwind readnone speculatable willreturn }
++attributes #4 = { nounwind }
++
++!llvm.dbg.cu = !{!0}
++!llvm.module.flags = !{!15, !16, !17}
++!llvm.ident = !{!18}
++
++!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 10.0.0 (trunk 367256) (llvm/trunk 367266)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, retainedTypes: !3, nameTableKind: None)
++!1 = !DIFile(filename: "test.c", directory: "/tmp/home/yhs/work/tests/llvm/cast")
++!2 = !{}
++!3 = !{!4, !11}
++!4 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !5, size: 64)
++!5 = !DIDerivedType(tag: DW_TAG_typedef, name: "__v1", file: !1, line: 2, baseType: !6)
++!6 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "v1", file: !1, line: 1, size: 64, elements: !7)
++!7 = !{!8, !10}
++!8 = !DIDerivedType(tag: DW_TAG_member, name: "a", scope: !6, file: !1, line: 1, baseType: !9, size: 32)
++!9 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
++!10 = !DIDerivedType(tag: DW_TAG_member, name: "b", scope: !6, file: !1, line: 1, baseType: !9, size: 32, offset: 32)
++!11 = !DICompositeType(tag: DW_TAG_array_type, baseType: !12, size: 1280, elements: !13)
++!12 = !DIDerivedType(tag: DW_TAG_typedef, name: "__int", file: !1, line: 3, baseType: !9)
++!13 = !{!14}
++!14 = !DISubrange(count: 40)
++!15 = !{i32 2, !"Dwarf Version", i32 4}
++!16 = !{i32 2, !"Debug Info Version", i32 3}
++!17 = !{i32 1, !"wchar_size", i32 4}
++!18 = !{!"clang version 10.0.0 (trunk 367256) (llvm/trunk 367266)"}
++!19 = distinct !DISubprogram(name: "test", scope: !1, file: !1, line: 9, type: !20, scopeLine: 9, flags: DIFlagPrototyped, isDefinition: true, isOptimized: true, unit: !0, retainedNodes: !29)
++!20 = !DISubroutineType(types: !21)
++!21 = !{!9, !22}
++!22 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !23, size: 64)
++!23 = !DIDerivedType(tag: DW_TAG_typedef, name: "__v3", file: !1, line: 5, baseType: !24)
++!24 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "v3", file: !1, line: 4, size: 1312, elements: !25)
++!25 = !{!26, !28}
++!26 = !DIDerivedType(tag: DW_TAG_member, name: "c", scope: !24, file: !1, line: 4, baseType: !27, size: 8)
++!27 = !DIBasicType(name: "char", size: 8, encoding: DW_ATE_signed_char)
++!28 = !DIDerivedType(tag: DW_TAG_member, name: "d", scope: !24, file: !1, line: 4, baseType: !11, size: 1280, offset: 32)
++!29 = !{!30}
++!30 = !DILocalVariable(name: "arg", arg: 1, scope: !19, file: !1, line: 9, type: !22)
++!31 = !DILocation(line: 0, scope: !19)
++!32 = !DILocation(line: 10, column: 20, scope: !19)
++!33 = !DILocation(line: 10, column: 10, scope: !19)
++!34 = !DILocation(line: 10, column: 3, scope: !19)
+diff --git a/llvm/test/CodeGen/BPF/CORE/offset-reloc-cast-union-1.ll b/llvm/test/CodeGen/BPF/CORE/offset-reloc-cast-union-1.ll
+new file mode 100644
+index 0000000..1e8f99c
+--- /dev/null
++++ b/llvm/test/CodeGen/BPF/CORE/offset-reloc-cast-union-1.ll
+@@ -0,0 +1,117 @@
++; RUN: llc -march=bpfel -filetype=asm -o - %s | FileCheck -check-prefixes=CHECK %s
++; RUN: llc -march=bpfeb -filetype=asm -o - %s | FileCheck -check-prefixes=CHECK %s
++; Source code:
++; union v1 { int a; int b; };
++; typedef union v1 __v1;
++; union v2 { int c; int d; };
++; typedef union v2 __v2;
++; union v3 { char c; volatile const __v2 d; };
++; typedef union v3 __v3;
++; #define _(x) (__builtin_preserve_access_index(x))
++; #define cast_to_v1(x) ((__v1 *)(x))
++; int get_value(const int *arg);
++; int test(__v3 *arg) {
++; return get_value(_(&cast_to_v1(&arg->d)->b));
++; }
++; Compilation flag:
++; clang -target bpf -O2 -g -S -emit-llvm test.c
++
++%union.v3 = type { %union.v2 }
++%union.v2 = type { i32 }
++%union.v1 = type { i32 }
++
++; Function Attrs: nounwind
++define dso_local i32 @test(%union.v3* %arg) local_unnamed_addr #0 !dbg !15 {
++entry:
++ call void @llvm.dbg.value(metadata %union.v3* %arg, metadata !33, metadata !DIExpression()), !dbg !34
++ %0 = tail call %union.v3* @llvm.preserve.union.access.index.p0s_union.v3s.p0s_union.v3s(%union.v3* %arg, i32 1), !dbg !35, !llvm.preserve.access.index !20
++ %1 = bitcast %union.v3* %0 to %union.v1*, !dbg !35
++ %2 = tail call %union.v1* @llvm.preserve.union.access.index.p0s_union.v1s.p0s_union.v1s(%union.v1* %1, i32 1), !dbg !35, !llvm.preserve.access.index !6
++ %b = getelementptr inbounds %union.v1, %union.v1* %2, i64 0, i32 0, !dbg !35
++ %call = tail call i32 @get_value(i32* %b) #4, !dbg !36
++ ret i32 %call, !dbg !37
++}
++
++; CHECK: r2 = 0
++; CHECK: r1 += r2
++; CHECK: r2 = 0
++; CHECK: r1 += r2
++; CHECK: call get_value
++
++; CHECK: .long 6 # BTF_KIND_UNION(id = [[TID1:[0-9]+]])
++; CHECK: .long 91 # BTF_KIND_UNION(id = [[TID2:[0-9]+]])
++
++; CHECK: .ascii "v3" # string offset=6
++; CHECK: .ascii ".text" # string offset=39
++; CHECK: .ascii "0:1" # string offset=45
++; CHECK: .ascii "v1" # string offset=91
++
++; CHECK: .long 12 # OffsetReloc
++; CHECK-NEXT: .long 39 # Offset reloc section string offset=39
++; CHECK-NEXT: .long 2
++; CHECK-NEXT: .long .Ltmp{{[0-9]+}}
++; CHECK-NEXT: .long [[TID1]]
++; CHECK-NEXT: .long 45
++; CHECK-NEXT: .long .Ltmp{{[0-9]+}}
++; CHECK-NEXT: .long [[TID2]]
++; CHECK-NEXT: .long 45
++
++declare dso_local i32 @get_value(i32*) local_unnamed_addr #1
++
++; Function Attrs: nounwind readnone
++declare %union.v3* @llvm.preserve.union.access.index.p0s_union.v3s.p0s_union.v3s(%union.v3*, i32) #2
++
++; Function Attrs: nounwind readnone
++declare %union.v1* @llvm.preserve.union.access.index.p0s_union.v1s.p0s_union.v1s(%union.v1*, i32) #2
++
++; Function Attrs: nounwind readnone speculatable willreturn
++declare void @llvm.dbg.value(metadata, metadata, metadata) #3
++
++attributes #0 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
++attributes #1 = { "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
++attributes #2 = { nounwind readnone }
++attributes #3 = { nounwind readnone speculatable willreturn }
++attributes #4 = { nounwind }
++
++!llvm.dbg.cu = !{!0}
++!llvm.module.flags = !{!11, !12, !13}
++!llvm.ident = !{!14}
++
++!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 10.0.0 (trunk 367256) (llvm/trunk 367266)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, retainedTypes: !3, nameTableKind: None)
++!1 = !DIFile(filename: "test.c", directory: "/tmp/home/yhs/work/tests/llvm/cast")
++!2 = !{}
++!3 = !{!4}
++!4 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !5, size: 64)
++!5 = !DIDerivedType(tag: DW_TAG_typedef, name: "__v1", file: !1, line: 2, baseType: !6)
++!6 = distinct !DICompositeType(tag: DW_TAG_union_type, name: "v1", file: !1, line: 1, size: 32, elements: !7)
++!7 = !{!8, !10}
++!8 = !DIDerivedType(tag: DW_TAG_member, name: "a", scope: !6, file: !1, line: 1, baseType: !9, size: 32)
++!9 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
++!10 = !DIDerivedType(tag: DW_TAG_member, name: "b", scope: !6, file: !1, line: 1, baseType: !9, size: 32)
++!11 = !{i32 2, !"Dwarf Version", i32 4}
++!12 = !{i32 2, !"Debug Info Version", i32 3}
++!13 = !{i32 1, !"wchar_size", i32 4}
++!14 = !{!"clang version 10.0.0 (trunk 367256) (llvm/trunk 367266)"}
++!15 = distinct !DISubprogram(name: "test", scope: !1, file: !1, line: 10, type: !16, scopeLine: 10, flags: DIFlagPrototyped, isDefinition: true, isOptimized: true, unit: !0, retainedNodes: !32)
++!16 = !DISubroutineType(types: !17)
++!17 = !{!9, !18}
++!18 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !19, size: 64)
++!19 = !DIDerivedType(tag: DW_TAG_typedef, name: "__v3", file: !1, line: 6, baseType: !20)
++!20 = distinct !DICompositeType(tag: DW_TAG_union_type, name: "v3", file: !1, line: 5, size: 32, elements: !21)
++!21 = !{!22, !24}
++!22 = !DIDerivedType(tag: DW_TAG_member, name: "c", scope: !20, file: !1, line: 5, baseType: !23, size: 8)
++!23 = !DIBasicType(name: "char", size: 8, encoding: DW_ATE_signed_char)
++!24 = !DIDerivedType(tag: DW_TAG_member, name: "d", scope: !20, file: !1, line: 5, baseType: !25, size: 32)
++!25 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !26)
++!26 = !DIDerivedType(tag: DW_TAG_volatile_type, baseType: !27)
++!27 = !DIDerivedType(tag: DW_TAG_typedef, name: "__v2", file: !1, line: 4, baseType: !28)
++!28 = distinct !DICompositeType(tag: DW_TAG_union_type, name: "v2", file: !1, line: 3, size: 32, elements: !29)
++!29 = !{!30, !31}
++!30 = !DIDerivedType(tag: DW_TAG_member, name: "c", scope: !28, file: !1, line: 3, baseType: !9, size: 32)
++!31 = !DIDerivedType(tag: DW_TAG_member, name: "d", scope: !28, file: !1, line: 3, baseType: !9, size: 32)
++!32 = !{!33}
++!33 = !DILocalVariable(name: "arg", arg: 1, scope: !15, file: !1, line: 10, type: !18)
++!34 = !DILocation(line: 0, scope: !15)
++!35 = !DILocation(line: 11, column: 20, scope: !15)
++!36 = !DILocation(line: 11, column: 10, scope: !15)
++!37 = !DILocation(line: 11, column: 3, scope: !15)
+diff --git a/llvm/test/CodeGen/BPF/CORE/offset-reloc-cast-union-2.ll b/llvm/test/CodeGen/BPF/CORE/offset-reloc-cast-union-2.ll
+new file mode 100644
+index 0000000..320b0a9
+--- /dev/null
++++ b/llvm/test/CodeGen/BPF/CORE/offset-reloc-cast-union-2.ll
+@@ -0,0 +1,118 @@
++; RUN: llc -march=bpfel -filetype=asm -o - %s | FileCheck -check-prefixes=CHECK %s
++; RUN: llc -march=bpfeb -filetype=asm -o - %s | FileCheck -check-prefixes=CHECK %s
++; Source code:
++; union v1 { int a; int b; };
++; typedef union v1 __v1;
++; typedef int __int;
++; union v3 { char c; __int d[40]; };
++; typedef union v3 __v3;
++; #define _(x) (__builtin_preserve_access_index(x))
++; #define cast_to_v1(x) ((__v1 *)(x))
++; int get_value(const int *arg);
++; int test(__v3 *arg) {
++; return get_value(_(&cast_to_v1(&arg->d[4])->b));
++; }
++; Compilation flag:
++; clang -target bpf -O2 -g -S -emit-llvm test.c
++
++%union.v3 = type { [40 x i32] }
++%union.v1 = type { i32 }
++
++; Function Attrs: nounwind
++define dso_local i32 @test(%union.v3* %arg) local_unnamed_addr #0 !dbg !19 {
++entry:
++ call void @llvm.dbg.value(metadata %union.v3* %arg, metadata !30, metadata !DIExpression()), !dbg !31
++ %0 = tail call %union.v3* @llvm.preserve.union.access.index.p0s_union.v3s.p0s_union.v3s(%union.v3* %arg, i32 1), !dbg !32, !llvm.preserve.access.index !24
++ %d = getelementptr inbounds %union.v3, %union.v3* %0, i64 0, i32 0, !dbg !32
++ %1 = tail call i32* @llvm.preserve.array.access.index.p0i32.p0a40i32([40 x i32]* %d, i32 1, i32 4), !dbg !32, !llvm.preserve.access.index !11
++ %2 = bitcast i32* %1 to %union.v1*, !dbg !32
++ %3 = tail call %union.v1* @llvm.preserve.union.access.index.p0s_union.v1s.p0s_union.v1s(%union.v1* %2, i32 1), !dbg !32, !llvm.preserve.access.index !6
++ %b = getelementptr inbounds %union.v1, %union.v1* %3, i64 0, i32 0, !dbg !32
++ %call = tail call i32 @get_value(i32* %b) #4, !dbg !33
++ ret i32 %call, !dbg !34
++}
++
++; CHECK: r2 = 16
++; CHECK: r1 += r2
++; CHECK: r2 = 0
++; CHECK: r1 += r2
++; CHECK: call get_value
++
++; CHECK: .long 6 # BTF_KIND_UNION(id = [[TID1:[0-9]+]])
++; CHECK: .long 111 # BTF_KIND_UNION(id = [[TID2:[0-9]+]])
++
++; CHECK: .ascii "v3" # string offset=6
++; CHECK: .ascii ".text" # string offset=57
++; CHECK: .ascii "0:1:4" # string offset=63
++; CHECK: .ascii "v1" # string offset=111
++; CHECK: .ascii "0:1" # string offset=118
++
++; CHECK: .long 12 # OffsetReloc
++; CHECK-NEXT: .long 57 # Offset reloc section string offset=57
++; CHECK-NEXT: .long 2
++; CHECK-NEXT: .long .Ltmp{{[0-9]+}}
++; CHECK-NEXT: .long [[TID1]]
++; CHECK-NEXT: .long 63
++; CHECK-NEXT: .long .Ltmp{{[0-9]+}}
++; CHECK-NEXT: .long [[TID2]]
++; CHECK-NEXT: .long 118
++
++declare dso_local i32 @get_value(i32*) local_unnamed_addr #1
++
++; Function Attrs: nounwind readnone
++declare %union.v3* @llvm.preserve.union.access.index.p0s_union.v3s.p0s_union.v3s(%union.v3*, i32) #2
++
++; Function Attrs: nounwind readnone
++declare i32* @llvm.preserve.array.access.index.p0i32.p0a40i32([40 x i32]*, i32, i32) #2
++
++; Function Attrs: nounwind readnone
++declare %union.v1* @llvm.preserve.union.access.index.p0s_union.v1s.p0s_union.v1s(%union.v1*, i32) #2
++
++; Function Attrs: nounwind readnone speculatable willreturn
++declare void @llvm.dbg.value(metadata, metadata, metadata) #3
++
++attributes #0 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
++attributes #1 = { "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
++attributes #2 = { nounwind readnone }
++attributes #3 = { nounwind readnone speculatable willreturn }
++attributes #4 = { nounwind }
++
++!llvm.dbg.cu = !{!0}
++!llvm.module.flags = !{!15, !16, !17}
++!llvm.ident = !{!18}
++
++!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 10.0.0 (trunk 367256) (llvm/trunk 367266)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, retainedTypes: !3, nameTableKind: None)
++!1 = !DIFile(filename: "test.c", directory: "/tmp/home/yhs/work/tests/llvm/cast")
++!2 = !{}
++!3 = !{!4, !11}
++!4 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !5, size: 64)
++!5 = !DIDerivedType(tag: DW_TAG_typedef, name: "__v1", file: !1, line: 2, baseType: !6)
++!6 = distinct !DICompositeType(tag: DW_TAG_union_type, name: "v1", file: !1, line: 1, size: 32, elements: !7)
++!7 = !{!8, !10}
++!8 = !DIDerivedType(tag: DW_TAG_member, name: "a", scope: !6, file: !1, line: 1, baseType: !9, size: 32)
++!9 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
++!10 = !DIDerivedType(tag: DW_TAG_member, name: "b", scope: !6, file: !1, line: 1, baseType: !9, size: 32)
++!11 = !DICompositeType(tag: DW_TAG_array_type, baseType: !12, size: 1280, elements: !13)
++!12 = !DIDerivedType(tag: DW_TAG_typedef, name: "__int", file: !1, line: 3, baseType: !9)
++!13 = !{!14}
++!14 = !DISubrange(count: 40)
++!15 = !{i32 2, !"Dwarf Version", i32 4}
++!16 = !{i32 2, !"Debug Info Version", i32 3}
++!17 = !{i32 1, !"wchar_size", i32 4}
++!18 = !{!"clang version 10.0.0 (trunk 367256) (llvm/trunk 367266)"}
++!19 = distinct !DISubprogram(name: "test", scope: !1, file: !1, line: 9, type: !20, scopeLine: 9, flags: DIFlagPrototyped, isDefinition: true, isOptimized: true, unit: !0, retainedNodes: !29)
++!20 = !DISubroutineType(types: !21)
++!21 = !{!9, !22}
++!22 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !23, size: 64)
++!23 = !DIDerivedType(tag: DW_TAG_typedef, name: "__v3", file: !1, line: 5, baseType: !24)
++!24 = distinct !DICompositeType(tag: DW_TAG_union_type, name: "v3", file: !1, line: 4, size: 1280, elements: !25)
++!25 = !{!26, !28}
++!26 = !DIDerivedType(tag: DW_TAG_member, name: "c", scope: !24, file: !1, line: 4, baseType: !27, size: 8)
++!27 = !DIBasicType(name: "char", size: 8, encoding: DW_ATE_signed_char)
++!28 = !DIDerivedType(tag: DW_TAG_member, name: "d", scope: !24, file: !1, line: 4, baseType: !11, size: 1280)
++!29 = !{!30}
++!30 = !DILocalVariable(name: "arg", arg: 1, scope: !19, file: !1, line: 9, type: !22)
++!31 = !DILocation(line: 0, scope: !19)
++!32 = !DILocation(line: 10, column: 20, scope: !19)
++!33 = !DILocation(line: 10, column: 10, scope: !19)
++!34 = !DILocation(line: 10, column: 3, scope: !19)
+diff --git a/llvm/test/CodeGen/BPF/CORE/offset-reloc-global-1.ll b/llvm/test/CodeGen/BPF/CORE/offset-reloc-global-1.ll
+new file mode 100644
+index 0000000..296e2d4
+--- /dev/null
++++ b/llvm/test/CodeGen/BPF/CORE/offset-reloc-global-1.ll
+@@ -0,0 +1,79 @@
++; RUN: llc -march=bpfel -filetype=asm -o - %s | FileCheck -check-prefixes=CHECK %s
++; RUN: llc -march=bpfeb -filetype=asm -o - %s | FileCheck -check-prefixes=CHECK %s
++; Source code:
++; typedef struct v3 { int a; int b; } __v3;
++; #define _(x) (__builtin_preserve_access_index(x))
++; int get_value(const int *arg);
++; __v3 g __attribute__((section("stats")));
++; int test() {
++; return get_value(_(&g.b));
++; }
++; Compilation flag:
++; clang -target bpf -O2 -g -S -emit-llvm test.c
++
++%struct.v3 = type { i32, i32 }
++
++@g = dso_local global %struct.v3 zeroinitializer, section "stats", align 4, !dbg !0
++
++; Function Attrs: nounwind
++define dso_local i32 @test() local_unnamed_addr #0 !dbg !16 {
++entry:
++ %0 = tail call i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.v3s(%struct.v3* nonnull @g, i32 1, i32 1), !dbg !19, !llvm.preserve.access.index !7
++ %call = tail call i32 @get_value(i32* %0) #3, !dbg !20
++ ret i32 %call, !dbg !21
++}
++
++; CHECK: r2 = 4
++; CHECK: r1 = g ll
++; CHECK: r1 += r2
++; CHECK: call get_value
++
++; CHECK: .long 16 # BTF_KIND_STRUCT(id = [[TID1:[0-9]+]])
++
++; CHECK: .ascii ".text" # string offset=10
++; CHECK: .ascii "v3" # string offset=16
++; CHECK: .ascii "0:1" # string offset=23
++
++; CHECK: .long 12 # OffsetReloc
++; CHECK-NEXT: .long 10 # Offset reloc section string offset=10
++; CHECK-NEXT: .long 1
++; CHECK-NEXT: .long .Ltmp{{[0-9]+}}
++; CHECK-NEXT: .long [[TID1]]
++; CHECK-NEXT: .long 23
++
++declare dso_local i32 @get_value(i32*) local_unnamed_addr #1
++
++; Function Attrs: nounwind readnone
++declare i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.v3s(%struct.v3*, i32, i32) #2
++
++attributes #0 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
++attributes #1 = { "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
++attributes #2 = { nounwind readnone }
++attributes #3 = { nounwind }
++
++!llvm.dbg.cu = !{!2}
++!llvm.module.flags = !{!12, !13, !14}
++!llvm.ident = !{!15}
++
++!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression())
++!1 = distinct !DIGlobalVariable(name: "g", scope: !2, file: !3, line: 4, type: !6, isLocal: false, isDefinition: true)
++!2 = distinct !DICompileUnit(language: DW_LANG_C99, file: !3, producer: "clang version 10.0.0 (trunk 367256) (llvm/trunk 367266)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !4, globals: !5, nameTableKind: None)
++!3 = !DIFile(filename: "test.c", directory: "/tmp/home/yhs/work/tests/llvm/cast")
++!4 = !{}
++!5 = !{!0}
++!6 = !DIDerivedType(tag: DW_TAG_typedef, name: "__v3", file: !3, line: 1, baseType: !7)
++!7 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "v3", file: !3, line: 1, size: 64, elements: !8)
++!8 = !{!9, !11}
++!9 = !DIDerivedType(tag: DW_TAG_member, name: "a", scope: !7, file: !3, line: 1, baseType: !10, size: 32)
++!10 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
++!11 = !DIDerivedType(tag: DW_TAG_member, name: "b", scope: !7, file: !3, line: 1, baseType: !10, size: 32, offset: 32)
++!12 = !{i32 2, !"Dwarf Version", i32 4}
++!13 = !{i32 2, !"Debug Info Version", i32 3}
++!14 = !{i32 1, !"wchar_size", i32 4}
++!15 = !{!"clang version 10.0.0 (trunk 367256) (llvm/trunk 367266)"}
++!16 = distinct !DISubprogram(name: "test", scope: !3, file: !3, line: 5, type: !17, scopeLine: 5, isDefinition: true, isOptimized: true, unit: !2, retainedNodes: !4)
++!17 = !DISubroutineType(types: !18)
++!18 = !{!10}
++!19 = !DILocation(line: 6, column: 20, scope: !16)
++!20 = !DILocation(line: 6, column: 10, scope: !16)
++!21 = !DILocation(line: 6, column: 3, scope: !16)
+diff --git a/llvm/test/CodeGen/BPF/CORE/offset-reloc-global-2.ll b/llvm/test/CodeGen/BPF/CORE/offset-reloc-global-2.ll
+new file mode 100644
+index 0000000..721081e
+--- /dev/null
++++ b/llvm/test/CodeGen/BPF/CORE/offset-reloc-global-2.ll
+@@ -0,0 +1,95 @@
++; RUN: llc -march=bpfel -filetype=asm -o - %s | FileCheck -check-prefixes=CHECK %s
++; RUN: llc -march=bpfeb -filetype=asm -o - %s | FileCheck -check-prefixes=CHECK %s
++; Source code:
++; typedef struct v3 { int a; int b; } __v3;
++; #define _(x) (__builtin_preserve_access_index(x))
++; int get_value(const int *arg);
++; __v3 g[4][5] __attribute__((section("stats")));
++; int test() {
++; return get_value(_(&g[1][2].b));
++; }
++; Compilation flag:
++; clang -target bpf -O2 -g -S -emit-llvm test.c
++
++%struct.v3 = type { i32, i32 }
++
++@g = dso_local global [4 x [5 x %struct.v3]] zeroinitializer, section "stats", align 4, !dbg !0
++
++; Function Attrs: nounwind
++define dso_local i32 @test() local_unnamed_addr #0 !dbg !23 {
++entry:
++ %0 = tail call [5 x %struct.v3]* @llvm.preserve.array.access.index.p0a5s_struct.v3s.p0a4a5s_struct.v3s([4 x [5 x %struct.v3]]* nonnull @g, i32 1, i32 1), !dbg !26, !llvm.preserve.access.index !6
++ %1 = tail call %struct.v3* @llvm.preserve.array.access.index.p0s_struct.v3s.p0a5s_struct.v3s([5 x %struct.v3]* %0, i32 1, i32 2), !dbg !26, !llvm.preserve.access.index !16
++ %2 = tail call i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.v3s(%struct.v3* %1, i32 1, i32 1), !dbg !26, !llvm.preserve.access.index !8
++ %call = tail call i32 @get_value(i32* %2) #3, !dbg !27
++ ret i32 %call, !dbg !28
++}
++
++; CHECK: r2 = 60
++; CHECK: r1 = g ll
++; CHECK: r1 += r2
++; CHECK: call get_value
++
++; CHECK: .long 16 # BTF_KIND_STRUCT(id = [[TID1:[0-9]+]])
++
++; CHECK: .ascii ".text" # string offset=10
++; CHECK: .ascii "v3" # string offset=16
++; CHECK: .ascii "7:1" # string offset=23
++
++; CHECK: .long 12 # OffsetReloc
++; CHECK-NEXT: .long 10 # Offset reloc section string offset=10
++; CHECK-NEXT: .long 1
++; CHECK-NEXT: .long .Ltmp{{[0-9]+}}
++; CHECK-NEXT: .long [[TID1]]
++; CHECK-NEXT: .long 23
++
++
++declare dso_local i32 @get_value(i32*) local_unnamed_addr #1
++
++; Function Attrs: nounwind readnone
++declare [5 x %struct.v3]* @llvm.preserve.array.access.index.p0a5s_struct.v3s.p0a4a5s_struct.v3s([4 x [5 x %struct.v3]]*, i32, i32) #2
++
++; Function Attrs: nounwind readnone
++declare %struct.v3* @llvm.preserve.array.access.index.p0s_struct.v3s.p0a5s_struct.v3s([5 x %struct.v3]*, i32, i32) #2
++
++; Function Attrs: nounwind readnone
++declare i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.v3s(%struct.v3*, i32, i32) #2
++
++attributes #0 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
++attributes #1 = { "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
++attributes #2 = { nounwind readnone }
++attributes #3 = { nounwind }
++
++!llvm.dbg.cu = !{!2}
++!llvm.module.flags = !{!19, !20, !21}
++!llvm.ident = !{!22}
++
++!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression())
++!1 = distinct !DIGlobalVariable(name: "g", scope: !2, file: !3, line: 4, type: !6, isLocal: false, isDefinition: true)
++!2 = distinct !DICompileUnit(language: DW_LANG_C99, file: !3, producer: "clang version 10.0.0 (trunk 367256) (llvm/trunk 367266)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !4, retainedTypes: !5, globals: !18, nameTableKind: None)
++!3 = !DIFile(filename: "test.c", directory: "/tmp/home/yhs/work/tests/llvm/cast")
++!4 = !{}
++!5 = !{!6, !16}
++!6 = !DICompositeType(tag: DW_TAG_array_type, baseType: !7, size: 1280, elements: !13)
++!7 = !DIDerivedType(tag: DW_TAG_typedef, name: "__v3", file: !3, line: 1, baseType: !8)
++!8 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "v3", file: !3, line: 1, size: 64, elements: !9)
++!9 = !{!10, !12}
++!10 = !DIDerivedType(tag: DW_TAG_member, name: "a", scope: !8, file: !3, line: 1, baseType: !11, size: 32)
++!11 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
++!12 = !DIDerivedType(tag: DW_TAG_member, name: "b", scope: !8, file: !3, line: 1, baseType: !11, size: 32, offset: 32)
++!13 = !{!14, !15}
++!14 = !DISubrange(count: 4)
++!15 = !DISubrange(count: 5)
++!16 = !DICompositeType(tag: DW_TAG_array_type, baseType: !7, size: 320, elements: !17)
++!17 = !{!15}
++!18 = !{!0}
++!19 = !{i32 2, !"Dwarf Version", i32 4}
++!20 = !{i32 2, !"Debug Info Version", i32 3}
++!21 = !{i32 1, !"wchar_size", i32 4}
++!22 = !{!"clang version 10.0.0 (trunk 367256) (llvm/trunk 367266)"}
++!23 = distinct !DISubprogram(name: "test", scope: !3, file: !3, line: 5, type: !24, scopeLine: 5, isDefinition: true, isOptimized: true, unit: !2, retainedNodes: !4)
++!24 = !DISubroutineType(types: !25)
++!25 = !{!11}
++!26 = !DILocation(line: 6, column: 20, scope: !23)
++!27 = !DILocation(line: 6, column: 10, scope: !23)
++!28 = !DILocation(line: 6, column: 3, scope: !23)
+diff --git a/llvm/test/CodeGen/BPF/CORE/offset-reloc-global-3.ll b/llvm/test/CodeGen/BPF/CORE/offset-reloc-global-3.ll
+new file mode 100644
+index 0000000..394d04f
+--- /dev/null
++++ b/llvm/test/CodeGen/BPF/CORE/offset-reloc-global-3.ll
+@@ -0,0 +1,84 @@
++; RUN: llc -march=bpfel -filetype=asm -o - %s | FileCheck -check-prefixes=CHECK %s
++; RUN: llc -march=bpfeb -filetype=asm -o - %s | FileCheck -check-prefixes=CHECK %s
++; Source code:
++; typedef struct v3 { int a; int b; } __v3;
++; #define _(x) (__builtin_preserve_access_index(x))
++; int get_value(const int *arg);
++; __v3 *g __attribute__((section("stats")));
++; int test() {
++; return get_value(_(&g->b));
++; }
++; Compilation flag:
++; clang -target bpf -O2 -g -S -emit-llvm test.c
++
++%struct.v3 = type { i32, i32 }
++
++@g = dso_local local_unnamed_addr global %struct.v3* null, section "stats", align 8, !dbg !0
++
++; Function Attrs: nounwind
++define dso_local i32 @test() local_unnamed_addr #0 !dbg !17 {
++entry:
++ %0 = load %struct.v3*, %struct.v3** @g, align 8, !dbg !20, !tbaa !21
++ %1 = tail call i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.v3s(%struct.v3* %0, i32 1, i32 1), !dbg !20, !llvm.preserve.access.index !8
++ %call = tail call i32 @get_value(i32* %1) #3, !dbg !25
++ ret i32 %call, !dbg !26
++}
++
++; CHECK: r2 = 4
++; CHECK: r1 += r2
++; CHECK: call get_value
++
++; CHECK: .long 16 # BTF_KIND_STRUCT(id = [[TID1:[0-9]+]])
++
++; CHECK: .ascii ".text" # string offset=10
++; CHECK: .ascii "v3" # string offset=16
++; CHECK: .ascii "0:1" # string offset=23
++
++; CHECK: .long 12 # OffsetReloc
++; CHECK-NEXT: .long 10 # Offset reloc section string offset=10
++; CHECK-NEXT: .long 1
++; CHECK-NEXT: .long .Ltmp{{[0-9]+}}
++; CHECK-NEXT: .long [[TID1]]
++; CHECK-NEXT: .long 23
++
++declare dso_local i32 @get_value(i32*) local_unnamed_addr #1
++
++; Function Attrs: nounwind readnone
++declare i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.v3s(%struct.v3*, i32, i32) #2
++
++attributes #0 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
++attributes #1 = { "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
++attributes #2 = { nounwind readnone }
++attributes #3 = { nounwind }
++
++!llvm.dbg.cu = !{!2}
++!llvm.module.flags = !{!13, !14, !15}
++!llvm.ident = !{!16}
++
++!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression())
++!1 = distinct !DIGlobalVariable(name: "g", scope: !2, file: !3, line: 4, type: !6, isLocal: false, isDefinition: true)
++!2 = distinct !DICompileUnit(language: DW_LANG_C99, file: !3, producer: "clang version 10.0.0 (trunk 367256) (llvm/trunk 367266)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !4, globals: !5, nameTableKind: None)
++!3 = !DIFile(filename: "test.c", directory: "/tmp/home/yhs/work/tests/llvm/cast")
++!4 = !{}
++!5 = !{!0}
++!6 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !7, size: 64)
++!7 = !DIDerivedType(tag: DW_TAG_typedef, name: "__v3", file: !3, line: 1, baseType: !8)
++!8 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "v3", file: !3, line: 1, size: 64, elements: !9)
++!9 = !{!10, !12}
++!10 = !DIDerivedType(tag: DW_TAG_member, name: "a", scope: !8, file: !3, line: 1, baseType: !11, size: 32)
++!11 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
++!12 = !DIDerivedType(tag: DW_TAG_member, name: "b", scope: !8, file: !3, line: 1, baseType: !11, size: 32, offset: 32)
++!13 = !{i32 2, !"Dwarf Version", i32 4}
++!14 = !{i32 2, !"Debug Info Version", i32 3}
++!15 = !{i32 1, !"wchar_size", i32 4}
++!16 = !{!"clang version 10.0.0 (trunk 367256) (llvm/trunk 367266)"}
++!17 = distinct !DISubprogram(name: "test", scope: !3, file: !3, line: 5, type: !18, scopeLine: 5, isDefinition: true, isOptimized: true, unit: !2, retainedNodes: !4)
++!18 = !DISubroutineType(types: !19)
++!19 = !{!11}
++!20 = !DILocation(line: 6, column: 20, scope: !17)
++!21 = !{!22, !22, i64 0}
++!22 = !{!"any pointer", !23, i64 0}
++!23 = !{!"omnipotent char", !24, i64 0}
++!24 = !{!"Simple C/C++ TBAA"}
++!25 = !DILocation(line: 6, column: 10, scope: !17)
++!26 = !DILocation(line: 6, column: 3, scope: !17)
+diff --git a/llvm/test/CodeGen/BPF/CORE/offset-reloc-ignore.ll b/llvm/test/CodeGen/BPF/CORE/offset-reloc-ignore.ll
+new file mode 100644
+index 0000000..2d14e71
+--- /dev/null
++++ b/llvm/test/CodeGen/BPF/CORE/offset-reloc-ignore.ll
+@@ -0,0 +1,62 @@
++; RUN: llc -march=bpfel -filetype=asm -o - %s | FileCheck -check-prefixes=CHECK %s
++; RUN: llc -march=bpfeb -filetype=asm -o - %s | FileCheck -check-prefixes=CHECK %s
++; Source code:
++; #define _(x) (__builtin_preserve_access_index(x))
++; int get_value(const int *arg);
++; int test(int *arg) {
++; return get_value(_(&arg[4]));
++; }
++; Compilation flag:
++; clang -target bpf -O2 -g -S -emit-llvm test.c
++
++; Function Attrs: nounwind
++define dso_local i32 @test(i32* %arg) local_unnamed_addr #0 !dbg !10 {
++entry:
++ call void @llvm.dbg.value(metadata i32* %arg, metadata !14, metadata !DIExpression()), !dbg !15
++ %0 = tail call i32* @llvm.preserve.array.access.index.p0i32.p0i32(i32* %arg, i32 0, i32 4), !dbg !16, !llvm.preserve.access.index !4
++ %call = tail call i32 @get_value(i32* %0) #4, !dbg !17
++ ret i32 %call, !dbg !18
++}
++
++; CHECK: r1 += 16
++; CHECK: call get_value
++; CHECK: .section .BTF.ext,"",@progbits
++; CHECK-NOT: .long 12 # OffsetReloc
++
++declare dso_local i32 @get_value(i32*) local_unnamed_addr #1
++
++; Function Attrs: nounwind readnone
++declare i32* @llvm.preserve.array.access.index.p0i32.p0i32(i32*, i32, i32) #2
++
++; Function Attrs: nounwind readnone speculatable willreturn
++declare void @llvm.dbg.value(metadata, metadata, metadata) #3
++
++attributes #0 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
++attributes #1 = { "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
++attributes #2 = { nounwind readnone }
++attributes #3 = { nounwind readnone speculatable willreturn }
++attributes #4 = { nounwind }
++
++!llvm.dbg.cu = !{!0}
++!llvm.module.flags = !{!6, !7, !8}
++!llvm.ident = !{!9}
++
++!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 10.0.0 (trunk 367256) (llvm/trunk 367266)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, retainedTypes: !3, nameTableKind: None)
++!1 = !DIFile(filename: "test.c", directory: "/tmp/home/yhs/work/tests/llvm/cast")
++!2 = !{}
++!3 = !{!4}
++!4 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !5, size: 64)
++!5 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
++!6 = !{i32 2, !"Dwarf Version", i32 4}
++!7 = !{i32 2, !"Debug Info Version", i32 3}
++!8 = !{i32 1, !"wchar_size", i32 4}
++!9 = !{!"clang version 10.0.0 (trunk 367256) (llvm/trunk 367266)"}
++!10 = distinct !DISubprogram(name: "test", scope: !1, file: !1, line: 3, type: !11, scopeLine: 3, flags: DIFlagPrototyped, isDefinition: true, isOptimized: true, unit: !0, retainedNodes: !13)
++!11 = !DISubroutineType(types: !12)
++!12 = !{!5, !4}
++!13 = !{!14}
++!14 = !DILocalVariable(name: "arg", arg: 1, scope: !10, file: !1, line: 3, type: !4)
++!15 = !DILocation(line: 0, scope: !10)
++!16 = !DILocation(line: 4, column: 20, scope: !10)
++!17 = !DILocation(line: 4, column: 10, scope: !10)
++!18 = !DILocation(line: 4, column: 3, scope: !10)
+diff --git a/llvm/test/CodeGen/BPF/CORE/offset-reloc-multi-array-1.ll b/llvm/test/CodeGen/BPF/CORE/offset-reloc-multi-array-1.ll
+new file mode 100644
+index 0000000..7f79196f
+--- /dev/null
++++ b/llvm/test/CodeGen/BPF/CORE/offset-reloc-multi-array-1.ll
+@@ -0,0 +1,101 @@
++; RUN: llc -march=bpfel -filetype=asm -o - %s | FileCheck -check-prefixes=CHECK %s
++; RUN: llc -march=bpfeb -filetype=asm -o - %s | FileCheck -check-prefixes=CHECK %s
++; Source code:
++; typedef int __int;
++; typedef struct v3 { int a; __int b[4][4]; } __v3;
++; #define _(x) (__builtin_preserve_access_index(x))
++; int get_value(const int *arg);
++; int test(__v3 *arg) {
++; return get_value(_(&arg[1].b[2][3]));
++; }
++; Compilation flag:
++; clang -target bpf -O2 -g -S -emit-llvm test.c
++
++%struct.v3 = type { i32, [4 x [4 x i32]] }
++
++; Function Attrs: nounwind
++define dso_local i32 @test(%struct.v3* %arg) local_unnamed_addr #0 !dbg !21 {
++entry:
++ call void @llvm.dbg.value(metadata %struct.v3* %arg, metadata !25, metadata !DIExpression()), !dbg !26
++ %0 = tail call %struct.v3* @llvm.preserve.array.access.index.p0s_struct.v3s.p0s_struct.v3s(%struct.v3* %arg, i32 0, i32 1), !dbg !27, !llvm.preserve.access.index !4
++ %1 = tail call [4 x [4 x i32]]* @llvm.preserve.struct.access.index.p0a4a4i32.p0s_struct.v3s(%struct.v3* %0, i32 1, i32 1), !dbg !27, !llvm.preserve.access.index !6
++ %2 = tail call [4 x i32]* @llvm.preserve.array.access.index.p0a4i32.p0a4a4i32([4 x [4 x i32]]* %1, i32 1, i32 2), !dbg !27, !llvm.preserve.access.index !11
++ %3 = tail call i32* @llvm.preserve.array.access.index.p0i32.p0a4i32([4 x i32]* %2, i32 1, i32 3), !dbg !27, !llvm.preserve.access.index !15
++ %call = tail call i32 @get_value(i32* %3) #4, !dbg !28
++ ret i32 %call, !dbg !29
++}
++
++; CHECK: r2 = 116
++; CHECK: r1 += r2
++; CHECK: call get_value
++
++; CHECK: .long 6 # BTF_KIND_STRUCT(id = [[TID1:[0-9]+]])
++
++; CHECK: .ascii "v3" # string offset=6
++; CHECK: .ascii ".text" # string offset=52
++; CHECK: .ascii "1:1:2:3" # string offset=58
++
++; CHECK: .long 12 # OffsetReloc
++; CHECK-NEXT: .long 52 # Offset reloc section string offset=52
++; CHECK-NEXT: .long 1
++; CHECK-NEXT: .long .Ltmp{{[0-9]+}}
++; CHECK-NEXT: .long [[TID1]]
++; CHECK-NEXT: .long 58
++
++declare dso_local i32 @get_value(i32*) local_unnamed_addr #1
++
++; Function Attrs: nounwind readnone
++declare %struct.v3* @llvm.preserve.array.access.index.p0s_struct.v3s.p0s_struct.v3s(%struct.v3*, i32, i32) #2
++
++; Function Attrs: nounwind readnone
++declare [4 x [4 x i32]]* @llvm.preserve.struct.access.index.p0a4a4i32.p0s_struct.v3s(%struct.v3*, i32, i32) #2
++
++; Function Attrs: nounwind readnone
++declare [4 x i32]* @llvm.preserve.array.access.index.p0a4i32.p0a4a4i32([4 x [4 x i32]]*, i32, i32) #2
++
++; Function Attrs: nounwind readnone
++declare i32* @llvm.preserve.array.access.index.p0i32.p0a4i32([4 x i32]*, i32, i32) #2
++
++; Function Attrs: nounwind readnone speculatable willreturn
++declare void @llvm.dbg.value(metadata, metadata, metadata) #3
++
++attributes #0 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
++attributes #1 = { "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
++attributes #2 = { nounwind readnone }
++attributes #3 = { nounwind readnone speculatable willreturn }
++attributes #4 = { nounwind }
++
++!llvm.dbg.cu = !{!0}
++!llvm.module.flags = !{!17, !18, !19}
++!llvm.ident = !{!20}
++
++!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 10.0.0 (trunk 367256) (llvm/trunk 367266)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, retainedTypes: !3, nameTableKind: None)
++!1 = !DIFile(filename: "test.c", directory: "/tmp/home/yhs/work/tests/llvm/cast")
++!2 = !{}
++!3 = !{!4, !11, !15}
++!4 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !5, size: 64)
++!5 = !DIDerivedType(tag: DW_TAG_typedef, name: "__v3", file: !1, line: 2, baseType: !6)
++!6 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "v3", file: !1, line: 2, size: 544, elements: !7)
++!7 = !{!8, !10}
++!8 = !DIDerivedType(tag: DW_TAG_member, name: "a", scope: !6, file: !1, line: 2, baseType: !9, size: 32)
++!9 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
++!10 = !DIDerivedType(tag: DW_TAG_member, name: "b", scope: !6, file: !1, line: 2, baseType: !11, size: 512, offset: 32)
++!11 = !DICompositeType(tag: DW_TAG_array_type, baseType: !12, size: 512, elements: !13)
++!12 = !DIDerivedType(tag: DW_TAG_typedef, name: "__int", file: !1, line: 1, baseType: !9)
++!13 = !{!14, !14}
++!14 = !DISubrange(count: 4)
++!15 = !DICompositeType(tag: DW_TAG_array_type, baseType: !12, size: 128, elements: !16)
++!16 = !{!14}
++!17 = !{i32 2, !"Dwarf Version", i32 4}
++!18 = !{i32 2, !"Debug Info Version", i32 3}
++!19 = !{i32 1, !"wchar_size", i32 4}
++!20 = !{!"clang version 10.0.0 (trunk 367256) (llvm/trunk 367266)"}
++!21 = distinct !DISubprogram(name: "test", scope: !1, file: !1, line: 5, type: !22, scopeLine: 5, flags: DIFlagPrototyped, isDefinition: true, isOptimized: true, unit: !0, retainedNodes: !24)
++!22 = !DISubroutineType(types: !23)
++!23 = !{!9, !4}
++!24 = !{!25}
++!25 = !DILocalVariable(name: "arg", arg: 1, scope: !21, file: !1, line: 5, type: !4)
++!26 = !DILocation(line: 0, scope: !21)
++!27 = !DILocation(line: 6, column: 20, scope: !21)
++!28 = !DILocation(line: 6, column: 10, scope: !21)
++!29 = !DILocation(line: 6, column: 3, scope: !21)
+diff --git a/llvm/test/CodeGen/BPF/CORE/offset-reloc-multi-array-2.ll b/llvm/test/CodeGen/BPF/CORE/offset-reloc-multi-array-2.ll
+new file mode 100644
+index 0000000..a9c29aa
+--- /dev/null
++++ b/llvm/test/CodeGen/BPF/CORE/offset-reloc-multi-array-2.ll
+@@ -0,0 +1,107 @@
++; RUN: llc -march=bpfel -filetype=asm -o - %s | FileCheck -check-prefixes=CHECK %s
++; RUN: llc -march=bpfeb -filetype=asm -o - %s | FileCheck -check-prefixes=CHECK %s
++; Source code:
++; typedef int __int;
++; typedef struct v3 { int a; __int b[4][4][4]; } __v3;
++; #define _(x) (__builtin_preserve_access_index(x))
++; int get_value(const int *arg);
++; int test(__v3 *arg) {
++; return get_value(_(&arg[1].b[2][3][2]));
++; }
++; Compilation flag:
++; clang -target bpf -O2 -g -S -emit-llvm test.c
++
++%struct.v3 = type { i32, [4 x [4 x [4 x i32]]] }
++
++; Function Attrs: nounwind
++define dso_local i32 @test(%struct.v3* %arg) local_unnamed_addr #0 !dbg !23 {
++entry:
++ call void @llvm.dbg.value(metadata %struct.v3* %arg, metadata !27, metadata !DIExpression()), !dbg !28
++ %0 = tail call %struct.v3* @llvm.preserve.array.access.index.p0s_struct.v3s.p0s_struct.v3s(%struct.v3* %arg, i32 0, i32 1), !dbg !29, !llvm.preserve.access.index !4
++ %1 = tail call [4 x [4 x [4 x i32]]]* @llvm.preserve.struct.access.index.p0a4a4a4i32.p0s_struct.v3s(%struct.v3* %0, i32 1, i32 1), !dbg !29, !llvm.preserve.access.index !6
++ %2 = tail call [4 x [4 x i32]]* @llvm.preserve.array.access.index.p0a4a4i32.p0a4a4a4i32([4 x [4 x [4 x i32]]]* %1, i32 1, i32 2), !dbg !29, !llvm.preserve.access.index !11
++ %3 = tail call [4 x i32]* @llvm.preserve.array.access.index.p0a4i32.p0a4a4i32([4 x [4 x i32]]* %2, i32 1, i32 3), !dbg !29, !llvm.preserve.access.index !15
++ %4 = tail call i32* @llvm.preserve.array.access.index.p0i32.p0a4i32([4 x i32]* %3, i32 1, i32 2), !dbg !29, !llvm.preserve.access.index !17
++ %call = tail call i32 @get_value(i32* %4) #4, !dbg !30
++ ret i32 %call, !dbg !31
++}
++
++; CHECK: r2 = 448
++; CHECK: r1 += r2
++; CHECK: call get_value
++
++; CHECK: .long 6 # BTF_KIND_STRUCT(id = [[TID1:[0-9]+]])
++
++; CHECK: .ascii "v3" # string offset=6
++; CHECK: .ascii ".text" # string offset=52
++; CHECK: .ascii "1:1:2:3:2" # string offset=58
++
++; CHECK: .long 12 # OffsetReloc
++; CHECK-NEXT: .long 52 # Offset reloc section string offset=52
++; CHECK-NEXT: .long 1
++; CHECK-NEXT: .long .Ltmp{{[0-9]+}}
++; CHECK-NEXT: .long [[TID1]]
++; CHECK-NEXT: .long 58
++
++declare dso_local i32 @get_value(i32*) local_unnamed_addr #1
++
++; Function Attrs: nounwind readnone
++declare %struct.v3* @llvm.preserve.array.access.index.p0s_struct.v3s.p0s_struct.v3s(%struct.v3*, i32, i32) #2
++
++; Function Attrs: nounwind readnone
++declare [4 x [4 x [4 x i32]]]* @llvm.preserve.struct.access.index.p0a4a4a4i32.p0s_struct.v3s(%struct.v3*, i32, i32) #2
++
++; Function Attrs: nounwind readnone
++declare [4 x [4 x i32]]* @llvm.preserve.array.access.index.p0a4a4i32.p0a4a4a4i32([4 x [4 x [4 x i32]]]*, i32, i32) #2
++
++; Function Attrs: nounwind readnone
++declare [4 x i32]* @llvm.preserve.array.access.index.p0a4i32.p0a4a4i32([4 x [4 x i32]]*, i32, i32) #2
++
++; Function Attrs: nounwind readnone
++declare i32* @llvm.preserve.array.access.index.p0i32.p0a4i32([4 x i32]*, i32, i32) #2
++
++; Function Attrs: nounwind readnone speculatable willreturn
++declare void @llvm.dbg.value(metadata, metadata, metadata) #3
++
++attributes #0 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
++attributes #1 = { "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
++attributes #2 = { nounwind readnone }
++attributes #3 = { nounwind readnone speculatable willreturn }
++attributes #4 = { nounwind }
++
++!llvm.dbg.cu = !{!0}
++!llvm.module.flags = !{!19, !20, !21}
++!llvm.ident = !{!22}
++
++!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 10.0.0 (trunk 367256) (llvm/trunk 367266)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, retainedTypes: !3, nameTableKind: None)
++!1 = !DIFile(filename: "test.c", directory: "/tmp/home/yhs/work/tests/llvm/cast")
++!2 = !{}
++!3 = !{!4, !11, !15, !17}
++!4 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !5, size: 64)
++!5 = !DIDerivedType(tag: DW_TAG_typedef, name: "__v3", file: !1, line: 2, baseType: !6)
++!6 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "v3", file: !1, line: 2, size: 2080, elements: !7)
++!7 = !{!8, !10}
++!8 = !DIDerivedType(tag: DW_TAG_member, name: "a", scope: !6, file: !1, line: 2, baseType: !9, size: 32)
++!9 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
++!10 = !DIDerivedType(tag: DW_TAG_member, name: "b", scope: !6, file: !1, line: 2, baseType: !11, size: 2048, offset: 32)
++!11 = !DICompositeType(tag: DW_TAG_array_type, baseType: !12, size: 2048, elements: !13)
++!12 = !DIDerivedType(tag: DW_TAG_typedef, name: "__int", file: !1, line: 1, baseType: !9)
++!13 = !{!14, !14, !14}
++!14 = !DISubrange(count: 4)
++!15 = !DICompositeType(tag: DW_TAG_array_type, baseType: !12, size: 512, elements: !16)
++!16 = !{!14, !14}
++!17 = !DICompositeType(tag: DW_TAG_array_type, baseType: !12, size: 128, elements: !18)
++!18 = !{!14}
++!19 = !{i32 2, !"Dwarf Version", i32 4}
++!20 = !{i32 2, !"Debug Info Version", i32 3}
++!21 = !{i32 1, !"wchar_size", i32 4}
++!22 = !{!"clang version 10.0.0 (trunk 367256) (llvm/trunk 367266)"}
++!23 = distinct !DISubprogram(name: "test", scope: !1, file: !1, line: 5, type: !24, scopeLine: 5, flags: DIFlagPrototyped, isDefinition: true, isOptimized: true, unit: !0, retainedNodes: !26)
++!24 = !DISubroutineType(types: !25)
++!25 = !{!9, !4}
++!26 = !{!27}
++!27 = !DILocalVariable(name: "arg", arg: 1, scope: !23, file: !1, line: 5, type: !4)
++!28 = !DILocation(line: 0, scope: !23)
++!29 = !DILocation(line: 6, column: 20, scope: !23)
++!30 = !DILocation(line: 6, column: 10, scope: !23)
++!31 = !DILocation(line: 6, column: 3, scope: !23)
+diff --git a/llvm/test/CodeGen/BPF/CORE/offset-reloc-pointer-1.ll b/llvm/test/CodeGen/BPF/CORE/offset-reloc-pointer-1.ll
+new file mode 100644
+index 0000000..e85b393
+--- /dev/null
++++ b/llvm/test/CodeGen/BPF/CORE/offset-reloc-pointer-1.ll
+@@ -0,0 +1,83 @@
++; RUN: llc -march=bpfel -filetype=asm -o - %s | FileCheck -check-prefixes=CHECK %s
++; RUN: llc -march=bpfeb -filetype=asm -o - %s | FileCheck -check-prefixes=CHECK %s
++; Source code:
++; typedef struct v3 { int a; int b; } __v3;
++; #define _(x) (__builtin_preserve_access_index(x))
++; int get_value(const int *arg);
++; int test(__v3 *arg) {
++; return get_value(_(&arg[1]));
++; }
++; Compilation flag:
++; clang -target bpf -O2 -g -S -emit-llvm test.c
++
++%struct.v3 = type { i32, i32 }
++
++; Function Attrs: nounwind
++define dso_local i32 @test(%struct.v3* %arg) local_unnamed_addr #0 !dbg !15 {
++entry:
++ call void @llvm.dbg.value(metadata %struct.v3* %arg, metadata !19, metadata !DIExpression()), !dbg !20
++ %0 = tail call %struct.v3* @llvm.preserve.array.access.index.p0s_struct.v3s.p0s_struct.v3s(%struct.v3* %arg, i32 0, i32 1), !dbg !21, !llvm.preserve.access.index !4
++ %1 = getelementptr inbounds %struct.v3, %struct.v3* %0, i64 0, i32 0, !dbg !21
++ %call = tail call i32 @get_value(i32* %1) #4, !dbg !22
++ ret i32 %call, !dbg !23
++}
++
++; CHECK: r2 = 8
++; CHECK: r1 += r2
++; CHECK: call get_value
++
++; CHECK: .long 6 # BTF_KIND_STRUCT(id = [[TID1:[0-9]+]])
++
++; CHECK: .ascii "v3" # string offset=6
++; CHECK: .ascii ".text" # string offset=26
++; CHECK: .byte 49 # string offset=32
++
++; CHECK: .long 12 # OffsetReloc
++; CHECK-NEXT: .long 26 # Offset reloc section string offset=26
++; CHECK-NEXT: .long 1
++; CHECK-NEXT: .long .Ltmp{{[0-9]+}}
++; CHECK-NEXT: .long [[TID1]]
++; CHECK-NEXT: .long 32
++
++declare dso_local i32 @get_value(i32*) local_unnamed_addr #1
++
++; Function Attrs: nounwind readnone
++declare %struct.v3* @llvm.preserve.array.access.index.p0s_struct.v3s.p0s_struct.v3s(%struct.v3*, i32, i32) #2
++
++; Function Attrs: nounwind readnone speculatable willreturn
++declare void @llvm.dbg.value(metadata, metadata, metadata) #3
++
++attributes #0 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
++attributes #1 = { "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
++attributes #2 = { nounwind readnone }
++attributes #3 = { nounwind readnone speculatable willreturn }
++attributes #4 = { nounwind }
++
++!llvm.dbg.cu = !{!0}
++!llvm.module.flags = !{!11, !12, !13}
++!llvm.ident = !{!14}
++
++!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 10.0.0 (trunk 367256) (llvm/trunk 367266)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, retainedTypes: !3, nameTableKind: None)
++!1 = !DIFile(filename: "test.c", directory: "/tmp/home/yhs/work/tests/llvm/cast")
++!2 = !{}
++!3 = !{!4}
++!4 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !5, size: 64)
++!5 = !DIDerivedType(tag: DW_TAG_typedef, name: "__v3", file: !1, line: 1, baseType: !6)
++!6 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "v3", file: !1, line: 1, size: 64, elements: !7)
++!7 = !{!8, !10}
++!8 = !DIDerivedType(tag: DW_TAG_member, name: "a", scope: !6, file: !1, line: 1, baseType: !9, size: 32)
++!9 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
++!10 = !DIDerivedType(tag: DW_TAG_member, name: "b", scope: !6, file: !1, line: 1, baseType: !9, size: 32, offset: 32)
++!11 = !{i32 2, !"Dwarf Version", i32 4}
++!12 = !{i32 2, !"Debug Info Version", i32 3}
++!13 = !{i32 1, !"wchar_size", i32 4}
++!14 = !{!"clang version 10.0.0 (trunk 367256) (llvm/trunk 367266)"}
++!15 = distinct !DISubprogram(name: "test", scope: !1, file: !1, line: 4, type: !16, scopeLine: 4, flags: DIFlagPrototyped, isDefinition: true, isOptimized: true, unit: !0, retainedNodes: !18)
++!16 = !DISubroutineType(types: !17)
++!17 = !{!9, !4}
++!18 = !{!19}
++!19 = !DILocalVariable(name: "arg", arg: 1, scope: !15, file: !1, line: 4, type: !4)
++!20 = !DILocation(line: 0, scope: !15)
++!21 = !DILocation(line: 5, column: 20, scope: !15)
++!22 = !DILocation(line: 5, column: 10, scope: !15)
++!23 = !DILocation(line: 5, column: 3, scope: !15)
+diff --git a/llvm/test/CodeGen/BPF/CORE/offset-reloc-pointer-2.ll b/llvm/test/CodeGen/BPF/CORE/offset-reloc-pointer-2.ll
+new file mode 100644
+index 0000000..1c54935
+--- /dev/null
++++ b/llvm/test/CodeGen/BPF/CORE/offset-reloc-pointer-2.ll
+@@ -0,0 +1,85 @@
++; RUN: llc -march=bpfel -filetype=asm -o - %s | FileCheck -check-prefixes=CHECK %s
++; RUN: llc -march=bpfeb -filetype=asm -o - %s | FileCheck -check-prefixes=CHECK %s
++; Source code:
++; typedef struct v3 { int a; int b; } __v3;
++; #define _(x) (__builtin_preserve_access_index(x))
++; int get_value(const int *arg);
++; int test(__v3 *arg) {
++; return get_value(_(&arg[1].b));
++; }
++; Compilation flag:
++; clang -target bpf -O2 -g -S -emit-llvm test.c
++
++%struct.v3 = type { i32, i32 }
++
++; Function Attrs: nounwind
++define dso_local i32 @test(%struct.v3* %arg) local_unnamed_addr #0 !dbg !15 {
++entry:
++ call void @llvm.dbg.value(metadata %struct.v3* %arg, metadata !19, metadata !DIExpression()), !dbg !20
++ %0 = tail call %struct.v3* @llvm.preserve.array.access.index.p0s_struct.v3s.p0s_struct.v3s(%struct.v3* %arg, i32 0, i32 1), !dbg !21, !llvm.preserve.access.index !4
++ %1 = tail call i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.v3s(%struct.v3* %0, i32 1, i32 1), !dbg !21, !llvm.preserve.access.index !6
++ %call = tail call i32 @get_value(i32* %1) #4, !dbg !22
++ ret i32 %call, !dbg !23
++}
++
++; CHECK: r2 = 12
++; CHECK-NEXT: r1 += r2
++; CHECK: call get_value
++
++; CHECK: .long 6 # BTF_KIND_STRUCT(id = [[TID1:[0-9]+]])
++; CHECK: .ascii "v3" # string offset=6
++; CHECK: .ascii ".text" # string offset=26
++; CHECK: .ascii "1:1" # string offset=32
++
++; CHECK: .long 12 # OffsetReloc
++; CHECK-NEXT: .long 26 # Offset reloc section string offset=26
++; CHECK-NEXT: .long 1
++; CHECK-NEXT: .long .Ltmp{{[0-9]+}}
++; CHECK-NEXT: .long [[TID1]]
++; CHECK-NEXT: .long 32
++
++declare dso_local i32 @get_value(i32*) local_unnamed_addr #1
++
++; Function Attrs: nounwind readnone
++declare %struct.v3* @llvm.preserve.array.access.index.p0s_struct.v3s.p0s_struct.v3s(%struct.v3*, i32, i32) #2
++
++; Function Attrs: nounwind readnone
++declare i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.v3s(%struct.v3*, i32, i32) #2
++
++; Function Attrs: nounwind readnone speculatable willreturn
++declare void @llvm.dbg.value(metadata, metadata, metadata) #3
++
++attributes #0 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
++attributes #1 = { "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
++attributes #2 = { nounwind readnone }
++attributes #3 = { nounwind readnone speculatable willreturn }
++attributes #4 = { nounwind }
++
++!llvm.dbg.cu = !{!0}
++!llvm.module.flags = !{!11, !12, !13}
++!llvm.ident = !{!14}
++
++!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 10.0.0 (trunk 367256) (llvm/trunk 367266)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, retainedTypes: !3, nameTableKind: None)
++!1 = !DIFile(filename: "test.c", directory: "/tmp/home/yhs/work/tests/llvm/cast")
++!2 = !{}
++!3 = !{!4}
++!4 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !5, size: 64)
++!5 = !DIDerivedType(tag: DW_TAG_typedef, name: "__v3", file: !1, line: 1, baseType: !6)
++!6 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "v3", file: !1, line: 1, size: 64, elements: !7)
++!7 = !{!8, !10}
++!8 = !DIDerivedType(tag: DW_TAG_member, name: "a", scope: !6, file: !1, line: 1, baseType: !9, size: 32)
++!9 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
++!10 = !DIDerivedType(tag: DW_TAG_member, name: "b", scope: !6, file: !1, line: 1, baseType: !9, size: 32, offset: 32)
++!11 = !{i32 2, !"Dwarf Version", i32 4}
++!12 = !{i32 2, !"Debug Info Version", i32 3}
++!13 = !{i32 1, !"wchar_size", i32 4}
++!14 = !{!"clang version 10.0.0 (trunk 367256) (llvm/trunk 367266)"}
++!15 = distinct !DISubprogram(name: "test", scope: !1, file: !1, line: 4, type: !16, scopeLine: 4, flags: DIFlagPrototyped, isDefinition: true, isOptimized: true, unit: !0, retainedNodes: !18)
++!16 = !DISubroutineType(types: !17)
++!17 = !{!9, !4}
++!18 = !{!19}
++!19 = !DILocalVariable(name: "arg", arg: 1, scope: !15, file: !1, line: 4, type: !4)
++!20 = !DILocation(line: 0, scope: !15)
++!21 = !DILocation(line: 5, column: 20, scope: !15)
++!22 = !DILocation(line: 5, column: 10, scope: !15)
++!23 = !DILocation(line: 5, column: 3, scope: !15)
+diff --git a/llvm/test/CodeGen/BPF/CORE/offset-reloc-struct-anonymous.ll b/llvm/test/CodeGen/BPF/CORE/offset-reloc-struct-anonymous.ll
+index 732187c..08a204f 100644
+--- a/llvm/test/CodeGen/BPF/CORE/offset-reloc-struct-anonymous.ll
++++ b/llvm/test/CodeGen/BPF/CORE/offset-reloc-struct-anonymous.ll
+@@ -30,7 +30,7 @@ define dso_local i32 @bpf_prog(%struct.sk_buff*) local_unnamed_addr #0 !dbg !15
+ %3 = bitcast i32* %2 to i8*, !dbg !34
+ call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %3) #4, !dbg !34
+ %4 = tail call [10 x %struct.anon]* @llvm.preserve.struct.access.index.p0a10s_struct.anons.p0s_struct.sk_buffs(%struct.sk_buff* %0, i32 1, i32 1), !dbg !35, !llvm.preserve.access.index !19
+- %5 = tail call %struct.anon* @llvm.preserve.array.access.index.p0s_struct.anons.p0a10s_struct.anons([10 x %struct.anon]* %4, i32 1, i32 5), !dbg !35
++ %5 = tail call %struct.anon* @llvm.preserve.array.access.index.p0s_struct.anons.p0a10s_struct.anons([10 x %struct.anon]* %4, i32 1, i32 5), !dbg !35, !llvm.preserve.access.index !23
+ %6 = tail call i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.anons(%struct.anon* %5, i32 0, i32 0), !dbg !35, !llvm.preserve.access.index !24
+ %7 = bitcast i32* %6 to i8*, !dbg !35
+ %8 = call i32 inttoptr (i64 4 to i32 (i8*, i32, i8*)*)(i8* nonnull %3, i32 4, i8* %7) #4, !dbg !36
+diff --git a/llvm/test/CodeGen/BPF/CORE/offset-reloc-struct-array.ll b/llvm/test/CodeGen/BPF/CORE/offset-reloc-struct-array.ll
+index 77d2375..b18a4ab 100644
+--- a/llvm/test/CodeGen/BPF/CORE/offset-reloc-struct-array.ll
++++ b/llvm/test/CodeGen/BPF/CORE/offset-reloc-struct-array.ll
+@@ -31,7 +31,7 @@ define dso_local i32 @bpf_prog(%struct.sk_buff*) local_unnamed_addr #0 !dbg !15
+ %3 = bitcast i32* %2 to i8*, !dbg !34
+ call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %3) #4, !dbg !34
+ %4 = tail call [10 x %struct.net_device]* @llvm.preserve.struct.access.index.p0a10s_struct.net_devices.p0s_struct.sk_buffs(%struct.sk_buff* %0, i32 1, i32 1), !dbg !35, !llvm.preserve.access.index !19
+- %5 = tail call %struct.net_device* @llvm.preserve.array.access.index.p0s_struct.net_devices.p0a10s_struct.net_devices([10 x %struct.net_device]* %4, i32 1, i32 5), !dbg !35
++ %5 = tail call %struct.net_device* @llvm.preserve.array.access.index.p0s_struct.net_devices.p0a10s_struct.net_devices([10 x %struct.net_device]* %4, i32 1, i32 5), !dbg !35, !llvm.preserve.access.index !23
+ %6 = tail call i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.net_devices(%struct.net_device* %5, i32 0, i32 0), !dbg !35, !llvm.preserve.access.index !24
+ %7 = bitcast i32* %6 to i8*, !dbg !35
+ %8 = call i32 inttoptr (i64 4 to i32 (i8*, i32, i8*)*)(i8* nonnull %3, i32 4, i8* %7) #4, !dbg !36
+diff --git a/llvm/test/CodeGen/BPF/CORE/offset-reloc-typedef-array.ll b/llvm/test/CodeGen/BPF/CORE/offset-reloc-typedef-array.ll
+index 7843c52..d63bc07 100644
+--- a/llvm/test/CodeGen/BPF/CORE/offset-reloc-typedef-array.ll
++++ b/llvm/test/CodeGen/BPF/CORE/offset-reloc-typedef-array.ll
+@@ -21,7 +21,7 @@ define dso_local i32 @test(%struct.__s* %arg) local_unnamed_addr #0 !dbg !7 {
+ entry:
+ call void @llvm.dbg.value(metadata %struct.__s* %arg, metadata !24, metadata !DIExpression()), !dbg !25
+ %0 = tail call [7 x i32]* @llvm.preserve.struct.access.index.p0a7i32.p0s_struct.__ss(%struct.__s* %arg, i32 0, i32 0), !dbg !26, !llvm.preserve.access.index !13
+- %1 = tail call i32* @llvm.preserve.array.access.index.p0i32.p0a7i32([7 x i32]* %0, i32 1, i32 1), !dbg !26
++ %1 = tail call i32* @llvm.preserve.array.access.index.p0i32.p0a7i32([7 x i32]* %0, i32 1, i32 1), !dbg !26, !llvm.preserve.access.index !19
+ %2 = bitcast i32* %1 to i8*, !dbg !26
+ %call = tail call i32 @get_value(i8* %2) #4, !dbg !27
+ ret i32 %call, !dbg !28
+diff --git a/llvm/test/CodeGen/BPF/CORE/offset-reloc-typedef.ll b/llvm/test/CodeGen/BPF/CORE/offset-reloc-typedef.ll
+index c09d979..8281694 100644
+--- a/llvm/test/CodeGen/BPF/CORE/offset-reloc-typedef.ll
++++ b/llvm/test/CodeGen/BPF/CORE/offset-reloc-typedef.ll
+@@ -24,7 +24,7 @@
+ define dso_local i32 @test([7 x %union.u]* %arg) local_unnamed_addr #0 !dbg !7 {
+ entry:
+ call void @llvm.dbg.value(metadata [7 x %union.u]* %arg, metadata !28, metadata !DIExpression()), !dbg !29
+- %0 = tail call [7 x %union.u]* @llvm.preserve.array.access.index.p0a7s_union.us.p0a7s_union.us([7 x %union.u]* %arg, i32 0, i32 1), !dbg !30
++ %0 = tail call [7 x %union.u]* @llvm.preserve.array.access.index.p0a7s_union.us.p0a7s_union.us([7 x %union.u]* %arg, i32 0, i32 1), !dbg !30, !llvm.preserve.access.index !14
+ %arraydecay = getelementptr inbounds [7 x %union.u], [7 x %union.u]* %0, i64 0, i64 0, !dbg !30
+ %1 = tail call %union.u* @llvm.preserve.union.access.index.p0s_union.us.p0s_union.us(%union.u* %arraydecay, i32 1), !dbg !30, !llvm.preserve.access.index !16
+ %d = getelementptr inbounds %union.u, %union.u* %1, i64 0, i32 0, !dbg !30
+--
+1.8.3.1
+
diff --git a/0001-BPF-annotate-DIType-metadata-for-builtin-preseve_arr.patch b/0001-BPF-annotate-DIType-metadata-for-builtin-preseve_arr.patch
new file mode 100644
index 0000000..60ba6d9
--- /dev/null
+++ b/0001-BPF-annotate-DIType-metadata-for-builtin-preseve_arr.patch
@@ -0,0 +1,138 @@
+From f2ccdd2700174c717dc55a0f4c3f5a91ae73ff42 Mon Sep 17 00:00:00 2001
+From: Yonghong Song <yhs(a)fb.com>
+Date: Fri, 2 Aug 2019 21:28:28 +0000
+Subject: [PATCH] [BPF] annotate DIType metadata for builtin
+ preseve_array_access_index()
+
+Previously, debuginfo types are annotated to
+IR builtin preserve_struct_access_index() and
+preserve_union_access_index(), but not
+preserve_array_access_index(). The debug info
+is useful to identify the root type name which
+later will be used for type comparison.
+
+For user access without explicit type conversions,
+the previous scheme works as we can ignore intermediate
+compiler generated type conversions (e.g., from union types to
+union members) and still generate correct access index string.
+
+The issue comes with user explicit type conversions, e.g.,
+converting an array to a structure like below:
+ struct t { int a; char b[40]; };
+ struct p { int c; int d; };
+ struct t *var = ...;
+ ... __builtin_preserve_access_index(&(((struct p *)&(var->b[0]))->d)) ...
+Although BPF backend can derive the type of &(var->b[0]),
+explicit type annotation make checking more consistent
+and less error prone.
+
+Another benefit is for multiple dimension array handling.
+For example,
+ struct p { int c; int d; } g[8][9][10];
+ ... __builtin_preserve_access_index(&g[2][3][4].d) ...
+It would be possible to calculate the number of "struct p"'s
+before accessing its member "d" if array debug info is
+available as it contains each dimension range.
+
+This patch enables to annotate IR builtin preserve_array_access_index()
+with proper debuginfo type. The unit test case and language reference
+is updated as well.
+
+Signed-off-by: Yonghong Song <yhs(a)fb.com>
+
+Differential Revision: https://reviews.llvm.org/D65664
+
+llvm-svn: 367724
+(cherry picked from commit d0ea05d5eff475a27a5d3bbe4d9fd389935f9cb2)
+
+Also added back
+Value *CreatePreserveArrayAccessIndex(Value *Base, unsigned Dimension,
+ unsigned LastIndex);
+
+To avoid breaking the ABI.
+---
+ clang/lib/CodeGen/CGExpr.cpp | 12 ++++++++---
+ .../CodeGen/builtin-preserve-access-index-array.c | 18 +++++++++++++++++
+ clang/test/CodeGen/builtin-preserve-access-index.c | 23 +++++++++++-----------
+ llvm/docs/LangRef.rst | 4 ++++
+ llvm/include/llvm/IR/IRBuilder.h | 13 ++++++++++--
+ llvm/test/CodeGen/BPF/CORE/intrinsic-array.ll | 2 +-
+ 6 files changed, 55 insertions(+), 17 deletions(-)
+ create mode 100644 clang/test/CodeGen/builtin-preserve-access-index-array.c
+
+diff --git a/llvm/docs/LangRef.rst b/llvm/docs/LangRef.rst
+index 87e8a55..b63e3af 100644
+--- a/llvm/docs/LangRef.rst
++++ b/llvm/docs/LangRef.rst
+@@ -17349,6 +17349,10 @@ based on array base ``base``, array dimension ``dim`` and the last access index
+ into the array. The return type ``ret_type`` is a pointer type to the array element.
+ The array ``dim`` and ``index`` are preserved which is more robust than
+ getelementptr instruction which may be subject to compiler transformation.
++The ``llvm.preserve.access.index`` type of metadata is attached to this call instruction
++to provide array or pointer debuginfo type.
++The metadata is a ``DICompositeType`` or ``DIDerivedType`` representing the
++debuginfo version of ``type``.
+
+ Arguments:
+ """"""""""
+diff --git a/llvm/include/llvm/IR/IRBuilder.h b/llvm/include/llvm/IR/IRBuilder.h
+index a74364d..c2fa9a3 100644
+--- a/llvm/include/llvm/IR/IRBuilder.h
++++ b/llvm/include/llvm/IR/IRBuilder.h
+@@ -2455,6 +2455,11 @@ public:
+
+ Value *CreatePreserveArrayAccessIndex(Value *Base, unsigned Dimension,
+ unsigned LastIndex) {
++ return CreatePreserveArrayAccessIndex(Base, Dimension, LastIndex, nullptr);
++ }
++
++ Value *CreatePreserveArrayAccessIndex(Value *Base, unsigned Dimension,
++ unsigned LastIndex, MDNode *DbgInfo) {
+ assert(isa<PointerType>(Base->getType()) &&
+ "Invalid Base ptr type for preserve.array.access.index.");
+ auto *BaseType = Base->getType();
+@@ -2476,6 +2481,8 @@ public:
+ Value *DimV = getInt32(Dimension);
+ CallInst *Fn =
+ CreateCall(FnPreserveArrayAccessIndex, {Base, DimV, LastIndexV});
++ if (DbgInfo)
++ Fn->setMetadata(LLVMContext::MD_preserve_access_index, DbgInfo);
+
+ return Fn;
+ }
+@@ -2493,7 +2500,8 @@ public:
+ Value *DIIndex = getInt32(FieldIndex);
+ CallInst *Fn =
+ CreateCall(FnPreserveUnionAccessIndex, {Base, DIIndex});
+- Fn->setMetadata(LLVMContext::MD_preserve_access_index, DbgInfo);
++ if (DbgInfo)
++ Fn->setMetadata(LLVMContext::MD_preserve_access_index, DbgInfo);
+
+ return Fn;
+ }
+@@ -2516,7 +2524,8 @@ public:
+ Value *DIIndex = getInt32(FieldIndex);
+ CallInst *Fn = CreateCall(FnPreserveStructAccessIndex,
+ {Base, GEPIndex, DIIndex});
+- Fn->setMetadata(LLVMContext::MD_preserve_access_index, DbgInfo);
++ if (DbgInfo)
++ Fn->setMetadata(LLVMContext::MD_preserve_access_index, DbgInfo);
+
+ return Fn;
+ }
+diff --git a/llvm/test/CodeGen/BPF/CORE/intrinsic-array.ll b/llvm/test/CodeGen/BPF/CORE/intrinsic-array.ll
+index adbcb9f..fe2c196 100644
+--- a/llvm/test/CodeGen/BPF/CORE/intrinsic-array.ll
++++ b/llvm/test/CodeGen/BPF/CORE/intrinsic-array.ll
+@@ -14,7 +14,7 @@
+ define dso_local i32 @test(%struct.s* %arg) local_unnamed_addr #0 !dbg !7 {
+ entry:
+ call void @llvm.dbg.value(metadata %struct.s* %arg, metadata !17, metadata !DIExpression()), !dbg !18
+- %0 = tail call %struct.s* @llvm.preserve.array.access.index.p0s_struct.ss.p0s_struct.ss(%struct.s* %arg, i32 0, i32 2), !dbg !19
++ %0 = tail call %struct.s* @llvm.preserve.array.access.index.p0s_struct.ss.p0s_struct.ss(%struct.s* %arg, i32 0, i32 2), !dbg !19, !llvm.preserve.access.index !11
+ %1 = tail call i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.ss(%struct.s* %0, i32 1, i32 1), !dbg !19, !llvm.preserve.access.index !12
+ %2 = bitcast i32* %1 to i8*, !dbg !19
+ %call = tail call i32 @get_value(i8* %2) #4, !dbg !20
+--
+1.8.3.1
+
diff --git a/llvm.spec b/llvm.spec
index ef5fc55..79da708 100644
--- a/llvm.spec
+++ b/llvm.spec
@@ -14,7 +14,7 @@
%global min_ver 0
%global patch_ver 1
#%%global rc_ver 3
-%global baserelease 1
+%global baserelease 2
%if %{with compat_build}
@@ -58,6 +58,10 @@ Patch2: 0001-CMake-Split-static-library-exports-into-their-own-ex.patch
Patch3: 0001-CMake-Split-test-binary-exports-into-their-own-expor.patch
Patch4: 0001-AVR-Fix-endianness-handling-in-AVR-MC.patch
+# Fix crash in kernel bpf self-tests
+Patch5: 0001-BPF-Handling-type-conversions-correctly-for-CO-RE.patch
+Patch6: 0001-BPF-annotate-DIType-metadata-for-builtin-preseve_arr.patch
+
BuildRequires: gcc
BuildRequires: gcc-c++
BuildRequires: cmake
@@ -479,6 +483,9 @@ fi
%endif
%changelog
+* Fri Jan 10 2020 Tom Stellard <tstellar(a)redhat.com> - 9.0.1-2
+- Fix crash with kernel bpf self-tests
+
* Thu Dec 19 2019 tstellar(a)redhat.com - 9.0.1-1
- 9.0.1 Release
commit d9ea1b48ed4f665409bb056a63a818c980cbab5e
Author: Tom Stellard <tstellar(a)redhat.com>
Date: Fri Dec 20 02:34:08 2019 +0000
9.0.1 Release
diff --git a/.gitignore b/.gitignore
index 59ee3e1..790740d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -53,3 +53,4 @@
/llvm-9.0.0rc2.src.tar.xz
/llvm-9.0.0rc3.src.tar.xz
/llvm-9.0.0.src.tar.xz
+/llvm-9.0.1.src.tar.xz
diff --git a/llvm.spec b/llvm.spec
index 39c876c..ef5fc55 100644
--- a/llvm.spec
+++ b/llvm.spec
@@ -12,9 +12,9 @@
%global build_llvm_libdir %{buildroot}%{llvm_libdir}
%global maj_ver 9
%global min_ver 0
-%global patch_ver 0
+%global patch_ver 1
#%%global rc_ver 3
-%global baserelease 4
+%global baserelease 1
%if %{with compat_build}
@@ -479,6 +479,9 @@ fi
%endif
%changelog
+* Thu Dec 19 2019 tstellar(a)redhat.com - 9.0.1-1
+- 9.0.1 Release
+
* Mon Nov 25 2019 sguelton(a)redhat.com - 9.0.0-4
- Activate AVR on all architectures
diff --git a/sources b/sources
index 6a0f67b..569b8de 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (llvm-9.0.0.src.tar.xz) = 1bb3341e1d231559b948f1505b33c2e2e03989f9b8bbfef0e0cdaff5ac43f85574c9ec5ac53399b914f497d6899425d861411024e8d7e1d1a338c1c6951ac658
+SHA512 (llvm-9.0.1.src.tar.xz) = bfb6960a4dd1e18f4005f324f478a781c69e8ec7c20569d9b243fcb9372dc7733b254f26c683373537990cc9c109c78eaf0f65449629ee17caca1bce9b9ccccd
commit 8ddd41e8d9076ff1913792b40b5f769c2a208f6a
Author: serge-sans-paille <sguelton(a)redhat.com>
Date: Tue Nov 26 06:02:40 2019 +0000
Activate AVR on all architectures
diff --git a/0001-AVR-Fix-endianness-handling-in-AVR-MC.patch b/0001-AVR-Fix-endianness-handling-in-AVR-MC.patch
new file mode 100644
index 0000000..aba1d2a
--- /dev/null
+++ b/0001-AVR-Fix-endianness-handling-in-AVR-MC.patch
@@ -0,0 +1,42 @@
+From 29b4d8f19e30910c099c5453da258843d6b7869a Mon Sep 17 00:00:00 2001
+From: serge_sans_paille <sguelton(a)redhat.com>
+Date: Tue, 24 Sep 2019 10:20:08 +0200
+Subject: [PATCH] [AVR] Fix endianness handling in AVR MC
+
+Differential Revision: https://reviews.llvm.org/D67926
+---
+ llvm/lib/Target/AVR/MCTargetDesc/AVRMCCodeEmitter.cpp | 8 +++-----
+ 1 file changed, 3 insertions(+), 5 deletions(-)
+
+diff --git a/llvm/lib/Target/AVR/MCTargetDesc/AVRMCCodeEmitter.cpp b/llvm/lib/Target/AVR/MCTargetDesc/AVRMCCodeEmitter.cpp
+index bc048877868..db995e24756 100644
+--- a/llvm/lib/Target/AVR/MCTargetDesc/AVRMCCodeEmitter.cpp
++++ b/llvm/lib/Target/AVR/MCTargetDesc/AVRMCCodeEmitter.cpp
+@@ -25,6 +25,7 @@
+ #include "llvm/MC/MCRegisterInfo.h"
+ #include "llvm/MC/MCSubtargetInfo.h"
+ #include "llvm/Support/Casting.h"
++#include "llvm/Support/EndianStream.h"
+ #include "llvm/Support/raw_ostream.h"
+
+ #define DEBUG_TYPE "mccodeemitter"
+@@ -268,14 +269,11 @@ unsigned AVRMCCodeEmitter::getMachineOpValue(const MCInst &MI,
+ void AVRMCCodeEmitter::emitInstruction(uint64_t Val, unsigned Size,
+ const MCSubtargetInfo &STI,
+ raw_ostream &OS) const {
+- const uint16_t *Words = reinterpret_cast<uint16_t const *>(&Val);
+ size_t WordCount = Size / 2;
+
+ for (int64_t i = WordCount - 1; i >= 0; --i) {
+- uint16_t Word = Words[i];
+-
+- OS << (uint8_t) ((Word & 0x00ff) >> 0);
+- OS << (uint8_t) ((Word & 0xff00) >> 8);
++ uint16_t Word = (Val >> (i * 16)) & 0xFFFF;
++ support::endian::write(OS, Word, support::endianness::little);
+ }
+ }
+
+--
+2.20.1
+
diff --git a/llvm.spec b/llvm.spec
index 1f544f4..39c876c 100644
--- a/llvm.spec
+++ b/llvm.spec
@@ -14,7 +14,7 @@
%global min_ver 0
%global patch_ver 0
#%%global rc_ver 3
-%global baserelease 3
+%global baserelease 4
%if %{with compat_build}
@@ -56,6 +56,7 @@ Patch0: 0001-Filter-out-cxxflags-not-supported-by-clang.patch
Patch1: 0001-Pass-target-to-gold-linker-to-avoid-faliures-on-i686.patch
Patch2: 0001-CMake-Split-static-library-exports-into-their-own-ex.patch
Patch3: 0001-CMake-Split-test-binary-exports-into-their-own-expor.patch
+Patch4: 0001-AVR-Fix-endianness-handling-in-AVR-MC.patch
BuildRequires: gcc
BuildRequires: gcc-c++
@@ -200,9 +201,7 @@ cd _build
%if %{with gold}
-DLLVM_BINUTILS_INCDIR=%{_includedir} \
%endif
-%ifnarch s390 s390x
-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=AVR \
-%endif
\
-DLLVM_BUILD_RUNTIME:BOOL=ON \
\
@@ -480,6 +479,9 @@ fi
%endif
%changelog
+* Mon Nov 25 2019 sguelton(a)redhat.com - 9.0.0-4
+- Activate AVR on all architectures
+
* Mon Sep 30 2019 Tom Stellard <tstellar(a)redhat.com> - 9.0.0-3
- Build libLLVM.so first to avoid OOM errors
commit acf22be74c3755c2148a1a15743b912b16642154
Author: Tom Stellard <tstellar(a)redhat.com>
Date: Mon Sep 30 20:49:55 2019 +0000
Build libLLVM.so first to avoid OOM errors
Linking libLLVM.so takes a lot of memory and often causes OOM errors
on builders with low memory:cpu ratios.. By building libLLVM.so first,
we can ensure that when libLLVM.so is being linked, there are no other
build threads running which reduces the chances of an OOM error.
diff --git a/llvm.spec b/llvm.spec
index 1cee55c..1f544f4 100644
--- a/llvm.spec
+++ b/llvm.spec
@@ -14,7 +14,7 @@
%global min_ver 0
%global patch_ver 0
#%%global rc_ver 3
-%global baserelease 2
+%global baserelease 3
%if %{with compat_build}
@@ -164,7 +164,7 @@ pathfix.py -i %{__python3} -pn \
mkdir -p _build
cd _build
-%ifarch s390 s390x %{arm} %ix86
+%ifarch s390 %{arm} %ix86
# Decrease debuginfo verbosity to reduce memory consumption during final library linking
%global optflags %(echo %{optflags} | sed 's/-g /-g1 /')
%endif
@@ -180,7 +180,7 @@ cd _build
-DLLVM_PARALLEL_LINK_JOBS=1 \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_INSTALL_RPATH=";" \
-%ifarch s390 s390x %{arm} %ix86
+%ifarch s390 %{arm} %ix86
-DCMAKE_C_FLAGS_RELWITHDEBINFO="%{optflags} -DNDEBUG" \
-DCMAKE_CXX_FLAGS_RELWITHDEBINFO="%{optflags} -DNDEBUG" \
%endif
@@ -239,6 +239,10 @@ cd _build
-DLLVM_INSTALL_SPHINX_HTML_DIR=%{_pkgdocdir}/html \
-DSPHINX_EXECUTABLE=%{_bindir}/sphinx-build-3
+# Build libLLVM.so first. This ensures that when libLLVM.so is linking, there
+# are no other compile jobs running. This will help reduce OOM errors on the
+# builders without having to artificially limit the number of concurrent jobs.
+%ninja_build LLVM
%ninja_build
%install
@@ -476,6 +480,9 @@ fi
%endif
%changelog
+* Mon Sep 30 2019 Tom Stellard <tstellar(a)redhat.com> - 9.0.0-3
+- Build libLLVM.so first to avoid OOM errors
+
* Fri Sep 27 2019 Tom Stellard <tstellar(a)redhat.com> - 9.0.0-2
- Remove unneeded BuildRequires: libstdc++-static
commit 9d70f3b6d943c8025ce950f2eb9851cb0e84620d
Author: Tom Stellard <tstellar(a)redhat.com>
Date: Fri Sep 27 03:28:51 2019 +0000
Remove unneeded BuildRequires: libstdc++-static
diff --git a/llvm.spec b/llvm.spec
index 1a0874e..1cee55c 100644
--- a/llvm.spec
+++ b/llvm.spec
@@ -14,7 +14,7 @@
%global min_ver 0
%global patch_ver 0
#%%global rc_ver 3
-%global baserelease 1
+%global baserelease 2
%if %{with compat_build}
@@ -70,7 +70,6 @@ BuildRequires: multilib-rpm-config
%if %{with gold}
BuildRequires: binutils-devel
%endif
-BuildRequires: libstdc++-static
%ifarch %{valgrind_arches}
# Enable extra functionality when run the LLVM JIT under valgrind.
BuildRequires: valgrind-devel
@@ -477,6 +476,9 @@ fi
%endif
%changelog
+* Fri Sep 27 2019 Tom Stellard <tstellar(a)redhat.com> - 9.0.0-2
+- Remove unneeded BuildRequires: libstdc++-static
+
* Thu Sep 19 2019 sguelton(a)redhat.com - 9.0.0-1
- 9.0.0 Release
commit a49a48122948ed0f237d5bd929ac055d23229a9a
Author: Tom Stellard <tstellar(a)redhat.com>
Date: Tue Sep 24 22:50:13 2019 +0000
Pull llvm-devel-cmake tests from tests/llvm
diff --git a/tests/llvm-devel-cmake/CMakeLists.txt b/tests/llvm-devel-cmake/CMakeLists.txt
deleted file mode 100644
index e08cd3a..0000000
--- a/tests/llvm-devel-cmake/CMakeLists.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-cmake_minimum_required(VERSION 3.4.3)
-
-find_package(LLVM)
diff --git a/tests/llvm-devel-cmake/runtest.sh b/tests/llvm-devel-cmake/runtest.sh
deleted file mode 100755
index 42d42d3..0000000
--- a/tests/llvm-devel-cmake/runtest.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-set -ex
-
-# This test is meant to ensure that the cmake files in llvm-devel work
-# when only the packages it depends on are installed.
-
-ARCH=`rpm --eval '%_arch'`
-
-llvm_devel_num_deps=`dnf repoquery --nvr --requires --resolve llvm-devel.$ARCH | grep '^llvm' | wc -l`
-
-llvm_num_sub_packages_installed=`dnf list installed | grep '^llvm' | wc -l`
-
-# Verify that only llvm-devel dependencies are installed.
-test `expr $llvm_devel_num_deps + 1` -eq $llvm_num_sub_packages_installed
-
-# Verify that cmake files can me used without errors.
-cmake -G Ninja .
diff --git a/tests/testsllvm-devel.yml b/tests/testsllvm-devel.yml
index 3109a8e..bb2bd1c 100644
--- a/tests/testsllvm-devel.yml
+++ b/tests/testsllvm-devel.yml
@@ -24,5 +24,8 @@
- ninja-build
- gcc
- gcc-c++
+ repositories:
+ - repo: "https://src.fedoraproject.org/tests/llvm.git"
+ dest: "llvm"
tests:
- - llvm-devel-cmake
+ - llvm/llvm-devel-cmake
4 years, 2 months
Architecture specific change in rpms/opencv.git
by githook-noreply@fedoraproject.org
The package rpms/opencv.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/opencv.git/commit/?id=78aebdcfef7....
Change:
-%ifarch ppc64le
Thanks.
Full change:
============
commit cf9c4d33e87fdbe13eee1079043374d15b723ca5
Author: Nicolas Chauvet <kwizart(a)gmail.com>
Date: Wed Jan 29 08:34:31 2020 +0100
Add changelog
diff --git a/opencv.spec b/opencv.spec
index 0151f31..15caa99 100644
--- a/opencv.spec
+++ b/opencv.spec
@@ -60,7 +60,7 @@
Name: opencv
Version: 4.2.0
-Release: 1%{?dist}
+Release: 2%{?dist}
Summary: Collection of algorithms for computer vision
# This is normal three clause BSD.
License: BSD
@@ -468,6 +468,9 @@ popd
%{_libdir}/libopencv_xphoto.so.%{abiver}*
%changelog
+* Wed Jan 29 2020 Nicolas Chauvet <kwizart(a)gmail.com> - 4.2.0-2
+- Backport patch for ppc64le
+
* Tue Dec 31 2019 Nicolas Chauvet <kwizart(a)gmail.com> - 4.2.0-1
- Update to 4.2.0
commit cbd19933e6622ddda684115c7f4abaac6fd11191
Author: Nicolas Chauvet <kwizart(a)gmail.com>
Date: Wed Jan 29 08:33:29 2020 +0100
Backport patch for ppc64le
diff --git a/bd531bd82852808f7fa403e3ee159bd62b1c08cc.patch b/bd531bd82852808f7fa403e3ee159bd62b1c08cc.patch
new file mode 100644
index 0000000..e83aae3
--- /dev/null
+++ b/bd531bd82852808f7fa403e3ee159bd62b1c08cc.patch
@@ -0,0 +1,128 @@
+From bd531bd82852808f7fa403e3ee159bd62b1c08cc Mon Sep 17 00:00:00 2001
+From: Sayed Adel <seiko(a)imavr.com>
+Date: Tue, 28 Jan 2020 15:16:48 +0200
+Subject: [PATCH] core:vsx fix inline asm constraints
+
+ generalize constraints to 'wa' for VSX registers
+---
+ cmake/checks/cpu_vsx_asm.cpp | 2 +-
+ .../include/opencv2/core/hal/intrin_vsx.hpp | 4 +-
+ .../core/include/opencv2/core/vsx_utils.hpp | 50 ++++++++-----------
+ 3 files changed, 25 insertions(+), 31 deletions(-)
+
+diff --git a/cmake/checks/cpu_vsx_asm.cpp b/cmake/checks/cpu_vsx_asm.cpp
+index bb4c25507e3..9c1bf7a946a 100644
+--- a/cmake/checks/cpu_vsx_asm.cpp
++++ b/cmake/checks/cpu_vsx_asm.cpp
+@@ -16,6 +16,6 @@ int main()
+ {
+ __vector float vf;
+ __vector signed int vi;
+- __asm__ __volatile__ ("xvcvsxwsp %x0,%x1" : "=wf" (vf) : "wa" (vi));
++ __asm__ __volatile__ ("xvcvsxwsp %x0,%x1" : "=wa" (vf) : "wa" (vi));
+ return 0;
+ }
+\ No newline at end of file
+diff --git a/modules/core/include/opencv2/core/hal/intrin_vsx.hpp b/modules/core/include/opencv2/core/hal/intrin_vsx.hpp
+index bda1d8558f8..6e8b439182f 100644
+--- a/modules/core/include/opencv2/core/hal/intrin_vsx.hpp
++++ b/modules/core/include/opencv2/core/hal/intrin_vsx.hpp
+@@ -1338,7 +1338,7 @@ inline v_float32x4 v_load_expand(const float16_t* ptr)
+ return v_float32x4(vec_extract_fp_from_shorth(vf16));
+ #elif CV_VSX3 && !defined(CV_COMPILER_VSX_BROKEN_ASM)
+ vec_float4 vf32;
+- __asm__ __volatile__ ("xvcvhpsp %x0,%x1" : "=wf" (vf32) : "wa" (vec_mergeh(vf16, vf16)));
++ __asm__ __volatile__ ("xvcvhpsp %x0,%x1" : "=wa" (vf32) : "wa" (vec_mergeh(vf16, vf16)));
+ return v_float32x4(vf32);
+ #else
+ const vec_int4 z = vec_int4_z, delta = vec_int4_sp(0x38000000);
+@@ -1363,7 +1363,7 @@ inline void v_pack_store(float16_t* ptr, const v_float32x4& v)
+ // fixme: Is there any builtin op or intrinsic that cover "xvcvsphp"?
+ #if CV_VSX3 && !defined(CV_COMPILER_VSX_BROKEN_ASM)
+ vec_ushort8 vf16;
+- __asm__ __volatile__ ("xvcvsphp %x0,%x1" : "=wa" (vf16) : "wf" (v.val));
++ __asm__ __volatile__ ("xvcvsphp %x0,%x1" : "=wa" (vf16) : "wa" (v.val));
+ vec_st_l8(vec_mergesqe(vf16, vf16), ptr);
+ #else
+ const vec_int4 signmask = vec_int4_sp(0x80000000);
+diff --git a/modules/core/include/opencv2/core/vsx_utils.hpp b/modules/core/include/opencv2/core/vsx_utils.hpp
+index d7c71406072..bcc97fe5297 100644
+--- a/modules/core/include/opencv2/core/vsx_utils.hpp
++++ b/modules/core/include/opencv2/core/vsx_utils.hpp
+@@ -110,9 +110,9 @@ VSX_FINLINE(rt) fnm(const rg& a, const rg& b) { return fn2(a, b); }
+ #if defined(__GNUG__) && !defined(__clang__)
+
+ // inline asm helper
+-#define VSX_IMPL_1RG(rt, rto, rg, rgo, opc, fnm) \
+-VSX_FINLINE(rt) fnm(const rg& a) \
+-{ rt rs; __asm__ __volatile__(#opc" %x0,%x1" : "="#rto (rs) : #rgo (a)); return rs; }
++#define VSX_IMPL_1RG(rt, rg, opc, fnm) \
++VSX_FINLINE(rt) fnm(const rg& a) \
++{ rt rs; __asm__ __volatile__(#opc" %x0,%x1" : "=wa" (rs) : "wa" (a)); return rs; }
+
+ #define VSX_IMPL_1VRG(rt, rg, opc, fnm) \
+ VSX_FINLINE(rt) fnm(const rg& a) \
+@@ -257,44 +257,38 @@ VSX_REDIRECT_1RG(vec_float4, vec_double2, vec_cvfo, __builtin_vsx_xvcvdpsp)
+ VSX_REDIRECT_1RG(vec_double2, vec_float4, vec_cvfo, __builtin_vsx_xvcvspdp)
+
+ // converts word and doubleword to double-precision
+-#ifdef vec_ctd
+-# undef vec_ctd
+-#endif
+-VSX_IMPL_1RG(vec_double2, wd, vec_int4, wa, xvcvsxwdp, vec_ctdo)
+-VSX_IMPL_1RG(vec_double2, wd, vec_uint4, wa, xvcvuxwdp, vec_ctdo)
+-VSX_IMPL_1RG(vec_double2, wd, vec_dword2, wi, xvcvsxddp, vec_ctd)
+-VSX_IMPL_1RG(vec_double2, wd, vec_udword2, wi, xvcvuxddp, vec_ctd)
++#undef vec_ctd
++VSX_IMPL_1RG(vec_double2, vec_int4, xvcvsxwdp, vec_ctdo)
++VSX_IMPL_1RG(vec_double2, vec_uint4, xvcvuxwdp, vec_ctdo)
++VSX_IMPL_1RG(vec_double2, vec_dword2, xvcvsxddp, vec_ctd)
++VSX_IMPL_1RG(vec_double2, vec_udword2, xvcvuxddp, vec_ctd)
+
+ // converts word and doubleword to single-precision
+ #undef vec_ctf
+-VSX_IMPL_1RG(vec_float4, wf, vec_int4, wa, xvcvsxwsp, vec_ctf)
+-VSX_IMPL_1RG(vec_float4, wf, vec_uint4, wa, xvcvuxwsp, vec_ctf)
+-VSX_IMPL_1RG(vec_float4, wf, vec_dword2, wi, xvcvsxdsp, vec_ctfo)
+-VSX_IMPL_1RG(vec_float4, wf, vec_udword2, wi, xvcvuxdsp, vec_ctfo)
++VSX_IMPL_1RG(vec_float4, vec_int4, xvcvsxwsp, vec_ctf)
++VSX_IMPL_1RG(vec_float4, vec_uint4, xvcvuxwsp, vec_ctf)
++VSX_IMPL_1RG(vec_float4, vec_dword2, xvcvsxdsp, vec_ctfo)
++VSX_IMPL_1RG(vec_float4, vec_udword2, xvcvuxdsp, vec_ctfo)
+
+ // converts single and double precision to signed word
+ #undef vec_cts
+-VSX_IMPL_1RG(vec_int4, wa, vec_double2, wd, xvcvdpsxws, vec_ctso)
+-VSX_IMPL_1RG(vec_int4, wa, vec_float4, wf, xvcvspsxws, vec_cts)
++VSX_IMPL_1RG(vec_int4, vec_double2, xvcvdpsxws, vec_ctso)
++VSX_IMPL_1RG(vec_int4, vec_float4, xvcvspsxws, vec_cts)
+
+ // converts single and double precision to unsigned word
+ #undef vec_ctu
+-VSX_IMPL_1RG(vec_uint4, wa, vec_double2, wd, xvcvdpuxws, vec_ctuo)
+-VSX_IMPL_1RG(vec_uint4, wa, vec_float4, wf, xvcvspuxws, vec_ctu)
++VSX_IMPL_1RG(vec_uint4, vec_double2, xvcvdpuxws, vec_ctuo)
++VSX_IMPL_1RG(vec_uint4, vec_float4, xvcvspuxws, vec_ctu)
+
+ // converts single and double precision to signed doubleword
+-#ifdef vec_ctsl
+-# undef vec_ctsl
+-#endif
+-VSX_IMPL_1RG(vec_dword2, wi, vec_double2, wd, xvcvdpsxds, vec_ctsl)
+-VSX_IMPL_1RG(vec_dword2, wi, vec_float4, wf, xvcvspsxds, vec_ctslo)
++#undef vec_ctsl
++VSX_IMPL_1RG(vec_dword2, vec_double2, xvcvdpsxds, vec_ctsl)
++VSX_IMPL_1RG(vec_dword2, vec_float4, xvcvspsxds, vec_ctslo)
+
+ // converts single and double precision to unsigned doubleword
+-#ifdef vec_ctul
+-# undef vec_ctul
+-#endif
+-VSX_IMPL_1RG(vec_udword2, wi, vec_double2, wd, xvcvdpuxds, vec_ctul)
+-VSX_IMPL_1RG(vec_udword2, wi, vec_float4, wf, xvcvspuxds, vec_ctulo)
++#undef vec_ctul
++VSX_IMPL_1RG(vec_udword2, vec_double2, xvcvdpuxds, vec_ctul)
++VSX_IMPL_1RG(vec_udword2, vec_float4, xvcvspuxds, vec_ctulo)
+
+ // just in case if GCC doesn't define it
+ #ifndef vec_xl
diff --git a/opencv.spec b/opencv.spec
index 036ba89..0151f31 100644
--- a/opencv.spec
+++ b/opencv.spec
@@ -77,6 +77,7 @@ Source4: b624b995ec9c439cbc2e9e6ee940d3a2-v0.1.1f.zip
Patch0: opencv-4.1.0-install_3rdparty_licenses.patch
Patch1: https://github.com/opencv/opencv/commit/fb3a334bbee3535d508af6510d9903d26...
+Patch2: https://github.com/opencv/opencv/commit/bd531bd82852808f7fa403e3ee159bd62...
BuildRequires: gcc-c++
BuildRequires: libtool
commit 78aebdcfef7a03a0fea4030b4ecef7d6ede8c1ae
Author: Nicolas Chauvet <kwizart(a)gmail.com>
Date: Wed Jan 29 08:32:36 2020 +0100
Revert "Disable intrinsincs for ppc64le"
This reverts commit dcd968ae9973755bd9d772328cfcffae00d473c9.
diff --git a/opencv.spec b/opencv.spec
index d304a83..036ba89 100644
--- a/opencv.spec
+++ b/opencv.spec
@@ -291,9 +291,6 @@ popd
%ifarch x86_64 %{ix86}
-DCPU_BASELINE=SSE2 \
%endif
-%ifarch ppc64le
- -DCV_ENABLE_INTRINSICS=OFF \
-%endif
-DENABLE_PRECOMPILED_HEADERS=OFF \
-DCMAKE_BUILD_TYPE=ReleaseWithDebInfo \
%{?with_java: -DBUILD_opencv_java=ON \
4 years, 2 months
Architecture specific change in rpms/kexec-tools.git
by githook-noreply@fedoraproject.org
The package rpms/kexec-tools.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/kexec-tools.git/commit/?id=c4a2ec....
Change:
+%ifnarch s390x
Thanks.
Full change:
============
commit 1b89cc245f68fd917024b9cb9bce3cd1704f1402
Author: Kairui Song <kasong(a)redhat.com>
Date: Wed Jan 29 14:42:11 2020 +0800
Release 2.0.20-9
Signed-off-by: Kairui Song <kasong(a)redhat.com>
diff --git a/kexec-tools.spec b/kexec-tools.spec
index 8467854..d7f7dc8 100644
--- a/kexec-tools.spec
+++ b/kexec-tools.spec
@@ -4,7 +4,7 @@
Name: kexec-tools
Version: 2.0.20
-Release: 8%{?dist}
+Release: 9%{?dist}
License: GPLv2
Summary: The kexec/kdump userspace component
@@ -348,6 +348,9 @@ done
%endif
%changelog
+* Wed Jan 29 2020 Kairui Song <kasong(a)redhat.com> - 2.0.20-9
+- Fix building failure
+
* Wed Jan 29 2020 Kairui Song <kasong(a)redhat.com> - 2.0.20-8
- Update makedumpfile to 1.6.7
- Add a hook to wait for kdump target in initqueue
commit 47f2a819d5cd682b52b781dd5ef7ee700b024b1b
Author: Kairui Song <kasong(a)redhat.com>
Date: Wed Jan 29 12:30:24 2020 +0800
Fix builing failure on Fedora 32
Signed-off-by: Kairui Song <kasong(a)redhat.com>
diff --git a/kexec-tools-2.0.20-Remove-duplicated-variable-declarations.patch b/kexec-tools-2.0.20-Remove-duplicated-variable-declarations.patch
new file mode 100644
index 0000000..966f007
--- /dev/null
+++ b/kexec-tools-2.0.20-Remove-duplicated-variable-declarations.patch
@@ -0,0 +1,98 @@
+From 23daba8bb97ff4291447e54859ed759cfe07975e Mon Sep 17 00:00:00 2001
+From: Kairui Song <kasong(a)redhat.com>
+Date: Wed, 29 Jan 2020 10:48:27 +0800
+Subject: [PATCH] kexec-tools: Remove duplicated variable declarations
+
+When building kexec-tools for Fedora 32, following error is observed:
+
+/usr/bin/ld: kexec/arch/x86_64/kexec-bzImage64.o:(.bss+0x0): multiple definition of `bzImage_support_efi_boot';
+kexec/arch/i386/kexec-bzImage.o:(.bss+0x0): first defined here
+
+/builddir/build/BUILD/kexec-tools-2.0.20/kexec/arch/arm/../../fs2dt.h:33: multiple definition of `my_debug';
+kexec/fs2dt.o:/builddir/build/BUILD/kexec-tools-2.0.20/kexec/fs2dt.h:33: first defined here
+
+/builddir/build/BUILD/kexec-tools-2.0.20/kexec/arch/arm64/kexec-arm64.h:68: multiple definition of `arm64_mem';
+kexec/fs2dt.o:/builddir/build/BUILD/kexec-tools-2.0.20/././kexec/arch/arm64/kexec-arm64.h:68: first defined here
+
+/builddir/build/BUILD/kexec-tools-2.0.20/kexec/arch/arm64/kexec-arm64.h:54: multiple definition of `initrd_size';
+kexec/fs2dt.o:/builddir/build/BUILD/kexec-tools-2.0.20/././kexec/arch/arm64/kexec-arm64.h:54: first defined here
+
+/builddir/build/BUILD/kexec-tools-2.0.20/kexec/arch/arm64/kexec-arm64.h:53: multiple definition of `initrd_base';
+kexec/fs2dt.o:/builddir/build/BUILD/kexec-tools-2.0.20/././kexec/arch/arm64/kexec-arm64.h:53: first defined here
+
+And apparently, these variables are wrongly declared multiple times. So
+remove duplicated declaration.
+
+Signed-off-by: Kairui Song <kasong(a)redhat.com>
+---
+ kexec/arch/arm64/kexec-arm64.h | 6 +++---
+ kexec/arch/ppc64/kexec-elf-ppc64.c | 2 --
+ kexec/arch/x86_64/kexec-bzImage64.c | 1 -
+ kexec/fs2dt.h | 2 +-
+ 4 files changed, 4 insertions(+), 7 deletions(-)
+
+diff --git a/kexec/arch/arm64/kexec-arm64.h b/kexec/arch/arm64/kexec-arm64.h
+index 628de79..ed447ac 100644
+--- a/kexec/arch/arm64/kexec-arm64.h
++++ b/kexec/arch/arm64/kexec-arm64.h
+@@ -50,8 +50,8 @@ int zImage_arm64_load(int argc, char **argv, const char *kernel_buf,
+ void zImage_arm64_usage(void);
+
+
+-off_t initrd_base;
+-off_t initrd_size;
++extern off_t initrd_base;
++extern off_t initrd_size;
+
+ /**
+ * struct arm64_mem - Memory layout info.
+@@ -65,7 +65,7 @@ struct arm64_mem {
+ };
+
+ #define arm64_mem_ngv UINT64_MAX
+-struct arm64_mem arm64_mem;
++extern struct arm64_mem arm64_mem;
+
+ uint64_t get_phys_offset(void);
+ uint64_t get_vp_offset(void);
+diff --git a/kexec/arch/ppc64/kexec-elf-ppc64.c b/kexec/arch/ppc64/kexec-elf-ppc64.c
+index 3510b70..695b8b0 100644
+--- a/kexec/arch/ppc64/kexec-elf-ppc64.c
++++ b/kexec/arch/ppc64/kexec-elf-ppc64.c
+@@ -44,8 +44,6 @@
+ uint64_t initrd_base, initrd_size;
+ unsigned char reuse_initrd = 0;
+ const char *ramdisk;
+-/* Used for enabling printing message from purgatory code */
+-int my_debug = 0;
+
+ int elf_ppc64_probe(const char *buf, off_t len)
+ {
+diff --git a/kexec/arch/x86_64/kexec-bzImage64.c b/kexec/arch/x86_64/kexec-bzImage64.c
+index 8edb3e4..ba8dc48 100644
+--- a/kexec/arch/x86_64/kexec-bzImage64.c
++++ b/kexec/arch/x86_64/kexec-bzImage64.c
+@@ -42,7 +42,6 @@
+ #include <arch/options.h>
+
+ static const int probe_debug = 0;
+-int bzImage_support_efi_boot;
+
+ int bzImage64_probe(const char *buf, off_t len)
+ {
+diff --git a/kexec/fs2dt.h b/kexec/fs2dt.h
+index 7633273..fe24931 100644
+--- a/kexec/fs2dt.h
++++ b/kexec/fs2dt.h
+@@ -30,7 +30,7 @@ extern struct bootblock bb[1];
+
+ /* Used for enabling printing message from purgatory code
+ * Only has implemented for PPC64 */
+-int my_debug;
++extern int my_debug;
+ extern int dt_no_old_root;
+
+ void reserve(unsigned long long where, unsigned long long length);
+--
+2.24.1
+
diff --git a/kexec-tools-2.0.20-eppic-Remove-duplicated-variable-declaration.patch b/kexec-tools-2.0.20-eppic-Remove-duplicated-variable-declaration.patch
new file mode 100644
index 0000000..8d77b9b
--- /dev/null
+++ b/kexec-tools-2.0.20-eppic-Remove-duplicated-variable-declaration.patch
@@ -0,0 +1,36 @@
+From 2837fb1f5f8362976c188b30ebe50dc8b0377f64 Mon Sep 17 00:00:00 2001
+From: Kairui Song <kasong(a)redhat.com>
+Date: Wed, 29 Jan 2020 11:33:18 +0800
+Subject: [PATCH] Remove duplicated variable declaration
+
+When building on Fedora 32, following error is observed:
+
+...
+/usr/bin/ld: ../eppic/libeppic/libeppic.a(eppic_stat.o):/builddir/build/BUILD/kexec-tools-2.0.20/eppic/libeppic/eppic.h:474: multiple definition of `lastv';
+../eppic/libeppic/libeppic.a(eppic_func.o):/builddir/build/BUILD/kexec-tools-2.0.20/eppic/libeppic/eppic.h:474: first defined here
+...
+
+And apparently, the variable is wrongly declared multiple times. So
+remove duplicated declaration.
+
+Signed-off-by: Kairui Song <kasong(a)redhat.com>
+---
+ libeppic/eppic.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/libeppic/eppic.h b/libeppic/eppic.h
+index 5664583..836b475 100644
+--- a/eppic-d84c3541035d95077aa8571f5d5c3e07c6ef510b/libeppic/eppic.h
++++ b/eppic-d84c3541035d95077aa8571f5d5c3e07c6ef510b/libeppic/eppic.h
+@@ -471,7 +471,7 @@ type_t *eppic_addstorage(type_t *t1, type_t *t2);
+ type_t *eppic_getvoidstruct(int ctype);
+
+ extern int lineno, needvar, instruct, nomacs, eppic_legacy;
+-node_t *lastv;
++extern node_t *lastv;
+
+ #define NULLNODE ((node_t*)0)
+
+--
+2.24.1
+
diff --git a/kexec-tools-2.0.20-makedumpfile-Remove-duplicated-variable-declarations.patch b/kexec-tools-2.0.20-makedumpfile-Remove-duplicated-variable-declarations.patch
new file mode 100644
index 0000000..f240e8c
--- /dev/null
+++ b/kexec-tools-2.0.20-makedumpfile-Remove-duplicated-variable-declarations.patch
@@ -0,0 +1,76 @@
+From efa29d476996a20052be80878767cfe09e4b6224 Mon Sep 17 00:00:00 2001
+From: Kairui Song <kasong(a)redhat.com>
+Date: Wed, 29 Jan 2020 10:59:08 +0800
+Subject: [PATCH] makedumpfile: Remove duplicated variable declarations
+
+When building on Fedora 32, following error is observed:
+
+/usr/bin/ld: erase_info.o:/builddir/build/BUILD/kexec-tools-2.0.20/makedumpfile-1.6.7/makedumpfile.h:2010:
+multiple definition of `crash_reserved_mem_nr'; elf_info.o:/builddir/build/BUILD/kexec-tools-2.0.20/makedumpfile-1.6.7/makedumpfile.h:2010: first defined here
+/usr/bin/ld: erase_info.o:/builddir/build/BUILD/kexec-tools-2.0.20/makedumpfile-1.6.7/makedumpfile.h:2009:
+multiple definition of `crash_reserved_mem'; elf_info.o:/builddir/build/BUILD/kexec-tools-2.0.20/makedumpfile-1.6.7/makedumpfile.h:2009: first defined here
+/usr/bin/ld: erase_info.o:/builddir/build/BUILD/kexec-tools-2.0.20/makedumpfile-1.6.7/makedumpfile.h:1278:
+multiple definition of `parallel_info_t'; elf_info.o:/builddir/build/BUILD/kexec-tools-2.0.20/makedumpfile-1.6.7/makedumpfile.h:1278: first defined here
+/usr/bin/ld: erase_info.o:/builddir/build/BUILD/kexec-tools-2.0.20/makedumpfile-1.6.7/makedumpfile.h:1265:
+multiple definition of `splitting_info_t'; elf_info.o:/builddir/build/BUILD/kexec-tools-2.0.20/makedumpfile-1.6.7/makedumpfile.h:1265: first defined here
+
+And apparently, these variables are wrongly declared multiple times. So
+remove duplicated declaration.
+
+Signed-off-by: Kairui Song <kasong(a)redhat.com>
+---
+ makedumpfile.c | 2 ++
+ makedumpfile.h | 10 ++++++----
+ 2 files changed, 8 insertions(+), 4 deletions(-)
+
+diff --git a/makedumpfile.c b/makedumpfile.c
+index e290fbd..9aad77b 100644
+--- a/makedumpfile-1.6.7/makedumpfile.c
++++ b/makedumpfile-1.6.7/makedumpfile.c
+@@ -34,6 +34,8 @@ struct array_table array_table;
+ struct number_table number_table;
+ struct srcfile_table srcfile_table;
+ struct save_control sc;
++struct parallel_info parallel_info_t;
++struct splitting_info splitting_info_t;
+
+ struct vm_table vt = { 0 };
+ struct DumpInfo *info = NULL;
+diff --git a/makedumpfile.h b/makedumpfile.h
+index 68d9691..614764c 100644
+--- a/makedumpfile-1.6.7/makedumpfile.h
++++ b/makedumpfile-1.6.7/makedumpfile.h
+@@ -1262,7 +1262,8 @@ struct splitting_info {
+ mdf_pfn_t end_pfn;
+ off_t offset_eraseinfo;
+ unsigned long size_eraseinfo;
+-} splitting_info_t;
++};
++extern struct splitting_info splitting_info_t;
+
+ struct parallel_info {
+ int fd_memory;
+@@ -1275,7 +1276,8 @@ struct parallel_info {
+ #ifdef USELZO
+ lzo_bytep wrkmem;
+ #endif
+-} parallel_info_t;
++};
++extern struct parallel_info parallel_info_t;
+
+ struct ppc64_vmemmap {
+ unsigned long phys;
+@@ -2006,8 +2008,8 @@ struct memory_range {
+ };
+
+ #define CRASH_RESERVED_MEM_NR 8
+-struct memory_range crash_reserved_mem[CRASH_RESERVED_MEM_NR];
+-int crash_reserved_mem_nr;
++extern struct memory_range crash_reserved_mem[CRASH_RESERVED_MEM_NR];
++extern int crash_reserved_mem_nr;
+
+ unsigned long read_vmcoreinfo_symbol(char *str_symbol);
+ int readmem(int type_addr, unsigned long long addr, void *bufptr, size_t size);
+--
+2.24.1
+
diff --git a/kexec-tools.spec b/kexec-tools.spec
index 91ea245..8467854 100644
--- a/kexec-tools.spec
+++ b/kexec-tools.spec
@@ -97,6 +97,9 @@ Patch0: kexec-tools-2.0.20-fix-broken-multiboot2-buliding-for-i386.patch
#
# Patches 601 onward are generic patches
#
+Patch601: ./kexec-tools-2.0.20-eppic-Remove-duplicated-variable-declaration.patch
+Patch602: ./kexec-tools-2.0.20-makedumpfile-Remove-duplicated-variable-declarations.patch
+Patch603: ./kexec-tools-2.0.20-Remove-duplicated-variable-declarations.patch
%description
kexec-tools provides /sbin/kexec binary that facilitates a new
@@ -114,6 +117,10 @@ tar -z -x -v -f %{SOURCE19}
%patch0 -p1
+%patch601 -p1
+%patch602 -p1
+%patch603 -p1
+
%ifarch ppc
%define archdef ARCH=ppc
%endif
commit 71d20dc825d7db5810b733fd2c615804d032c511
Author: Kairui Song <kasong(a)redhat.com>
Date: Wed Jan 29 08:17:29 2020 +0800
Release 2.0.20-8
Signed-off-by: Kairui Song <kasong(a)redhat.com>
diff --git a/kexec-tools.spec b/kexec-tools.spec
index 73d985a..91ea245 100644
--- a/kexec-tools.spec
+++ b/kexec-tools.spec
@@ -4,7 +4,7 @@
Name: kexec-tools
Version: 2.0.20
-Release: 7%{?dist}
+Release: 8%{?dist}
License: GPLv2
Summary: The kexec/kdump userspace component
@@ -341,6 +341,15 @@ done
%endif
%changelog
+* Wed Jan 29 2020 Kairui Song <kasong(a)redhat.com> - 2.0.20-8
+- Update makedumpfile to 1.6.7
+- Add a hook to wait for kdump target in initqueue
+- Always install sed and awk
+- Fix potential ssh/nfs kdump failure of missing "ip" command
+- kdump-lib.sh: Fix is_nfs_dump_target
+- Always use get_save_path to get the 'path' option
+- kdump-lib: Don't abuse echo, and clean up
+
* Sun Dec 29 2019 Kairui Song <kasong(a)redhat.com> - 2.0.20-7
- Fix building failure due to makedumpfile's compile flag
- mkdumprd: Fix dracut args parsing
commit 69b920db5de9acca427d79d2f298eeaa349d86d1
Author: Kairui Song <kasong(a)redhat.com>
Date: Wed Jan 29 08:22:37 2020 +0800
Update makedumpfile to 1.6.7
Signed-off-by: Kairui Song <kasong(a)redhat.com>
diff --git a/kexec-tools-2.0.20-makedumpfile-Do-not-proceed-when-get_num_dumpable_cyclic-fails.patch b/kexec-tools-2.0.20-makedumpfile-Do-not-proceed-when-get_num_dumpable_cyclic-fails.patch
deleted file mode 100644
index 4cbdfa1..0000000
--- a/kexec-tools-2.0.20-makedumpfile-Do-not-proceed-when-get_num_dumpable_cyclic-fails.patch
+++ /dev/null
@@ -1,44 +0,0 @@
-From c1b834f80311706db2b5070cbccdcba3aacc90e5 Mon Sep 17 00:00:00 2001
-From: Kazuhito Hagio <k-hagio(a)ab.jp.nec.com>
-Date: Tue, 23 Jul 2019 11:50:52 -0400
-Subject: [PATCH 1/2] Do not proceed when get_num_dumpable_cyclic() fails
-
-Currently, when get_num_dumpable_cyclic() fails and returns FALSE in
-create_dump_bitmap(), info->num_dumpable is set to 0 and makedumpfile
-proceeds to write a broken dumpfile slowly with incorrect progress
-indicator due to the value.
-
-It should not proceed when get_num_dumpable_cyclic() fails.
-
-Signed-off-by: Kazuhito Hagio <k-hagio(a)ab.jp.nec.com>
----
- makedumpfile.c | 6 ++++--
- 1 file changed, 4 insertions(+), 2 deletions(-)
-
-diff --git a/makedumpfile.c b/makedumpfile.c
-index d76a4358a2b2..88df788fd6e7 100644
---- a/makedumpfile-1.6.6/makedumpfile.c
-+++ b/makedumpfile-1.6.6/makedumpfile.c
-@@ -7344,7 +7344,8 @@ create_dump_bitmap(void)
- if (!prepare_bitmap2_buffer())
- goto out;
-
-- info->num_dumpable = get_num_dumpable_cyclic();
-+ if (!(info->num_dumpable = get_num_dumpable_cyclic()))
-+ goto out;
-
- if (!info->flag_elf_dumpfile)
- free_bitmap2_buffer();
-@@ -7362,7 +7363,8 @@ create_dump_bitmap(void)
- if (!create_2nd_bitmap(&cycle))
- goto out;
-
-- info->num_dumpable = get_num_dumpable_cyclic();
-+ if (!(info->num_dumpable = get_num_dumpable_cyclic()))
-+ goto out;
- }
-
- ret = TRUE;
---
-2.18.1
-
diff --git a/kexec-tools-2.0.20-makedumpfile-Fix-exclusion-range-in-find_vmemmap_pages.patch b/kexec-tools-2.0.20-makedumpfile-Fix-exclusion-range-in-find_vmemmap_pages.patch
deleted file mode 100644
index 2c94711..0000000
--- a/kexec-tools-2.0.20-makedumpfile-Fix-exclusion-range-in-find_vmemmap_pages.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-From b461971bfac0f193a0c274c3b657d158e07d4995 Mon Sep 17 00:00:00 2001
-From: Kazuhito Hagio <k-hagio(a)ab.jp.nec.com>
-Date: Thu, 29 Aug 2019 14:51:56 -0400
-Subject: [PATCH] Fix exclusion range in find_vmemmap_pages()
-
-In the function, since pfn ranges are literally start and end, not start
-and end+1, if the struct page of endpfn is at the last in a vmemmap page,
-the vmemmap page is dropped by the following code, and not excluded.
-
- npfns_offset = endpfn - vmapp->rep_pfn_start;
- vmemmap_offset = npfns_offset * size_table.page;
- // round down to page boundary
- vmemmap_offset -= (vmemmap_offset % pagesize);
-
-We can use (endpfn+1) here to fix.
-
-Signed-off-by: Kazuhito Hagio <k-hagio(a)ab.jp.nec.com>
----
- makedumpfile.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/makedumpfile-1.6.6/makedumpfile.c b/makedumpfile-1.6.6/makedumpfile.c
-index 88df788..37df77d 100644
---- a/makedumpfile-1.6.6/makedumpfile.c
-+++ b/makedumpfile-1.6.6/makedumpfile.c
-@@ -6315,7 +6315,7 @@ find_vmemmap_pages(unsigned long startpfn, unsigned long endpfn, unsigned long *
- start_vmemmap_pfn = vmapp->vmap_pfn_start + vmemmap_pfns;
- *vmappfn = start_vmemmap_pfn;
-
-- npfns_offset = endpfn - vmapp->rep_pfn_start;
-+ npfns_offset = (endpfn+1) - vmapp->rep_pfn_start;
- vmemmap_offset = npfns_offset * size_table.page;
- // round down to page boundary
- vmemmap_offset -= (vmemmap_offset % pagesize);
---
-2.20.1
-
diff --git a/kexec-tools-2.0.20-makedumpfile-Fix-inconsistent-return-value-from-find_vmemmap.patch b/kexec-tools-2.0.20-makedumpfile-Fix-inconsistent-return-value-from-find_vmemmap.patch
deleted file mode 100644
index 61cbda0..0000000
--- a/kexec-tools-2.0.20-makedumpfile-Fix-inconsistent-return-value-from-find_vmemmap.patch
+++ /dev/null
@@ -1,327 +0,0 @@
-From 8425342a52b23d462f10bceeeb1c8a3a43d56bf0 Mon Sep 17 00:00:00 2001
-From: Kazuhito Hagio <k-hagio(a)ab.jp.nec.com>
-Date: Fri, 6 Sep 2019 09:50:34 -0400
-Subject: [PATCH] Fix inconsistent return value from find_vmemmap()
-
-When -e option is given, the find_vmemmap() returns FAILED(1) if
-it failed on x86_64, but on architectures other than that, it is
-stub_false() and returns FALSE(0).
-
- if (info->flag_excludevm) {
- if (find_vmemmap() == FAILED) {
- ERRMSG("Can't find vmemmap pages\n");
-
- #define find_vmemmap() stub_false()
-
-As a result, on the architectures other than x86_64, the -e option
-does some unnecessary processing with no effect, and marks the dump
-DUMP_DH_EXCLUDED_VMEMMAP unexpectedly.
-
-Also, the functions for the -e option return COMPLETED or FAILED,
-which are for command return value, not for function return value.
-
-So let's fix the issue by following the common style that returns
-TRUE or FALSE, and avoid confusion.
-
-Signed-off-by: Kazuhito Hagio <k-hagio(a)ab.jp.nec.com>
----
- arch/x86_64.c | 12 ++++-----
- makedumpfile.c | 70 ++++++++++++++++++++++++--------------------------
- 2 files changed, 40 insertions(+), 42 deletions(-)
-
-diff --git a/makedumpfile-1.6.6/arch/x86_64.c b/makedumpfile-1.6.6/arch/x86_64.c
-index 4eeaf4925f43..876644f932be 100644
---- a/makedumpfile-1.6.6/arch/x86_64.c
-+++ b/makedumpfile-1.6.6/arch/x86_64.c
-@@ -673,7 +673,7 @@ find_vmemmap_x86_64()
-
- if (init_level4_pgt == NOT_FOUND_SYMBOL) {
- ERRMSG("init_level4_pgt/init_top_pgt not found\n");
-- return FAILED;
-+ return FALSE;
- }
-
- if (NUMBER(sme_mask) != NOT_FOUND_NUMBER)
-@@ -715,7 +715,7 @@ find_vmemmap_x86_64()
- if (!readmem(PADDR, (unsigned long long)pgdp, (void *)&pud_addr,
- sizeof(unsigned long))) {
- ERRMSG("Can't get pgd entry for slot %d.\n", pgd_index);
-- return FAILED;
-+ return FALSE;
- }
-
- /* mask the pgd entry for the address of the pud page */
-@@ -726,7 +726,7 @@ find_vmemmap_x86_64()
- if (!readmem(PADDR, (unsigned long long)pud_addr, (void *)pud_page,
- PTRS_PER_PUD * sizeof(unsigned long))) {
- ERRMSG("Can't get pud entry for pgd slot %ld.\n", pgdindex);
-- return FAILED;
-+ return FALSE;
- }
- /* step thru each pmd address in the pud page */
- /* pudp points to an entry in the pud page */
-@@ -739,7 +739,7 @@ find_vmemmap_x86_64()
- if (!readmem(PADDR, pmd_addr, (void *)pmd_page,
- PTRS_PER_PMD * sizeof(unsigned long))) {
- ERRMSG("Can't get pud entry for slot %ld.\n", pudindex);
-- return FAILED;
-+ return FALSE;
- }
- /* pmdp points to an entry in the pmd */
- for (pmdp = (unsigned long *)pmd_page, pmdindex = 0;
-@@ -815,7 +815,7 @@ find_vmemmap_x86_64()
- num_pmds_valid++;
- if (!(pmd & _PAGE_PSE)) {
- printf("vmemmap pmd not huge, abort\n");
-- return FAILED;
-+ return FALSE;
- }
- } else {
- if (last_valid) {
-@@ -947,7 +947,7 @@ find_vmemmap_x86_64()
- i++;
- } while (cur != vmaphead);
- nr_gvmem_pfns = i;
-- return COMPLETED;
-+ return TRUE;
- }
-
- #endif /* x86_64 */
-diff --git a/makedumpfile-1.6.6/makedumpfile.c b/makedumpfile-1.6.6/makedumpfile.c
-index 37df77d181dd..af4db3c006c9 100644
---- a/makedumpfile-1.6.6/makedumpfile.c
-+++ b/makedumpfile-1.6.6/makedumpfile.c
-@@ -6213,20 +6213,20 @@ init_save_control()
- flags = O_RDWR|O_CREAT|O_TRUNC;
- if ((sc.sc_fd = open(sc.sc_filename, flags, S_IRUSR|S_IWUSR)) < 0) {
- ERRMSG("Can't open the pfn file %s.\n", sc.sc_filename);
-- return FAILED;
-+ return FALSE;
- }
- unlink(sc.sc_filename);
-
- sc.sc_buf = malloc(info->page_size);
- if (!sc.sc_buf) {
- ERRMSG("Can't allocate a page for pfn buf.\n");
-- return FAILED;
-+ return FALSE;
- }
- sc.sc_buflen = info->page_size;
- sc.sc_bufposition = 0;
- sc.sc_fileposition = 0;
- sc.sc_filelen = 0;
-- return COMPLETED;
-+ return TRUE;
- }
-
- /*
-@@ -6243,7 +6243,7 @@ save_deletes(unsigned long startpfn, unsigned long numpfns)
- if (i != sc.sc_buflen) {
- ERRMSG("save: Can't write a page to %s\n",
- sc.sc_filename);
-- return FAILED;
-+ return FALSE;
- }
- sc.sc_filelen += sc.sc_buflen;
- sc.sc_bufposition = 0;
-@@ -6252,12 +6252,12 @@ save_deletes(unsigned long startpfn, unsigned long numpfns)
- scp->startpfn = startpfn;
- scp->numpfns = numpfns;
- sc.sc_bufposition += sizeof(struct sc_entry);
-- return COMPLETED;
-+ return TRUE;
- }
-
- /*
- * Get a starting pfn and number of pfns for delete from bitmap.
-- * Return 0 for success, 1 for 'no more'
-+ * Return TRUE(1) for success, FALSE(0) for 'no more'
- */
- int
- get_deletes(unsigned long *startpfn, unsigned long *numpfns)
-@@ -6266,14 +6266,14 @@ get_deletes(unsigned long *startpfn, unsigned long *numpfns)
- struct sc_entry *scp;
-
- if (sc.sc_fileposition >= sc.sc_filelen) {
-- return FAILED;
-+ return FALSE;
- }
-
- if (sc.sc_bufposition == sc.sc_buflen) {
- i = read(sc.sc_fd, sc.sc_buf, sc.sc_buflen);
- if (i <= 0) {
- ERRMSG("Can't read a page from %s.\n", sc.sc_filename);
-- return FAILED;
-+ return FALSE;
- }
- sc.sc_bufposition = 0;
- }
-@@ -6282,7 +6282,7 @@ get_deletes(unsigned long *startpfn, unsigned long *numpfns)
- *numpfns = scp->numpfns;
- sc.sc_bufposition += sizeof(struct sc_entry);
- sc.sc_fileposition += sizeof(struct sc_entry);
-- return COMPLETED;
-+ return TRUE;
- }
-
- /*
-@@ -6290,7 +6290,7 @@ get_deletes(unsigned long *startpfn, unsigned long *numpfns)
- * that represent them.
- * (pfn ranges are literally start and end, not start and end+1)
- * see the array of vmemmap pfns and the pfns they represent: gvmem_pfns
-- * Return COMPLETED for delete, FAILED for not to delete.
-+ * Return TRUE(1) for delete, FALSE(0) for not to delete.
- */
- int
- find_vmemmap_pages(unsigned long startpfn, unsigned long endpfn, unsigned long *vmappfn,
-@@ -6323,12 +6323,12 @@ find_vmemmap_pages(unsigned long startpfn, unsigned long endpfn, unsigned long *
- end_vmemmap_pfn = vmapp->vmap_pfn_start + vmemmap_pfns;
- npages = end_vmemmap_pfn - start_vmemmap_pfn;
- if (npages == 0)
-- return FAILED;
-+ return FALSE;
- *nmapnpfns = npages;
-- return COMPLETED;
-+ return TRUE;
- }
- }
-- return FAILED;
-+ return FALSE;
- }
-
- /*
-@@ -6359,12 +6359,12 @@ find_unused_vmemmap_pages(void)
- if (lseek(bitmap1->fd, new_offset1, SEEK_SET) < 0 ) {
- ERRMSG("Can't seek the bitmap(%s). %s\n",
- bitmap1->file_name, strerror(errno));
-- return FAILED;
-+ return FALSE;
- }
- if (read(bitmap1->fd, bitmap1->buf, BUFSIZE_BITMAP) != BUFSIZE_BITMAP) {
- ERRMSG("Can't read the bitmap(%s). %s\n",
- bitmap1->file_name, strerror(errno));
-- return FAILED;
-+ return FALSE;
- }
- bitmap1->no_block = pfn / PFN_BUFBITMAP;
-
-@@ -6372,12 +6372,12 @@ find_unused_vmemmap_pages(void)
- if (lseek(bitmap2->fd, new_offset2, SEEK_SET) < 0 ) {
- ERRMSG("Can't seek the bitmap(%s). %s\n",
- bitmap2->file_name, strerror(errno));
-- return FAILED;
-+ return FALSE;
- }
- if (read(bitmap2->fd, bitmap2->buf, BUFSIZE_BITMAP) != BUFSIZE_BITMAP) {
- ERRMSG("Can't read the bitmap(%s). %s\n",
- bitmap2->file_name, strerror(errno));
-- return FAILED;
-+ return FALSE;
- }
- bitmap2->no_block = pfn / PFN_BUFBITMAP;
-
-@@ -6422,12 +6422,11 @@ find_unused_vmemmap_pages(void)
- endpfn = startpfn +
- (numwords * BITS_PER_WORD) - 1;
- if (find_vmemmap_pages(startpfn, endpfn,
-- &vmapstartpfn, &vmapnumpfns) ==
-- COMPLETED) {
-- if (save_deletes(vmapstartpfn,
-- vmapnumpfns) == FAILED) {
-+ &vmapstartpfn, &vmapnumpfns)) {
-+ if (!save_deletes(vmapstartpfn,
-+ vmapnumpfns)) {
- ERRMSG("save_deletes failed\n");
-- return FAILED;
-+ return FALSE;
- }
- deleted_pages += vmapnumpfns;
- }
-@@ -6444,11 +6443,10 @@ find_unused_vmemmap_pages(void)
- not start and end + 1 */
- endpfn = startpfn + (numwords * BITS_PER_WORD) - 1;
- if (find_vmemmap_pages(startpfn, endpfn,
-- &vmapstartpfn, &vmapnumpfns) == COMPLETED) {
-- if (save_deletes(vmapstartpfn, vmapnumpfns)
-- == FAILED) {
-+ &vmapstartpfn, &vmapnumpfns)) {
-+ if (!save_deletes(vmapstartpfn, vmapnumpfns)) {
- ERRMSG("save_deletes failed\n");
-- return FAILED;
-+ return FALSE;
- }
- deleted_pages += vmapnumpfns;
- }
-@@ -6457,7 +6455,7 @@ find_unused_vmemmap_pages(void)
- }
- PROGRESS_MSG("\nExcluded %ld unused vmemmap pages\n", deleted_pages);
-
-- return COMPLETED;
-+ return TRUE;
- }
-
- /*
-@@ -6468,7 +6466,7 @@ delete_unused_vmemmap_pages(void)
- {
- unsigned long startpfn, numpfns, pfn, i;
-
-- while (get_deletes(&startpfn, &numpfns) == COMPLETED) {
-+ while (get_deletes(&startpfn, &numpfns)) {
- for (i = 0, pfn = startpfn; i < numpfns; i++, pfn++) {
- clear_bit_on_2nd_bitmap_for_kernel(pfn, (struct cycle *)0);
- // note that this is never to be used in cyclic mode!
-@@ -6496,23 +6494,23 @@ reset_save_control()
- {
- int i;
- if (sc.sc_bufposition == 0)
-- return COMPLETED;
-+ return TRUE;
-
- i = write(sc.sc_fd, sc.sc_buf, sc.sc_buflen);
- if (i != sc.sc_buflen) {
- ERRMSG("reset: Can't write a page to %s\n",
- sc.sc_filename);
-- return FAILED;
-+ return FALSE;
- }
- sc.sc_filelen += sc.sc_bufposition;
-
- if (lseek(sc.sc_fd, 0, SEEK_SET) < 0) {
- ERRMSG("Can't seek the pfn file %s).", sc.sc_filename);
-- return FAILED;
-+ return FALSE;
- }
- sc.sc_fileposition = 0;
- sc.sc_bufposition = sc.sc_buflen; /* trigger 1st read */
-- return COMPLETED;
-+ return TRUE;
- }
-
- int
-@@ -6602,11 +6600,11 @@ create_2nd_bitmap(struct cycle *cycle)
-
- /* --exclude-unused-vm means exclude vmemmap page structures for unused pages */
- if (info->flag_excludevm) {
-- if (init_save_control() == FAILED)
-+ if (!init_save_control())
- return FALSE;
-- if (find_unused_vmemmap_pages() == FAILED)
-+ if (!find_unused_vmemmap_pages())
- return FALSE;
-- if (reset_save_control() == FAILED)
-+ if (!reset_save_control())
- return FALSE;
- delete_unused_vmemmap_pages();
- finalize_save_control();
-@@ -10095,7 +10093,7 @@ create_dumpfile(void)
-
- /* create an array of translations from pfn to vmemmap pages */
- if (info->flag_excludevm) {
-- if (find_vmemmap() == FAILED) {
-+ if (!find_vmemmap()) {
- ERRMSG("Can't find vmemmap pages\n");
- info->flag_excludevm = 0;
- }
---
-2.18.1
-
diff --git a/kexec-tools-2.0.20-makedumpfile-Increase-SECTION_MAP_LAST_BIT-to-4.patch b/kexec-tools-2.0.20-makedumpfile-Increase-SECTION_MAP_LAST_BIT-to-4.patch
deleted file mode 100644
index 050d83c..0000000
--- a/kexec-tools-2.0.20-makedumpfile-Increase-SECTION_MAP_LAST_BIT-to-4.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-From 7bdb468c2c99dd780c9a5321f93c79cbfdce2527 Mon Sep 17 00:00:00 2001
-From: Kazuhito Hagio <k-hagio(a)ab.jp.nec.com>
-Date: Tue, 23 Jul 2019 12:24:47 -0400
-Subject: [PATCH 2/2] Increase SECTION_MAP_LAST_BIT to 4
-
-kernel commit 326e1b8f83a4 ("mm/sparsemem: introduce a SECTION_IS_EARLY
-flag") added the flag to mem_section->section_mem_map value, and it caused
-makedumpfile an error like the following:
-
- readmem: Can't convert a virtual address(fffffc97d1000000) to physical address.
- readmem: type_addr: 0, addr:fffffc97d1000000, size:32768
- __exclude_unnecessary_pages: Can't read the buffer of struct page.
- create_2nd_bitmap: Can't exclude unnecessary pages.
-
-To fix this, SECTION_MAP_LAST_BIT needs to be updated. The bit has not
-been used until the addition, so we can just increase the value.
-
-Signed-off-by: Kazuhito Hagio <k-hagio(a)ab.jp.nec.com>
----
- makedumpfile.h | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/makedumpfile.h b/makedumpfile.h
-index 24b2f69f400c..df745b9f53e5 100644
---- a/makedumpfile-1.6.6/makedumpfile.h
-+++ b/makedumpfile-1.6.6/makedumpfile.h
-@@ -195,7 +195,7 @@ isAnon(unsigned long mapping)
- * 2. it has been verified that (1UL<<2) was never set, so it is
- * safe to mask that bit off even in old kernels.
- */
--#define SECTION_MAP_LAST_BIT (1UL<<3)
-+#define SECTION_MAP_LAST_BIT (1UL<<4)
- #define SECTION_MAP_MASK (~(SECTION_MAP_LAST_BIT-1))
- #define NR_SECTION_ROOTS() divideup(num_section, SECTIONS_PER_ROOT())
- #define SECTION_NR_TO_PFN(sec) ((sec) << PFN_SECTION_SHIFT())
---
-2.18.1
-
diff --git a/kexec-tools-2.0.20-makedumpfile-remove-lebl.patch b/kexec-tools-2.0.20-makedumpfile-remove-lebl.patch
deleted file mode 100644
index ca63d82..0000000
--- a/kexec-tools-2.0.20-makedumpfile-remove-lebl.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-From 3beef142bc003d9cf2e957c6a21e51d661f9b13e Mon Sep 17 00:00:00 2001
-From: Pingfan Liu <piliu(a)redhat.com>
-Date: Thu, 28 Nov 2019 21:23:00 +0800
-Subject: [PATCH] makedumpfile: remove -lebl
-
-Signed-off-by: Pingfan Liu <piliu(a)redhat.com>
----
- makedumpfile-1.6.6/Makefile | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/makedumpfile-1.6.6/Makefile b/makedumpfile-1.6.6/Makefile
-index 1fdb628..df21b93 100644
---- a/makedumpfile-1.6.6/Makefile
-+++ b/makedumpfile-1.6.6/Makefile
-@@ -50,7 +50,7 @@ OBJ_PART=$(patsubst %.c,%.o,$(SRC_PART))
- SRC_ARCH = arch/arm.c arch/arm64.c arch/x86.c arch/x86_64.c arch/ia64.c arch/ppc64.c arch/s390x.c arch/ppc.c arch/sparc64.c
- OBJ_ARCH=$(patsubst %.c,%.o,$(SRC_ARCH))
-
--LIBS = -ldw -lbz2 -lebl -ldl -lelf -lz
-+LIBS = -ldw -lbz2 -ldl -lelf -lz
- ifneq ($(LINKTYPE), dynamic)
- LIBS := -static $(LIBS)
- endif
---
-2.20.1
-
diff --git a/kexec-tools-2.0.20-makedumpfile-x86_64-Fix-incorrect-exclusion-by-e-option.patch b/kexec-tools-2.0.20-makedumpfile-x86_64-Fix-incorrect-exclusion-by-e-option.patch
deleted file mode 100644
index fa60b6a..0000000
--- a/kexec-tools-2.0.20-makedumpfile-x86_64-Fix-incorrect-exclusion-by-e-option.patch
+++ /dev/null
@@ -1,41 +0,0 @@
-From aa5ab4cf6c7335392094577380d2eaee8a0a8d52 Mon Sep 17 00:00:00 2001
-From: Kazuhito Hagio <k-hagio(a)ab.jp.nec.com>
-Date: Thu, 29 Aug 2019 12:26:34 -0400
-Subject: [PATCH] x86_64: Fix incorrect exclusion by -e option with KASLR
-
-The -e option uses info->vmemmap_start for creating a table to determine
-the positions of page structures that should be excluded, but it is a
-hardcoded value even with KASLR-enabled vmcore. As a result, the option
-excludes incorrect pages from it.
-
-To fix this, get the vmemmap start address from info->mem_map_data.
-
-Signed-off-by: Kazuhito Hagio <k-hagio(a)ab.jp.nec.com>
----
- arch/x86_64.c | 10 ++++++++++
- 1 file changed, 10 insertions(+)
-
-diff --git a/makedumpfile-1.6.6/arch/x86_64.c b/makedumpfile-1.6.6/arch/x86_64.c
-index 3c0fdc5..4eeaf49 100644
---- a/makedumpfile-1.6.6/arch/x86_64.c
-+++ b/makedumpfile-1.6.6/arch/x86_64.c
-@@ -679,6 +679,16 @@ find_vmemmap_x86_64()
- if (NUMBER(sme_mask) != NOT_FOUND_NUMBER)
- pmask &= ~(NUMBER(sme_mask));
-
-+ /*
-+ * vmemmap region can be randomized by KASLR.
-+ * (currently we don't utilize info->vmemmap_end on x86_64.)
-+ *
-+ if (info->mem_map_data &&
-+ info->mem_map_data[0].mem_map != NOT_MEMMAP_ADDR)
-+ info->vmemmap_start = info->mem_map_data[0].mem_map;
-+
-+ DEBUG_MSG("vmemmap_start: %16lx\n", info->vmemmap_start);
-+
- pagestructsize = size_table.page;
- hugepagesize = PTRS_PER_PMD * info->page_size;
- vaddr_base = info->vmemmap_start;
---
-2.20.1
-
diff --git a/kexec-tools.spec b/kexec-tools.spec
index 616b504..73d985a 100644
--- a/kexec-tools.spec
+++ b/kexec-tools.spec
@@ -1,6 +1,6 @@
%global eppic_ver d84c3541035d95077aa8571f5d5c3e07c6ef510b
%global eppic_shortver %(c=%{eppic_ver}; echo ${c:0:7})
-%global mkdf_ver 1.6.6
+%global mkdf_ver 1.6.7
Name: kexec-tools
Version: 2.0.20
@@ -82,8 +82,6 @@ Patch0: kexec-tools-2.0.20-fix-broken-multiboot2-buliding-for-i386.patch
#
# Patches 101 through 200 are meant for x86_64 kexec-tools enablement
#
-Patch101: kexec-tools-2.0.20-makedumpfile-x86_64-Fix-incorrect-exclusion-by-e-option.patch
-Patch102: kexec-tools-2.0.20-makedumpfile-Fix-exclusion-range-in-find_vmemmap_pages.patch
#
# Patches 301 through 400 are meant for ppc64 kexec-tools enablement
@@ -99,10 +97,6 @@ Patch102: kexec-tools-2.0.20-makedumpfile-Fix-exclusion-range-in-find_vmemmap_pa
#
# Patches 601 onward are generic patches
#
-Patch601: kexec-tools-2.0.20-makedumpfile-Do-not-proceed-when-get_num_dumpable_cyclic-fails.patch
-Patch602: kexec-tools-2.0.20-makedumpfile-Increase-SECTION_MAP_LAST_BIT-to-4.patch
-Patch603: kexec-tools-2.0.20-makedumpfile-Fix-inconsistent-return-value-from-find_vmemmap.patch
-Patch604: kexec-tools-2.0.20-makedumpfile-remove-lebl.patch
%description
kexec-tools provides /sbin/kexec binary that facilitates a new
@@ -119,12 +113,6 @@ tar -z -x -v -f %{SOURCE9}
tar -z -x -v -f %{SOURCE19}
%patch0 -p1
-%patch601 -p1
-%patch602 -p1
-%patch101 -p1
-%patch102 -p1
-%patch603 -p1
-%patch604 -p1
%ifarch ppc
%define archdef ARCH=ppc
diff --git a/sources b/sources
index 1d5c7d0..574d13c 100644
--- a/sources
+++ b/sources
@@ -1,3 +1,3 @@
SHA512 (eppic-d84c354.tar.gz) = 455b3386c3e4cc546b858f1f8b0e6874072aaae708ebe072452fb5f0b6a81b1f3a315b40f94c3967f38525cadd276864a7bc7f0f12fa421655dcc3b15b70914d
-SHA512 (makedumpfile-1.6.6.tar.gz) = f4926d7800fe21b9125c03b8ce043e7cc3420b997a7d9f4ce7b565cde7f5b4aaf9ac958dbbefe5868ee3cb639ccb2d40c10f774ac2720baeac2242fc0bf66df2
SHA512 (kexec-tools-2.0.20.tar.xz) = 3112b6202c1030705c53e3f65a2b58aec14d65333a35aad681d48b9f2bd1c51a2e05c985a1e5e867ab02f8a9c97708483d9d225619db7c6993676f1a242e2d99
+SHA512 (makedumpfile-1.6.7.tar.gz) = fdd78bfea5f96eda094269480ebbceead6ae8d9d2bb1184ffa1e18c6effda5c6df296fbcecc25735109194c0690d6f9ca684c37da1825d7d65568ba18a71a940
commit cee618593c35443f3cf5dbce85cf5b04cbeb34de
Author: Kairui Song <kasong(a)redhat.com>
Date: Thu Jan 9 00:53:41 2020 +0800
Add a hook to wait for kdump target in initqueue
The dracut initqueue may quit immediately and won't trigger any hook if
there is no "finished" hook still pending (finished hook will be deleted
once it return 0).
This issue start to appear with latest dracut, latest dracut use
network-manager to configure the network,
network-manager module only install "settled" hook, and we didn't
install any other hook. So NFS/SSH dump will fail. iSCSI dump works
because dracut iscsi module will install a "finished" hook to detect if
the iscsi target is up.
So for NFS/SSH we keep initqueue running until the host successfully get
a valid IP address, which means the network is ready.
Signed-off-by: Kairui Song <kasong(a)redhat.com>
Acked-by: Pingfan Liu <piliu(a)redhat.com>
diff --git a/dracut-kdump-wait-for-target.sh b/dracut-kdump-wait-for-target.sh
new file mode 100755
index 0000000..ce984d0
--- /dev/null
+++ b/dracut-kdump-wait-for-target.sh
@@ -0,0 +1,23 @@
+#!/bin/sh
+
+# only wait if it's kdump kernel
+if [ -f /etc/fadump.initramfs ] && [ ! -f /proc/device-tree/rtas/ibm,kernel-dump ]; then
+ exit 0
+fi
+
+. /lib/dracut-lib.sh
+. /lib/kdump-lib-initramfs.sh
+
+# For SSH/NFS target, need to wait for the network to setup
+if is_nfs_dump_target; then
+ get_host_ip
+ exit $?
+fi
+
+if is_ssh_dump_target; then
+ get_host_ip
+ exit $?
+fi
+
+# No need to wait for dump target
+exit 0
diff --git a/dracut-kdump.sh b/dracut-kdump.sh
index 2ae1c7c..8add48d 100755
--- a/dracut-kdump.sh
+++ b/dracut-kdump.sh
@@ -114,54 +114,6 @@ save_vmcore_dmesg_ssh() {
fi
}
-get_host_ip()
-{
- local _host
- if is_nfs_dump_target || is_ssh_dump_target
- then
- kdumpnic=$(getarg kdumpnic=)
- [ -z "$kdumpnic" ] && echo "kdump: failed to get kdumpnic!" && return 1
- _host=`ip addr show dev $kdumpnic|grep '[ ]*inet'`
- [ $? -ne 0 ] && echo "kdump: wrong kdumpnic: $kdumpnic" && return 1
- _host=`echo $_host | head -n 1 | cut -d' ' -f2`
- _host="${_host%%/*}"
- [ -z "$_host" ] && echo "kdump: wrong kdumpnic: $kdumpnic" && return 1
- HOST_IP=$_host
- fi
- return 0
-}
-
-read_kdump_conf()
-{
- if [ ! -f "$KDUMP_CONF" ]; then
- echo "kdump: $KDUMP_CONF not found"
- return
- fi
-
- get_kdump_confs
-
- # rescan for add code for dump target
- while read config_opt config_val;
- do
- # remove inline comments after the end of a directive.
- case "$config_opt" in
- dracut_args)
- config_val=$(get_dracut_args_target "$config_val")
- [ -n "$config_val" ] && add_dump_code "dump_fs $config_val"
- ;;
- ext[234]|xfs|btrfs|minix|nfs)
- add_dump_code "dump_fs $config_val"
- ;;
- raw)
- add_dump_code "dump_raw $config_val"
- ;;
- ssh)
- add_dump_code "dump_ssh $SSH_KEY_LOCATION $config_val"
- ;;
- esac
- done <<< "$(read_strip_comments $KDUMP_CONF)"
-}
-
fence_kdump_notify()
{
if [ -n "$FENCE_KDUMP_NODES" ]; then
diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh
index 3558a0f..570bd62 100755
--- a/dracut-module-setup.sh
+++ b/dracut-module-setup.sh
@@ -842,7 +842,9 @@ install() {
kdump_check_iscsi_targets
# nfs/ssh dump will need to get host ip in second kernel and need to call 'ip' tool, see get_host_ip for more detail
+ # also need to let initqueue wait for target to become ready
if is_nfs_dump_target || is_ssh_dump_target; then
+ inst_hook initqueue/finished 01 $moddir/kdump-wait-for-target.sh
inst "ip"
fi
diff --git a/kdump-lib-initramfs.sh b/kdump-lib-initramfs.sh
index 8530556..d5d2ee2 100755
--- a/kdump-lib-initramfs.sh
+++ b/kdump-lib-initramfs.sh
@@ -201,3 +201,51 @@ do_final_action()
{
eval $FINAL_ACTION
}
+
+get_host_ip()
+{
+ local _host
+ if is_nfs_dump_target || is_ssh_dump_target
+ then
+ kdumpnic=$(getarg kdumpnic=)
+ [ -z "$kdumpnic" ] && echo "kdump: failed to get kdumpnic!" && return 1
+ _host=`ip addr show dev $kdumpnic|grep '[ ]*inet'`
+ [ $? -ne 0 ] && echo "kdump: wrong kdumpnic: $kdumpnic" && return 1
+ _host=`echo $_host | head -n 1 | cut -d' ' -f2`
+ _host="${_host%%/*}"
+ [ -z "$_host" ] && echo "kdump: wrong kdumpnic: $kdumpnic" && return 1
+ HOST_IP=$_host
+ fi
+ return 0
+}
+
+read_kdump_conf()
+{
+ if [ ! -f "$KDUMP_CONF" ]; then
+ echo "kdump: $KDUMP_CONF not found"
+ return
+ fi
+
+ get_kdump_confs
+
+ # rescan for add code for dump target
+ while read config_opt config_val;
+ do
+ # remove inline comments after the end of a directive.
+ case "$config_opt" in
+ dracut_args)
+ config_val=$(get_dracut_args_target "$config_val")
+ [ -n "$config_val" ] && add_dump_code "dump_fs $config_val"
+ ;;
+ ext[234]|xfs|btrfs|minix|nfs)
+ add_dump_code "dump_fs $config_val"
+ ;;
+ raw)
+ add_dump_code "dump_raw $config_val"
+ ;;
+ ssh)
+ add_dump_code "dump_ssh $SSH_KEY_LOCATION $config_val"
+ ;;
+ esac
+ done <<< "$(read_strip_comments $KDUMP_CONF)"
+}
diff --git a/kexec-tools.spec b/kexec-tools.spec
index 522936a..616b504 100644
--- a/kexec-tools.spec
+++ b/kexec-tools.spec
@@ -50,6 +50,7 @@ Source106: dracut-kdump-capture.service
Source107: dracut-kdump-emergency.target
Source108: dracut-early-kdump.sh
Source109: dracut-early-kdump-module-setup.sh
+Source110: dracut-kdump-wait-for-target.sh
Requires(post): systemd-units
Requires(preun): systemd-units
@@ -225,6 +226,7 @@ cp %{SOURCE104} $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpb
cp %{SOURCE105} $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase/%{remove_dracut_prefix %{SOURCE105}}
cp %{SOURCE106} $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase/%{remove_dracut_prefix %{SOURCE106}}
cp %{SOURCE107} $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase/%{remove_dracut_prefix %{SOURCE107}}
+cp %{SOURCE110} $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase/%{remove_dracut_prefix %{SOURCE110}}
chmod 755 $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase/%{remove_dracut_prefix %{SOURCE100}}
chmod 755 $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase/%{remove_dracut_prefix %{SOURCE101}}
mkdir -p -m755 $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99earlykdump
commit 24b00298d0b869c94dc7a894c673c2aff6dd83d7
Author: Kairui Song <kasong(a)redhat.com>
Date: Sun Dec 1 00:00:50 2019 +0800
Always install sed and awk
sed and awk is heavily used everywhere in the code, but it's not
explicitely installed by kdump dracut module. If the module in dracut
stop installing them (which already happened with latest dracut
upstream), kdump will break.
Signed-off-by: Kairui Song <kasong(a)redhat.com>
Acked-by: Pingfan Liu <piliu(a)redhat.com>
diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh
index 9babae8..3558a0f 100755
--- a/dracut-module-setup.sh
+++ b/dracut-module-setup.sh
@@ -819,6 +819,8 @@ install() {
inst "/bin/sync" "/bin/sync"
inst "/bin/cut" "/bin/cut"
inst "/bin/head" "/bin/head"
+ inst "/bin/awk" "/bin/awk"
+ inst "/bin/sed" "/bin/sed"
inst "/sbin/makedumpfile" "/sbin/makedumpfile"
inst "/sbin/vmcore-dmesg" "/sbin/vmcore-dmesg"
inst "/lib/kdump/kdump-lib.sh" "/lib/kdump-lib.sh"
commit bcdcf35759833f33039a6ae46b2b0407ab80da41
Author: Kairui Song <kasong(a)redhat.com>
Date: Tue Dec 3 13:02:00 2019 +0800
Fix potential ssh/nfs kdump failure of missing "ip" command
For ssh/nfs dump, kdump need the 'ip' tool to get the host ip address
for naming the vmcore. But kdump-module-setup.sh never installed this
tool. kdump-module-setup.sh worked so far as dracut network module will
help install it.
After dracut changed to use 35network-manager for network setup, "ip"
command won't be installed in second kernel by default. So need to
ensure "ip" is installed when installing kdump dracut module.
Signed-off-by: Kairui Song <kasong(a)redhat.com>
Acked-by: Pingfan Liu <piliu(a)redhat.com>
diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh
index 8e9fe42..9babae8 100755
--- a/dracut-module-setup.sh
+++ b/dracut-module-setup.sh
@@ -839,6 +839,11 @@ install() {
# at some point of time.
kdump_check_iscsi_targets
+ # nfs/ssh dump will need to get host ip in second kernel and need to call 'ip' tool, see get_host_ip for more detail
+ if is_nfs_dump_target || is_ssh_dump_target; then
+ inst "ip"
+ fi
+
# For the lvm type target under kdump, in /etc/lvm/lvm.conf we can
# safely replace "reserved_memory=XXXX"(default value is 8192) with
# "reserved_memory=1024" to lower memory pressure under kdump. We do
commit b76c56732594e28e8568be12c618718fc184e2d5
Author: Kairui Song <kasong(a)redhat.com>
Date: Sat Nov 30 23:53:02 2019 +0800
kdump-lib.sh: Fix is_nfs_dump_target
Previously is_nfs_dump_target didn't cover the case that 'path <value>'
where <value> points to a nfs mount point. This function is never used
in first kernel before so so far it worked.
Signed-off-by: Kairui Song <kasong(a)redhat.com>
Acked-by: Pingfan Liu <piliu(a)redhat.com>
diff --git a/kdump-lib.sh b/kdump-lib.sh
index d35282d..8aad556 100755
--- a/kdump-lib.sh
+++ b/kdump-lib.sh
@@ -28,6 +28,11 @@ perror() {
echo $@ >&2
}
+is_fs_type_nfs()
+{
+ [ "$1" = "nfs" ] || [ "$1" = "nfs4" ]
+}
+
is_ssh_dump_target()
{
grep -q "^ssh[[:blank:]].*@" /etc/kdump.conf
@@ -35,8 +40,23 @@ is_ssh_dump_target()
is_nfs_dump_target()
{
- grep -q "^nfs" /etc/kdump.conf || \
- [[ $(get_dracut_args_fstype "$(grep "^dracut_args .*\-\-mount" /etc/kdump.conf)") = nfs* ]]
+ if grep -q "^nfs" /etc/kdump.conf; then
+ return 0;
+ fi
+
+ if is_fs_type_nfs $(get_dracut_args_fstype "$(grep "^dracut_args .*\-\-mount" /etc/kdump.conf)"); then
+ return 0
+ fi
+
+ local _save_path=$(get_save_path)
+ local _target=$(get_target_from_path $_save_path)
+ local _fstype=$(get_fs_type_from_target $_target)
+
+ if is_fs_type_nfs $_fstype; then
+ return 0
+ fi
+
+ return 1
}
is_raw_dump_target()
@@ -44,13 +64,6 @@ is_raw_dump_target()
grep -q "^raw" /etc/kdump.conf
}
-is_fs_type_nfs()
-{
- local _fstype=$1
- [ $_fstype = "nfs" ] || [ $_fstype = "nfs4" ] && return 0
- return 1
-}
-
is_fs_dump_target()
{
egrep -q "^ext[234]|^xfs|^btrfs|^minix" /etc/kdump.conf
@@ -104,8 +117,7 @@ to_dev_name() {
is_user_configured_dump_target()
{
- return $(is_mount_in_dracut_args || is_ssh_dump_target || is_nfs_dump_target || \
- is_raw_dump_target || is_fs_dump_target)
+ grep -q "^ext[234]|^xfs|^btrfs|^minix|^raw|^nfs|^ssh" /etc/kdump.conf || is_mount_in_dracut_args;
}
get_user_configured_dump_disk()
commit 03111c797b6e5a9939b1835aa426c971b054ab15
Author: Kairui Song <kasong(a)redhat.com>
Date: Sat Nov 30 23:46:55 2019 +0800
Always use get_save_path to get the 'path' option
This help deduplicate the code. Use a single function instead of
repeat the same logic.
Signed-off-by: Kairui Song <kasong(a)redhat.com>
Acked-by: Pingfan Liu <piliu(a)redhat.com>
diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh
index e6358a8..8e9fe42 100755
--- a/dracut-module-setup.sh
+++ b/dracut-module-setup.sh
@@ -428,12 +428,7 @@ default_dump_target_install_conf()
is_user_configured_dump_target && return
- _save_path=$(get_option_value "path")
- [ -z "$_save_path" ] && _save_path=$DEFAULT_PATH
-
- # strip the duplicated "/"
- _save_path=$(echo $_save_path | tr -s /)
-
+ _save_path=$(get_save_path)
_mntpoint=$(get_mntpoint_from_path $_save_path)
_target=$(get_target_from_path $_save_path)
@@ -472,13 +467,9 @@ default_dump_target_install_conf()
adjust_bind_mount_path()
{
local _target=$1
- local _save_path=$(get_option_value "path")
- [ -z "$_save_path" ] && _save_path=$DEFAULT_PATH
-
- # strip the duplicated "/"
- _save_path=$(echo $_save_path | tr -s /)
-
+ local _save_path=$(get_save_path)
local _absolute_save_path=$(get_mntpoint_from_target $_target)/$_save_path
+
_absolute_save_path=$(echo "$_absolute_save_path" | tr -s /)
local _mntpoint=$(get_mntpoint_from_path $_absolute_save_path)
diff --git a/kdump-lib.sh b/kdump-lib.sh
index 2318e2d..d35282d 100755
--- a/kdump-lib.sh
+++ b/kdump-lib.sh
@@ -126,12 +126,11 @@ get_root_fs_device()
get_save_path()
{
- local _save_path=$(grep "^path" /etc/kdump.conf|awk '{print $2}')
- if [ -z "$_save_path" ]; then
- _save_path=$DEFAULT_PATH
- fi
+ local _save_path=$(grep "^path" /etc/kdump.conf|awk '{print $2}')
+ [ -z "$_save_path" ] && _save_path=$DEFAULT_PATH
- echo $_save_path
+ # strip the duplicated "/"
+ echo $(echo $_save_path | tr -s /)
}
get_block_dump_target()
commit d10f2029961227194196b2dd673c44b7c2027e38
Author: Kairui Song <kasong(a)redhat.com>
Date: Thu May 9 14:31:24 2019 +0800
kdump-lib: Don't abuse echo, and clean up
Some of echo $(...) code segment is pointless, just call the command
directly, and remove some useless if / return statement.
Signed-off-by: Kairui Song <kasong(a)redhat.com>
Acked-by: Pingfan Liu <piliu(a)redhat.com>
diff --git a/kdump-lib.sh b/kdump-lib.sh
index f393c76..2318e2d 100755
--- a/kdump-lib.sh
+++ b/kdump-lib.sh
@@ -121,11 +121,7 @@ get_user_configured_dump_disk()
get_root_fs_device()
{
- local _target
- _target=$(findmnt -k -f -n -o SOURCE /)
- [ -n "$_target" ] && echo $_target
-
- return
+ findmnt -k -f -n -o SOURCE /
}
get_save_path()
@@ -230,9 +226,9 @@ get_bind_mount_directory()
echo $_mntpoint
}
-get_mntpoint_from_path()
+get_mntpoint_from_path()
{
- echo $(df $1 | tail -1 | awk '{print $NF}')
+ df $1 | tail -1 | awk '{print $NF}'
}
get_target_from_path()
@@ -244,9 +240,9 @@ get_target_from_path()
echo $_target
}
-get_fs_type_from_target()
+get_fs_type_from_target()
{
- echo $(findmnt -k -f -n -r -o FSTYPE $1)
+ findmnt -k -f -n -r -o FSTYPE $1
}
# input: device path
@@ -281,7 +277,7 @@ get_mntpoint_from_target()
# get_option_value <option_name>
# retrieves value of option defined in kdump.conf
get_option_value() {
- echo $(strip_comments `grep "^$1[[:space:]]\+" /etc/kdump.conf | tail -1 | cut -d\ -f2-`)
+ strip_comments `grep "^$1[[:space:]]\+" /etc/kdump.conf | tail -1 | cut -d\ -f2-`
}
#This function compose a absolute path with the mount
commit d01c6de3382911a2d43192e896b61b3d88570e6c
Author: Kairui Song <kasong(a)redhat.com>
Date: Sun Dec 29 02:29:20 2019 +0800
Release 2.0.20-7
Signed-off-by: Kairui Song <kasong(a)redhat.com>
diff --git a/kexec-tools.spec b/kexec-tools.spec
index d7e1bc4..522936a 100644
--- a/kexec-tools.spec
+++ b/kexec-tools.spec
@@ -4,7 +4,7 @@
Name: kexec-tools
Version: 2.0.20
-Release: 6%{?dist}
+Release: 7%{?dist}
License: GPLv2
Summary: The kexec/kdump userspace component
@@ -351,6 +351,10 @@ done
%endif
%changelog
+* Sun Dec 29 2019 Kairui Song <kasong(a)redhat.com> - 2.0.20-7
+- Fix building failure due to makedumpfile's compile flag
+- mkdumprd: Fix dracut args parsing
+
* Thu Nov 28 2019 Kairui Song <kasong(a)redhat.com> - 2.0.20-6
- kdump-error-handler.service: Remove ExecStopPost
- mkdumprd: simplify dracut args parsing
commit b301d6c4f45e693a802e044418e900966cf4e357
Author: Kairui Song <kasong(a)redhat.com>
Date: Sat Dec 28 03:12:27 2019 +0800
Fix building failure due to makedumpfile's compile flag
From: Pingfan Liu <piliu(a)redhat.com>
makedumpfile: remove -lebl
-lebl has been removed from elfutils.
Signed-off-by: Kairui Song <kasong(a)redhat.com>
diff --git a/kexec-tools-2.0.20-makedumpfile-remove-lebl.patch b/kexec-tools-2.0.20-makedumpfile-remove-lebl.patch
new file mode 100644
index 0000000..ca63d82
--- /dev/null
+++ b/kexec-tools-2.0.20-makedumpfile-remove-lebl.patch
@@ -0,0 +1,26 @@
+From 3beef142bc003d9cf2e957c6a21e51d661f9b13e Mon Sep 17 00:00:00 2001
+From: Pingfan Liu <piliu(a)redhat.com>
+Date: Thu, 28 Nov 2019 21:23:00 +0800
+Subject: [PATCH] makedumpfile: remove -lebl
+
+Signed-off-by: Pingfan Liu <piliu(a)redhat.com>
+---
+ makedumpfile-1.6.6/Makefile | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/makedumpfile-1.6.6/Makefile b/makedumpfile-1.6.6/Makefile
+index 1fdb628..df21b93 100644
+--- a/makedumpfile-1.6.6/Makefile
++++ b/makedumpfile-1.6.6/Makefile
+@@ -50,7 +50,7 @@ OBJ_PART=$(patsubst %.c,%.o,$(SRC_PART))
+ SRC_ARCH = arch/arm.c arch/arm64.c arch/x86.c arch/x86_64.c arch/ia64.c arch/ppc64.c arch/s390x.c arch/ppc.c arch/sparc64.c
+ OBJ_ARCH=$(patsubst %.c,%.o,$(SRC_ARCH))
+
+-LIBS = -ldw -lbz2 -lebl -ldl -lelf -lz
++LIBS = -ldw -lbz2 -ldl -lelf -lz
+ ifneq ($(LINKTYPE), dynamic)
+ LIBS := -static $(LIBS)
+ endif
+--
+2.20.1
+
diff --git a/kexec-tools.spec b/kexec-tools.spec
index 27ec729..d7e1bc4 100644
--- a/kexec-tools.spec
+++ b/kexec-tools.spec
@@ -101,6 +101,7 @@ Patch102: kexec-tools-2.0.20-makedumpfile-Fix-exclusion-range-in-find_vmemmap_pa
Patch601: kexec-tools-2.0.20-makedumpfile-Do-not-proceed-when-get_num_dumpable_cyclic-fails.patch
Patch602: kexec-tools-2.0.20-makedumpfile-Increase-SECTION_MAP_LAST_BIT-to-4.patch
Patch603: kexec-tools-2.0.20-makedumpfile-Fix-inconsistent-return-value-from-find_vmemmap.patch
+Patch604: kexec-tools-2.0.20-makedumpfile-remove-lebl.patch
%description
kexec-tools provides /sbin/kexec binary that facilitates a new
@@ -122,6 +123,7 @@ tar -z -x -v -f %{SOURCE19}
%patch101 -p1
%patch102 -p1
%patch603 -p1
+%patch604 -p1
%ifarch ppc
%define archdef ARCH=ppc
commit 68dcfcfb479d5937b8a1ff73af52f6935f5c6b7f
Author: Kairui Song <kasong(a)redhat.com>
Date: Fri Nov 29 22:09:43 2019 +0800
mkdumprd: Fix dracut args parsing
Previous commit f13eab6 ('mkdumprd: simplify dracut args parsing')
break dracut arguments parsing for some use case, this should fix it
well.
Passed nfs/local/iscsi/ssh dump test, and with extra dracut_argss.
Signed-off-by: Kairui Song <kasong(a)redhat.com>
Acked-by: Dave Young <dyoung(a)redhat.com>
diff --git a/mkdumprd b/mkdumprd
index 76ae7a0..6c33fc5 100644
--- a/mkdumprd
+++ b/mkdumprd
@@ -41,15 +41,15 @@ add_dracut_arg() {
}
add_dracut_module() {
- add_dracut_arg "--add" "$1"
+ add_dracut_arg "--add" "\"$1\""
}
add_dracut_mount() {
- add_dracut_arg "--mount" "$1"
+ add_dracut_arg "--mount" "\"$1\""
}
add_dracut_sshkey() {
- add_dracut_arg "--sshkey" "$1"
+ add_dracut_arg "--sshkey" "\"$1\""
}
# caller should ensure $1 is valid and mounted in 1st kernel
commit ee742fcf6b73d873d88628b0fd642fb43bb89e78
Author: Kairui Song <kasong(a)redhat.com>
Date: Thu Nov 28 17:51:33 2019 +0800
Release 2.0.20-6
Signed-off-by: Kairui Song <kasong(a)redhat.com>
diff --git a/kexec-tools.spec b/kexec-tools.spec
index f8d4c1c..27ec729 100644
--- a/kexec-tools.spec
+++ b/kexec-tools.spec
@@ -4,7 +4,7 @@
Name: kexec-tools
Version: 2.0.20
-Release: 5%{?dist}
+Release: 6%{?dist}
License: GPLv2
Summary: The kexec/kdump userspace component
@@ -349,6 +349,18 @@ done
%endif
%changelog
+* Thu Nov 28 2019 Kairui Song <kasong(a)redhat.com> - 2.0.20-6
+- kdump-error-handler.service: Remove ExecStopPost
+- mkdumprd: simplify dracut args parsing
+- Always set vm.zone_reclaim_mode = 3 in kdump kernel
+- kdumpctl: make reload fail proof
+- spec: move binaries from /sbin to /usr/sbin
+- Don't execute final_action if failure_action terminates the system
+- module-setup.sh: Simplify the network setup code
+- mkdumprd: ensure ssh path exists before check size
+- module-setup: re-fix 99kdumpbase network dependency
+- kdumpctl: bail out immediately if host key verification failed
+
* Tue Oct 15 2019 Kairui Song <kasong(a)redhat.com> - 2.0.20-5
- Don't mount the dump target unless needed
- kdump-lib: strip grub device from kdump_bootdir
commit d13fd38df4b8d7ae5aced63b288c350a6f68dd28
Author: Kairui Song <kasong(a)redhat.com>
Date: Tue Nov 19 14:25:43 2019 +0800
kdump-error-handler.service: Remove ExecStopPost
Currently "systemctl --fail --no-block default" will be executed on
kdump-error-handler exit due to the config. This may makes systemd try
to isolate to the default target again.
The execute chain will be like:
initrd.target -> kdump.sh (failed) -> kdump-error-handler.service ->
failure_action -> final_action -> ExecStopPost (go to initrd.target again)
Currently, reboot/shutdown/halt is called by either by executing
failure_action or final_action. So the loop will be stopped. However
nont of the reboot/shutdown/halt call is blocking so it might lead to
race issue.
Just drop the ExecStopPost to fix this potential issue.
Signed-off-by: Kairui Song <kasong(a)redhat.com>
Acked-by: Pingfan Liu <piliu(a)redhat.com>
Tested-by: HATAYAMA Daisuke <d.hatayama(a)fujitsu.com>
diff --git a/dracut-kdump-error-handler.service b/dracut-kdump-error-handler.service
index 32b74ab..a23b75e 100644
--- a/dracut-kdump-error-handler.service
+++ b/dracut-kdump-error-handler.service
@@ -21,7 +21,6 @@ Environment=DRACUT_SYSTEMD=1
Environment=NEWROOT=/sysroot
WorkingDirectory=/
ExecStart=/bin/kdump-error-handler.sh
-ExecStopPost=-/usr/bin/systemctl --fail --no-block default
Type=oneshot
StandardInput=tty-force
StandardOutput=inherit
commit f13eab60cbb57a255a443a94c9689b1647898fff
Author: Kairui Song <kasong(a)redhat.com>
Date: Wed Nov 20 22:58:10 2019 +0800
mkdumprd: simplify dracut args parsing
Previously dracut_args is stored as an array in the shell code,
so we can just pass this array as argument to dracut.
But when trying to append new dracut argument, we have to manually
handle the quotes and spaces to ensure the appended argument is
splitted into array elements in the right way.
This is complex and hard to read or maintain. Instead, just store the
dracut_args as a plain string, and let xargs help parse it and call
dracut.
Simply passing $dracut_args or "$dracut_args" will either let dracut
consider the whole string as a single argument, or loss all the
quotes. xargs can handle it well and cover more corner cases.
Eg. one corner case before, if we have:
dracut_args --mount "/dev/sda1 /mnt/test xfs rw"
Kdump will fail, because the function add_dracut_arg() will wrongly
change the arguments into: (Notice the extra space.)
dracut_args --mount " /dev/sda1 /mnt/test xfs rw"
Instead of fixing it just use xargs instead. Tested with above config
and multiple other dracut_args values.
Resolves: bz1700136
Signed-off-by: Kairui Song <kasong(a)redhat.com>
Acked-by: Dave Young <dyoung(a)redhat.com>
diff --git a/mkdumprd b/mkdumprd
index aafd808..76ae7a0 100644
--- a/mkdumprd
+++ b/mkdumprd
@@ -17,6 +17,10 @@ SAVE_PATH=$(awk '/^path/ {print $2}' $conf_file)
[ -z "$SAVE_PATH" ] && SAVE_PATH=$DEFAULT_PATH
# strip the duplicated "/"
SAVE_PATH=$(echo $SAVE_PATH | tr -s /)
+OVERRIDE_RESETTABLE=0
+
+extra_modules=""
+dracut_args="--quiet --hostonly --hostonly-cmdline --hostonly-i18n --hostonly-mode strict -o \"plymouth dash resume ifcfg earlykdump\""
is_wdt_addition_needed() {
local active
@@ -32,40 +36,8 @@ is_wdt_addition_needed() {
return 1
}
-WDTCFG=""
-is_wdt_addition_needed
-[[ $? -eq 0 ]] && WDTCFG="-a watchdog"
-
-extra_modules=""
-dracut_args=("--quiet" "--hostonly" "--hostonly-cmdline" "--hostonly-i18n" "--hostonly-mode" "strict" "-o" "plymouth dash resume ifcfg earlykdump" $WDTCFG)
-OVERRIDE_RESETTABLE=0
-
add_dracut_arg() {
- local arg qarg is_quoted=0
- while [ $# -gt 0 ];
- do
- arg="${1//\'/\"}"
- #Handle quoted substring properly for passing it to dracut_args array.
- if [ $is_quoted -eq 0 ]; then
- if [[ "$arg" == "\"" ]] || [[ $arg != ${arg#\"} ]]; then
- is_quoted=1
- arg=${arg#\"}
- fi
- fi
- if [ $is_quoted -eq 1 ]; then
- qarg="$qarg $arg"
- if [[ "$arg" == "\"" ]] || [[ $arg != ${arg%\"} ]]; then
- is_quoted=0
- arg=${qarg%\"}
- qarg=""
- else
- shift
- continue
- fi
- fi
- dracut_args+=("$arg")
- shift
- done
+ dracut_args="$dracut_args $@"
}
add_dracut_module() {
@@ -390,6 +362,10 @@ if [ "$(uname -m)" = "s390x" ]; then
add_dracut_module "znet"
fi
+if is_wdt_addition_needed; then
+ add_dracut_arg "-a" "watchdog"
+fi
+
while read config_opt config_val;
do
# remove inline comments after the end of a directive.
@@ -463,7 +439,8 @@ if ! is_fadump_capable; then
add_dracut_arg "--no-hostonly-default-device"
fi
-dracut "${dracut_args[@]}" "$@"
+echo "$dracut_args $@" | xargs dracut
+
_rc=$?
sync
exit $_rc
commit 5633e8331866098c97e72e99f233a254fa479a4d
Author: Kairui Song <kasong(a)redhat.com>
Date: Wed Nov 6 16:17:21 2019 +0800
Always set vm.zone_reclaim_mode = 3 in kdump kernel
By default kernel have vm.zone_reclaim_mode = 0 and large page
allocation might fail as kernel is very conservative on memory
reclaiming. If the page allocation failure is not handled carefully
it could lead to more serious problems.
This issue can be reproduced by change with following steps:
- Fill up page cache use:
# dd if=/dev/urandom of=/test bs=1M count=1300
- Now the memory is filled with write cache:
# free -m
total used free shared buff/cache available
Mem: 1790 184 132 2 1473 1348
Swap: 2119 7 2112
- Insert a module which simply calls "kmalloc(SZ_1M, GFP_KERNEL)" for
512 times: (Notice: vmalloc don't have such problem)
# insmod debug_module.ko
- Got following allocation failure:
insmod: page allocation failure: order:8, mode:0x40cc0(GFP_KERNEL|__GFP_COMP), nodemask=(null),cpuset=/,mems_allowed=0
- Clean up and repeat again with vm.zone_reclaim_mode = 3, OOM is not
observed.
In kdump kernel there is usually only one online CPU and limited memory,
so we set vm.zone_reclaim_mode = 3 to let kernel reclaim memory more
aggresively to avoid such issue.
Signed-off-by: Kairui Song <kasong(a)redhat.com>
Acked-by: Pingfan Liu <piliu(a)redhat.com>
diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh
index 37aaa80..e6358a8 100755
--- a/dracut-module-setup.sh
+++ b/dracut-module-setup.sh
@@ -537,16 +537,18 @@ kdump_install_conf() {
rm -f ${initdir}/tmp/$$-kdump.conf
}
-# Default sysctl parameters should suffice for kdump kernel.
-# Remove custom configurations sysctl.conf & sysctl.d/*
-remove_sysctl_conf() {
-
+# Remove user custom configurations sysctl.conf & sysctl.d/*
+# and apply some optimization for kdump
+overwrite_sysctl_conf() {
# As custom configurations like vm.min_free_kbytes can lead
# to OOM issues in kdump kernel, avoid them
rm -f "${initdir}/etc/sysctl.conf"
rm -rf "${initdir}/etc/sysctl.d"
rm -rf "${initdir}/run/sysctl.d"
rm -rf "${initdir}/usr/lib/sysctl.d"
+
+ mkdir -p "${initdir}/etc/sysctl.d"
+ echo "vm.zone_reclaim_mode = 3" > "${initdir}/etc/sysctl.d/99-zone-reclaim.conf"
}
kdump_iscsi_get_rec_val() {
@@ -812,7 +814,7 @@ kdump_install_random_seed() {
install() {
kdump_install_conf
- remove_sysctl_conf
+ overwrite_sysctl_conf
if is_ssh_dump_target; then
kdump_install_random_seed
commit 0a9aabaadd4c42c7cb4e557801500b57e8cce6fc
Author: Hari Bathini <hbathini(a)linux.ibm.com>
Date: Wed Oct 30 17:02:29 2019 +0530
kdumpctl: make reload fail proof
When large amount of memory, about 1TB, is removed with DLPAR memory
remove operation, kdump reload could fail due to race condition with
device tree property update. In such scenario, the subsequent kdump
reload requests would also fail as reload() only proceeds if current
load status is active. Since the possibility of this race condition
couldn't be wished away due to the nature of the scenario, workaround
it by proceeding to load even if current load status is not active as
long as kdump service is active, which kdump udev rules already check
for.
Signed-off-by: Hari Bathini <hbathini(a)linux.ibm.com>
Acked-by: Kairui Song <kasong(a)redhat.com>
diff --git a/kdumpctl b/kdumpctl
index 048e9f5..2d21a41 100755
--- a/kdumpctl
+++ b/kdumpctl
@@ -1116,8 +1116,7 @@ reload()
{
check_current_status
if [ $? -ne 0 ]; then
- echo "Kdump is not running: [WARNING]"
- return 0
+ echo "Kdump was not running: [WARNING]"
fi
if [ $DEFAULT_DUMP_MODE == "fadump" ]; then
commit d9d4483b7a77b8489b656051aefe7b397edea2a8
Author: Pingfan Liu <piliu(a)redhat.com>
Date: Thu Nov 7 12:32:57 2019 +0800
spec: move binaries from /sbin to /usr/sbin
Before this patch
$rpm -ql kexec-tools | grep sbin
/sbin/kexec
/sbin/makedumpfile
/sbin/mkdumprd
/sbin/vmcore-dmesg
After this patch
$rpm -ql kexec-tools | grep sbin
/usr/sbin/kexec
/usr/sbin/makedumpfile
/usr/sbin/mkdumprd
/usr/sbin/vmcore-dmesg
Signed-off-by: Pingfan Liu <piliu(a)redhat.com>
Acked-by: Kairui Song <kasong(a)redhat.com>
diff --git a/kexec-tools.spec b/kexec-tools.spec
index 2881615..f8d4c1c 100644
--- a/kexec-tools.spec
+++ b/kexec-tools.spec
@@ -138,7 +138,7 @@ autoreconf
--host=powerpc64le-redhat-linux-gnu \
--build=powerpc64le-redhat-linux-gnu \
%endif
- --sbindir=/sbin
+ --sbindir=/usr/sbin
rm -f kexec-tools.spec.in
# setup the docs
cp %{SOURCE10} .
@@ -154,7 +154,7 @@ make -C makedumpfile-%{mkdf_ver} LDFLAGS="$LDFLAGS -I../eppic-%{eppic_ver}/libep
%endif
%install
-mkdir -p -m755 $RPM_BUILD_ROOT/sbin
+mkdir -p -m755 $RPM_BUILD_ROOT/usr/sbin
mkdir -p -m755 $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig
mkdir -p -m755 $RPM_BUILD_ROOT%{_localstatedir}/crash
mkdir -p -m755 $RPM_BUILD_ROOT%{_mandir}/man8/
@@ -168,8 +168,8 @@ mkdir -p -m755 $RPM_BUILD_ROOT%{_libdir}
mkdir -p -m755 $RPM_BUILD_ROOT%{_prefix}/lib/kdump
install -m 755 %{SOURCE1} $RPM_BUILD_ROOT%{_bindir}/kdumpctl
-install -m 755 build/sbin/kexec $RPM_BUILD_ROOT/sbin/kexec
-install -m 755 build/sbin/vmcore-dmesg $RPM_BUILD_ROOT/sbin/vmcore-dmesg
+install -m 755 build/sbin/kexec $RPM_BUILD_ROOT/usr/sbin/kexec
+install -m 755 build/sbin/vmcore-dmesg $RPM_BUILD_ROOT/usr/sbin/vmcore-dmesg
install -m 644 build/man/man8/kexec.8 $RPM_BUILD_ROOT%{_mandir}/man8/
install -m 644 build/man/man8/vmcore-dmesg.8 $RPM_BUILD_ROOT%{_mandir}/man8/
@@ -178,7 +178,7 @@ SYSCONFIG=$RPM_SOURCE_DIR/kdump.sysconfig.%{_target_cpu}
[ -f $SYSCONFIG ] || SYSCONFIG=$RPM_SOURCE_DIR/kdump.sysconfig
install -m 644 $SYSCONFIG $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/kdump
-install -m 755 %{SOURCE7} $RPM_BUILD_ROOT/sbin/mkdumprd
+install -m 755 %{SOURCE7} $RPM_BUILD_ROOT/usr/sbin/mkdumprd
install -m 644 %{SOURCE8} $RPM_BUILD_ROOT%{_sysconfdir}/kdump.conf
install -m 644 kexec/kexec.8 $RPM_BUILD_ROOT%{_mandir}/man8/kexec.8
install -m 644 %{SOURCE12} $RPM_BUILD_ROOT%{_mandir}/man8/mkdumprd.8
@@ -201,7 +201,7 @@ install -m 644 %{SOURCE16} $RPM_BUILD_ROOT%{_unitdir}/kdump.service
install -m 755 -D %{SOURCE22} $RPM_BUILD_ROOT%{_prefix}/lib/systemd/system-generators/kdump-dep-generator.sh
%ifarch %{ix86} x86_64 ppc64 s390x ppc64le aarch64
-install -m 755 makedumpfile-%{mkdf_ver}/makedumpfile $RPM_BUILD_ROOT/sbin/makedumpfile
+install -m 755 makedumpfile-%{mkdf_ver}/makedumpfile $RPM_BUILD_ROOT/usr/sbin/makedumpfile
install -m 644 makedumpfile-%{mkdf_ver}/makedumpfile.8.gz $RPM_BUILD_ROOT/%{_mandir}/man8/makedumpfile.8.gz
install -m 644 makedumpfile-%{mkdf_ver}/makedumpfile.conf.5.gz $RPM_BUILD_ROOT/%{_mandir}/man5/makedumpfile.conf.5.gz
install -m 644 makedumpfile-%{mkdf_ver}/makedumpfile.conf $RPM_BUILD_ROOT/%{_sysconfdir}/makedumpfile.conf.sample
@@ -306,12 +306,12 @@ do
done
%files
-/sbin/kexec
+/usr/sbin/kexec
%ifarch %{ix86} x86_64 ppc64 s390x ppc64le aarch64
-/sbin/makedumpfile
+/usr/sbin/makedumpfile
%endif
-/sbin/mkdumprd
-/sbin/vmcore-dmesg
+/usr/sbin/mkdumprd
+/usr/sbin/vmcore-dmesg
%{_bindir}/*
%{_datadir}/kdump
%{_prefix}/lib/kdump
commit 39352d0cfc98b43ce60ac262b6fc4dd5c6e084dd
Author: Kairui Song <kasong(a)redhat.com>
Date: Wed Oct 30 17:09:07 2019 +0800
Don't execute final_action if failure_action terminates the system
If failure_action is shutdown/reboot/halt, final_action is pointless as
the system will be already stopping. And if final_action is different
from failure_action, it will trigger a systemd race problem and cause
unexpected behavior to occur.
So let the error handler stop and exit after performing failure_action
successfully if failure_action is one of shutdown/reboot/halt.
This way, final_action will not be executed.
Signed-off-by: Kairui Song <kasong(a)redhat.com>
Acked-by: Pingfan Liu <piliu(a)redhat.com>
diff --git a/kdump-lib-initramfs.sh b/kdump-lib-initramfs.sh
index c409dce..8530556 100755
--- a/kdump-lib-initramfs.sh
+++ b/kdump-lib-initramfs.sh
@@ -56,13 +56,13 @@ get_kdump_confs()
FAILURE_ACTION="kdump_emergency_shell"
;;
reboot)
- FAILURE_ACTION="systemctl reboot -f"
+ FAILURE_ACTION="systemctl reboot -f && exit"
;;
halt)
- FAILURE_ACTION="halt"
+ FAILURE_ACTION="halt && exit"
;;
poweroff)
- FAILURE_ACTION="systemctl poweroff -f"
+ FAILURE_ACTION="systemctl poweroff -f && exit"
;;
dump_to_rootfs)
FAILURE_ACTION="dump_to_rootfs"
commit 5e76e53a70240350252e4263d7507ec271cafab7
Author: Kairui Song <kasong(a)redhat.com>
Date: Mon Jul 1 00:41:07 2019 +0800
module-setup.sh: Simplify the network setup code
Merge kdump_setup_netdev into kdump_install_net.
kdump_install_net is a wrapper of calling kdump_setup_netdev, and
it do following three extra things:
1. Sanitize and resolve the hostname
2. Resolve the route to the destination
3. Set the default gateway for once
There is currently only one caller of kdump_setup_netdev, the iscsi
network setup code, and it's doing 1 and 2 by itself. And there should
only be one default gateway in kdump enviroment, so applying 3 here is
fine.
And the comment of kdump_install_net is wrong and obsoleted, update the
comment too.
Just merge kdump_setup_netdev into kdump_install_net and always use
kdump_install_net instead.
Signed-off-by: Kairui Song <kasong(a)redhat.com>
Acked-by: Pingfan Liu <piliu(a)redhat.com>
diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh
index 74c2f48..37aaa80 100755
--- a/dracut-module-setup.sh
+++ b/dracut-module-setup.sh
@@ -327,11 +327,45 @@ kdump_setup_znet() {
echo rd.znet=${NETTYPE},${SUBCHANNELS}${_options} > ${initdir}/etc/cmdline.d/30znet.conf
}
-# Setup dracut to bringup a given network interface
-kdump_setup_netdev() {
- local _netdev=$1 _srcaddr=$2
+kdump_get_ip_route()
+{
+ local _route=$(/sbin/ip -o route get to $1 2>&1)
+ [ $? != 0 ] && die "Bad kdump network destination: $1"
+ echo $_route
+}
+
+kdump_get_ip_route_field()
+{
+ if `echo $1 | grep -q $2`; then
+ echo ${1##*$2} | cut -d ' ' -f1
+ fi
+}
+
+kdump_get_remote_ip()
+{
+ local _remote=$(get_remote_host $1) _remote_temp
+ if is_hostname $_remote; then
+ _remote_temp=`getent ahosts $_remote | grep -v : | head -n 1`
+ if [ -z "$_remote_temp" ]; then
+ _remote_temp=`getent ahosts $_remote | head -n 1`
+ fi
+ _remote=`echo $_remote_temp | cut -d' ' -f1`
+ fi
+ echo $_remote
+}
+
+# Setup dracut to bring up network interface that enable
+# initramfs accessing giving destination
+# $1: destination host
+kdump_install_net() {
+ local _destaddr _srcaddr _route _netdev
local _static _proto _ip_conf _ip_opts _ifname_opts
- local _netmac=$(kdump_get_mac_addr $_netdev)
+
+ _destaddr=$(kdump_get_remote_ip $1)
+ _route=$(kdump_get_ip_route $_destaddr)
+ _srcaddr=$(kdump_get_ip_route_field "$_route" "src")
+ _netdev=$(kdump_get_ip_route_field "$_route" "dev")
+ _netmac=$(kdump_get_mac_addr $_netdev)
if [ "$(uname -m)" = "s390x" ]; then
kdump_setup_znet $_netdev
@@ -372,42 +406,8 @@ kdump_setup_netdev() {
fi
kdump_setup_dns "$_netdev"
-}
-get_ip_route_field()
-{
- if `echo $1 | grep -q $2`; then
- echo ${1##*$2} | cut -d ' ' -f1
- fi
-}
-
-#Function:kdump_install_net
-#$1: config values of net line in kdump.conf
-#$2: srcaddr of network device
-kdump_install_net() {
- local _server _netdev _srcaddr _route _serv_tmp
- local config_val="$1"
-
- _server=$(get_remote_host $config_val)
-
- if is_hostname $_server; then
- _serv_tmp=`getent ahosts $_server | grep -v : | head -n 1`
- if [ -z "$_serv_tmp" ]; then
- _serv_tmp=`getent ahosts $_server | head -n 1`
- fi
- _server=`echo $_serv_tmp | cut -d' ' -f1`
- fi
-
- _route=`/sbin/ip -o route get to $_server 2>&1`
- [ $? != 0 ] && echo "Bad kdump location: $config_val" && exit 1
-
- #the field in the ip output changes if we go to another subnet
- _srcaddr=$(get_ip_route_field "$_route" "src")
- _netdev=$(get_ip_route_field "$_route" "dev")
-
- kdump_setup_netdev "${_netdev}" "${_srcaddr}"
-
- #save netdev used for kdump as cmdline
+ # Save netdev used for kdump as cmdline
# Whoever calling kdump_install_net() is setting up the default gateway,
# ie. bootdev/kdumpnic. So don't override the setting if calling
# kdump_install_net() for another time. For example, after setting eth0 as
@@ -592,9 +592,6 @@ kdump_setup_iscsi_device() {
local tgt_name; local tgt_ipaddr;
local username; local password; local userpwd_str;
local username_in; local password_in; local userpwd_in_str;
- local netdev
- local srcaddr
- local idev
local netroot_str ; local initiator_str;
local netroot_conf="${initdir}/etc/cmdline.d/50iscsi.conf"
local initiator_conf="/etc/iscsi/initiatorname.iscsi"
@@ -633,12 +630,7 @@ kdump_setup_iscsi_device() {
[ -n "$username_in" ] && userpwd_in_str=":$username_in:$password_in"
- netdev=$(/sbin/ip route get to ${tgt_ipaddr} | \
- sed 's|.*dev \(.*\).*|\1|g')
- srcaddr=$(echo $netdev | awk '{ print $3; exit }')
- netdev=$(echo $netdev | awk '{ print $1; exit }')
-
- kdump_setup_netdev $netdev $srcaddr
+ kdump_install_net "$tgt_ipaddr"
# prepare netroot= command line
# FIXME: Do we need to parse and set other parameters like protocol, port
commit 18ee888eab917cc1eb935f075a9b917e136a15f2
Author: Kairui Song <kasong(a)redhat.com>
Date: Fri Oct 18 14:10:15 2019 +0800
mkdumprd: ensure ssh path exists before check size
check_size checks if the specified dump path on the ssh target have
enough space. And if the path doesn't exits, it will fail and exit.
mkdir_save_path_ssh should be called first to check if the path
exists, and create the path if it doesn't exits, so the size check
can always work properly.
Signed-off-by: Kairui Song <kasong(a)redhat.com>
Acked-by: Pingfan Liu <piliu(a)redhat.com>
diff --git a/mkdumprd b/mkdumprd
index 50472a9..aafd808 100644
--- a/mkdumprd
+++ b/mkdumprd
@@ -429,10 +429,10 @@ do
ssh)
if strstr "$config_val" "@";
then
- check_size ssh $config_val
mkdir_save_path_ssh $config_val
+ check_size ssh $config_val
add_dracut_module "ssh-client"
- add_dracut_sshkey "$SSH_KEY_LOCATION"
+ add_dracut_sshkey "$SSH_KEY_LOCATION"
else
perror_exit "Bad ssh dump target $config_val"
fi
commit 882b920c2f36b85817fdb3e621f9a0c29c9eeb91
Author: Pingfan Liu <piliu(a)redhat.com>
Date: Tue Oct 22 16:03:57 2019 +0800
module-setup: re-fix 99kdumpbase network dependency
In commit a431a7e354b (module-setup: fix 99kdumpbase network dependency),
the statement for OR operation is still wrong.
The OR condition statement should be: if a || b
Signed-off-by: Pingfan Liu <piliu(a)redhat.com>
Acked-by: Kairui Song <kasong(a)redhat.com>
diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh
index b186b38..74c2f48 100755
--- a/dracut-module-setup.sh
+++ b/dracut-module-setup.sh
@@ -40,7 +40,7 @@ depends() {
_dep="$_dep drm"
fi
- if is_generic_fence_kdump -o is_pcs_fence_kdump; then
+ if is_generic_fence_kdump || is_pcs_fence_kdump; then
_dep="$_dep network"
fi
commit 72ed97683fd46dbe1185ddc029698e5cc6477357
Author: Pingfan Liu <piliu(a)redhat.com>
Date: Thu Oct 17 14:01:14 2019 +0800
kdumpctl: bail out immediately if host key verification failed
In kdump.conf, if sshkey points to an invalid ssh key, 'kdumpctl restart'
can bail out immediately instead of retry.
Signed-off-by: Pingfan Liu <piliu(a)redhat.com>
Acked-by: Kairui Song <kasong(a)redhat.com>
diff --git a/kdumpctl b/kdumpctl
index dc0c64b..048e9f5 100755
--- a/kdumpctl
+++ b/kdumpctl
@@ -755,7 +755,7 @@ check_and_wait_network_ready()
fi
# if server removes the authorized_keys or, no /root/.ssh/kdump_id_rsa
- echo $errmsg | grep -q "Permission denied\|No such file or directory"
+ echo $errmsg | grep -q "Permission denied\|No such file or directory\|Host key verification failed"
if [ $? -eq 0 ]; then
echo "Could not create $DUMP_TARGET:$SAVE_PATH, you probably need to run \"kdumpctl propagate\"" >&2
return 1
commit e7a207d166633dc80ba1e499f0b0516d9088a9a2
Author: Kairui Song <kasong(a)redhat.com>
Date: Tue Oct 15 13:54:11 2019 +0800
Release 2.0.20-5
Signed-off-by: Kairui Song <kasong(a)redhat.com>
diff --git a/kexec-tools.spec b/kexec-tools.spec
index 6f05e21..2881615 100644
--- a/kexec-tools.spec
+++ b/kexec-tools.spec
@@ -4,7 +4,7 @@
Name: kexec-tools
Version: 2.0.20
-Release: 4%{?dist}
+Release: 5%{?dist}
License: GPLv2
Summary: The kexec/kdump userspace component
@@ -349,6 +349,11 @@ done
%endif
%changelog
+* Tue Oct 15 2019 Kairui Song <kasong(a)redhat.com> - 2.0.20-5
+- Don't mount the dump target unless needed
+- kdump-lib: strip grub device from kdump_bootdir
+- Add systemd-udev require.
+
* Tue Sep 24 2019 Kairui Song <kasong(a)redhat.com> - 2.0.20-4
- kdumpctl: echo msg when waiting for connection
- makedumpfile: Fix inconsistent return value from find_vmemmap()
commit 6dee286467e5a697d25148712a110da1a720ac96
Author: Kairui Song <kasong(a)redhat.com>
Date: Fri Sep 27 18:17:32 2019 +0800
Don't mount the dump target unless needed
For fadump, this helps to reduce the risk of boot failure, and
may also help speed up the boot by a bit.
For normal kdump, this will delay the dump target mounting, and no
longer depend on systemd to do the mounting job.
And currently there is a failure that caused by some mount handling
bug with kernel and systemd that is failing the system booting:
[FAILED] Failed to mount /kdumproot/home.
See 'systemctl status kdumproot-home.mount' for details.
[DEPEND] Dependency failed for Local File Systems.
[ OK ] Reached target Remote File Systems (Pre).
[ OK ] Reached target Remote File Systems.
Starting udev Coldplug all Devices...
Starting Create Volatile Files and Directories...
Starting Kdump Emergency...
This patch can bypass it. The fix of root cause is still WIP, but this
patch itself is a nice to have optimization so it's reasonable to do so.
Signed-off-by: Kairui Song <kasong(a)redhat.com>
Acked-by: Pingfan Liu <piliu(a)redhat.com>
diff --git a/kdump-lib-initramfs.sh b/kdump-lib-initramfs.sh
index 608dc6e..c409dce 100755
--- a/kdump-lib-initramfs.sh
+++ b/kdump-lib-initramfs.sh
@@ -96,16 +96,31 @@ get_kdump_confs()
# dump_fs <mount point| device>
dump_fs()
{
-
+ local _do_umount=""
local _dev=$(findmnt -k -f -n -r -o SOURCE $1)
local _mp=$(findmnt -k -f -n -r -o TARGET $1)
local _op=$(findmnt -k -f -n -r -o OPTIONS $1)
- echo "kdump: dump target is $_dev"
-
if [ -z "$_mp" ]; then
- echo "kdump: error: Dump target $_dev is not mounted."
- return 1
+ _dev=$(findmnt -s -f -n -r -o SOURCE $1)
+ _mp=$(findmnt -s -f -n -r -o TARGET $1)
+ _op=$(findmnt -s -f -n -r -o OPTIONS $1)
+
+ if [ -n "$_dev" ] && [ -n "$_mp" ]; then
+ echo "kdump: dump target $_dev is not mounted, trying to mount..."
+ mkdir -p $_mp
+ mount -o $_op $_dev $_mp
+
+ if [ $? -ne 0 ]; then
+ echo "kdump: mounting failed (mount point: $_mp, option: $_op)"
+ return 1
+ fi
+ _do_umount=1
+ else
+ echo "kdump: error: Dump target $_dev is not usable"
+ fi
+ else
+ echo "kdump: dump target is $_dev"
fi
# Remove -F in makedumpfile case. We don't want a flat format dump here.
@@ -129,6 +144,11 @@ dump_fs()
sync
echo "kdump: saving vmcore complete"
+
+ if [ $_do_umount ]; then
+ umount $_mp || echo "kdump: warn: failed to umount target"
+ fi
+
# improper kernel cmdline can cause the failure of echo, we can ignore this kind of failure
return 0
}
diff --git a/mkdumprd b/mkdumprd
index cf3533f..50472a9 100644
--- a/mkdumprd
+++ b/mkdumprd
@@ -108,12 +108,13 @@ to_mount() {
fi
# mount fs target as rw in 2nd kernel
_options=$(echo $_options | sed 's/\(^\|,\)ro\($\|,\)/\1rw\2/g')
- # with 'noauto' in fstab nfs and non-root disk mount will fail in 2nd
- # kernel, filter it out here.
+ # filter out 'noauto' here, it will be force appended later, avoid duplication
_options=$(echo $_options | sed 's/\(^\|,\)noauto\($\|,\)/\1/g')
# drop nofail or nobootwait
_options=$(echo $_options | sed 's/\(^\|,\)nofail\($\|,\)/\1/g')
_options=$(echo $_options | sed 's/\(^\|,\)nobootwait\($\|,\)/\1/g')
+ # only mount the dump target when needed.
+ _options="$_options,noauto"
_mntopts="$_target $_fstype $_options"
#for non-nfs _dev converting to use udev persistent name
commit 367ca85d1fdbc4b7ce0998f65342399d59038e5f
Merge: 0221666 4714c7c
Author: Kairui Song <kasong(a)redhat.com>
Date: Wed Sep 25 02:40:45 2019 +0000
Merge #3 `kdump-lib: strip grub device from kdump_bootdir`
commit 022166630f213e021b913a4c9a58cd23b41f8d99
Merge: e31d5ba c4a2ecb
Author: Kairui Song <kasong(a)redhat.com>
Date: Wed Sep 25 02:40:35 2019 +0000
Merge #2 `Add systemd-udev require.`
commit 4714c7c8a3654ab98cb2b7464e1ec297a8550e58
Author: Yuval Turgeman <yturgema(a)redhat.com>
Date: Tue Sep 24 12:19:43 2019 +0300
kdump-lib: strip grub device from kdump_bootdir
When trying to setup kdump for fedora-coreos, kdumpctl start fails to
find the correct boot directory since BOOT_IMAGE start with the grub
device name
Signed-off-by: Yuval Turgeman <yturgema(a)redhat.com>
diff --git a/kdump-lib.sh b/kdump-lib.sh
index 4feb7d0..f393c76 100755
--- a/kdump-lib.sh
+++ b/kdump-lib.sh
@@ -667,7 +667,7 @@ check_boot_dir()
kdump_bootdir="/boot"
else
eval $(cat /proc/cmdline| grep "BOOT_IMAGE" | cut -d' ' -f1)
- kdump_bootdir="/boot"$(dirname $BOOT_IMAGE)
+ kdump_bootdir="/boot"$(dirname ${BOOT_IMAGE#*)})
fi
echo $kdump_bootdir
}
commit e31d5baf5955b7c7b670295a1df61a03cbfd5d32
Author: Kairui Song <kasong(a)redhat.com>
Date: Tue Sep 24 14:57:59 2019 +0800
Release 2.0.20-4
Signed-off-by: Kairui Song <kasong(a)redhat.com>
diff --git a/kexec-tools.spec b/kexec-tools.spec
index a4c3b9c..36b15b8 100644
--- a/kexec-tools.spec
+++ b/kexec-tools.spec
@@ -4,7 +4,7 @@
Name: kexec-tools
Version: 2.0.20
-Release: 3%{?dist}
+Release: 4%{?dist}
License: GPLv2
Summary: The kexec/kdump userspace component
@@ -345,6 +345,18 @@ done
%endif
%changelog
+* Tue Sep 24 2019 Kairui Song <kasong(a)redhat.com> - 2.0.20-4
+- kdumpctl: echo msg when waiting for connection
+- makedumpfile: Fix inconsistent return value from find_vmemmap()
+- makedumpfile: Fix exclusion range in find_vmemmap_pages()
+- makedumpfile: x86_64: Fix incorrect exclusion by -e option with KASLR
+- kdumpctl: distinguish the failed reason of ssh
+- kexec-kdump-howto.txt: Add notes about device dump
+- Disable device dump by default
+- dracut-module-setup: fix bond ifcfg processing
+- dracut-module-setup: filter out localhost for generic_fence_kdump
+- dracut-module-setup: get localhost alias by manual
+
* Mon Aug 12 2019 Kairui Song <kasong(a)redhat.com> - 2.0.20-3
- kdumpctl: wait a while for network ready if dump target is ssh
- makedumpfile: Increase SECTION_MAP_LAST_BIT to 4
commit e07fc3e071cb2ce5a71ee60c341b4d26a68e600a
Author: Pingfan Liu <piliu(a)redhat.com>
Date: Tue Sep 24 11:19:12 2019 +0800
kdumpctl: echo msg when waiting for connection
Print some message during the long wait period to reflect the process.
The message will look like:
Network dump target is not usable, waiting for it to be ready
...
Signed-off-by: Pingfan Liu <piliu(a)redhat.com>
Acked-by: Kairui Song <kasong(a)redhat.com>
diff --git a/kdumpctl b/kdumpctl
index f75b820..dc0c64b 100755
--- a/kdumpctl
+++ b/kdumpctl
@@ -736,6 +736,7 @@ check_ssh_config()
check_and_wait_network_ready()
{
local start_time=$(date +%s)
+ local warn_once=1
local cur
local diff
local retval
@@ -760,6 +761,12 @@ check_and_wait_network_ready()
return 1
fi
+ if [ $warn_once -eq 1 ]; then
+ echo "Network dump target is not usable, waiting for it to be ready"
+ warn_once=0
+ fi
+ echo -n .
+
cur=$(date +%s)
let "diff = $cur - $start_time"
# 60s time out
commit a0db00d575a0f92ca143e79697158669e22714f1
Author: Kazuhito Hagio <k-hagio(a)ab.jp.nec.com>
Date: Mon Sep 9 16:55:17 2019 -0400
makedumpfile: Fix inconsistent return value from find_vmemmap()
Backport from the makedumpfile devel branch in upstream.
commit 8425342a52b23d462f10bceeeb1c8a3a43d56bf0
Author: Kazuhito Hagio <k-hagio(a)ab.jp.nec.com>
Date: Fri Sep 6 09:50:34 2019 -0400
[PATCH] Fix inconsistent return value from find_vmemmap()
When -e option is given, the find_vmemmap() returns FAILED(1) if
it failed on x86_64, but on architectures other than that, it is
stub_false() and returns FALSE(0).
if (info->flag_excludevm) {
if (find_vmemmap() == FAILED) {
ERRMSG("Can't find vmemmap pages\n");
#define find_vmemmap() stub_false()
As a result, on the architectures other than x86_64, the -e option
does some unnecessary processing with no effect, and marks the dump
DUMP_DH_EXCLUDED_VMEMMAP unexpectedly.
Also, the functions for the -e option return COMPLETED or FAILED,
which are for command return value, not for function return value.
So let's fix the issue by following the common style that returns
TRUE or FALSE, and avoid confusion.
Signed-off-by: Kazuhito Hagio <k-hagio(a)ab.jp.nec.com>
Signed-off-by: Kazuhito Hagio <k-hagio(a)ab.jp.nec.com>
Acked-by: Kairui Song <kasong(a)redhat.com>
diff --git a/kexec-tools-2.0.20-makedumpfile-Fix-inconsistent-return-value-from-find_vmemmap.patch b/kexec-tools-2.0.20-makedumpfile-Fix-inconsistent-return-value-from-find_vmemmap.patch
new file mode 100644
index 0000000..61cbda0
--- /dev/null
+++ b/kexec-tools-2.0.20-makedumpfile-Fix-inconsistent-return-value-from-find_vmemmap.patch
@@ -0,0 +1,327 @@
+From 8425342a52b23d462f10bceeeb1c8a3a43d56bf0 Mon Sep 17 00:00:00 2001
+From: Kazuhito Hagio <k-hagio(a)ab.jp.nec.com>
+Date: Fri, 6 Sep 2019 09:50:34 -0400
+Subject: [PATCH] Fix inconsistent return value from find_vmemmap()
+
+When -e option is given, the find_vmemmap() returns FAILED(1) if
+it failed on x86_64, but on architectures other than that, it is
+stub_false() and returns FALSE(0).
+
+ if (info->flag_excludevm) {
+ if (find_vmemmap() == FAILED) {
+ ERRMSG("Can't find vmemmap pages\n");
+
+ #define find_vmemmap() stub_false()
+
+As a result, on the architectures other than x86_64, the -e option
+does some unnecessary processing with no effect, and marks the dump
+DUMP_DH_EXCLUDED_VMEMMAP unexpectedly.
+
+Also, the functions for the -e option return COMPLETED or FAILED,
+which are for command return value, not for function return value.
+
+So let's fix the issue by following the common style that returns
+TRUE or FALSE, and avoid confusion.
+
+Signed-off-by: Kazuhito Hagio <k-hagio(a)ab.jp.nec.com>
+---
+ arch/x86_64.c | 12 ++++-----
+ makedumpfile.c | 70 ++++++++++++++++++++++++--------------------------
+ 2 files changed, 40 insertions(+), 42 deletions(-)
+
+diff --git a/makedumpfile-1.6.6/arch/x86_64.c b/makedumpfile-1.6.6/arch/x86_64.c
+index 4eeaf4925f43..876644f932be 100644
+--- a/makedumpfile-1.6.6/arch/x86_64.c
++++ b/makedumpfile-1.6.6/arch/x86_64.c
+@@ -673,7 +673,7 @@ find_vmemmap_x86_64()
+
+ if (init_level4_pgt == NOT_FOUND_SYMBOL) {
+ ERRMSG("init_level4_pgt/init_top_pgt not found\n");
+- return FAILED;
++ return FALSE;
+ }
+
+ if (NUMBER(sme_mask) != NOT_FOUND_NUMBER)
+@@ -715,7 +715,7 @@ find_vmemmap_x86_64()
+ if (!readmem(PADDR, (unsigned long long)pgdp, (void *)&pud_addr,
+ sizeof(unsigned long))) {
+ ERRMSG("Can't get pgd entry for slot %d.\n", pgd_index);
+- return FAILED;
++ return FALSE;
+ }
+
+ /* mask the pgd entry for the address of the pud page */
+@@ -726,7 +726,7 @@ find_vmemmap_x86_64()
+ if (!readmem(PADDR, (unsigned long long)pud_addr, (void *)pud_page,
+ PTRS_PER_PUD * sizeof(unsigned long))) {
+ ERRMSG("Can't get pud entry for pgd slot %ld.\n", pgdindex);
+- return FAILED;
++ return FALSE;
+ }
+ /* step thru each pmd address in the pud page */
+ /* pudp points to an entry in the pud page */
+@@ -739,7 +739,7 @@ find_vmemmap_x86_64()
+ if (!readmem(PADDR, pmd_addr, (void *)pmd_page,
+ PTRS_PER_PMD * sizeof(unsigned long))) {
+ ERRMSG("Can't get pud entry for slot %ld.\n", pudindex);
+- return FAILED;
++ return FALSE;
+ }
+ /* pmdp points to an entry in the pmd */
+ for (pmdp = (unsigned long *)pmd_page, pmdindex = 0;
+@@ -815,7 +815,7 @@ find_vmemmap_x86_64()
+ num_pmds_valid++;
+ if (!(pmd & _PAGE_PSE)) {
+ printf("vmemmap pmd not huge, abort\n");
+- return FAILED;
++ return FALSE;
+ }
+ } else {
+ if (last_valid) {
+@@ -947,7 +947,7 @@ find_vmemmap_x86_64()
+ i++;
+ } while (cur != vmaphead);
+ nr_gvmem_pfns = i;
+- return COMPLETED;
++ return TRUE;
+ }
+
+ #endif /* x86_64 */
+diff --git a/makedumpfile-1.6.6/makedumpfile.c b/makedumpfile-1.6.6/makedumpfile.c
+index 37df77d181dd..af4db3c006c9 100644
+--- a/makedumpfile-1.6.6/makedumpfile.c
++++ b/makedumpfile-1.6.6/makedumpfile.c
+@@ -6213,20 +6213,20 @@ init_save_control()
+ flags = O_RDWR|O_CREAT|O_TRUNC;
+ if ((sc.sc_fd = open(sc.sc_filename, flags, S_IRUSR|S_IWUSR)) < 0) {
+ ERRMSG("Can't open the pfn file %s.\n", sc.sc_filename);
+- return FAILED;
++ return FALSE;
+ }
+ unlink(sc.sc_filename);
+
+ sc.sc_buf = malloc(info->page_size);
+ if (!sc.sc_buf) {
+ ERRMSG("Can't allocate a page for pfn buf.\n");
+- return FAILED;
++ return FALSE;
+ }
+ sc.sc_buflen = info->page_size;
+ sc.sc_bufposition = 0;
+ sc.sc_fileposition = 0;
+ sc.sc_filelen = 0;
+- return COMPLETED;
++ return TRUE;
+ }
+
+ /*
+@@ -6243,7 +6243,7 @@ save_deletes(unsigned long startpfn, unsigned long numpfns)
+ if (i != sc.sc_buflen) {
+ ERRMSG("save: Can't write a page to %s\n",
+ sc.sc_filename);
+- return FAILED;
++ return FALSE;
+ }
+ sc.sc_filelen += sc.sc_buflen;
+ sc.sc_bufposition = 0;
+@@ -6252,12 +6252,12 @@ save_deletes(unsigned long startpfn, unsigned long numpfns)
+ scp->startpfn = startpfn;
+ scp->numpfns = numpfns;
+ sc.sc_bufposition += sizeof(struct sc_entry);
+- return COMPLETED;
++ return TRUE;
+ }
+
+ /*
+ * Get a starting pfn and number of pfns for delete from bitmap.
+- * Return 0 for success, 1 for 'no more'
++ * Return TRUE(1) for success, FALSE(0) for 'no more'
+ */
+ int
+ get_deletes(unsigned long *startpfn, unsigned long *numpfns)
+@@ -6266,14 +6266,14 @@ get_deletes(unsigned long *startpfn, unsigned long *numpfns)
+ struct sc_entry *scp;
+
+ if (sc.sc_fileposition >= sc.sc_filelen) {
+- return FAILED;
++ return FALSE;
+ }
+
+ if (sc.sc_bufposition == sc.sc_buflen) {
+ i = read(sc.sc_fd, sc.sc_buf, sc.sc_buflen);
+ if (i <= 0) {
+ ERRMSG("Can't read a page from %s.\n", sc.sc_filename);
+- return FAILED;
++ return FALSE;
+ }
+ sc.sc_bufposition = 0;
+ }
+@@ -6282,7 +6282,7 @@ get_deletes(unsigned long *startpfn, unsigned long *numpfns)
+ *numpfns = scp->numpfns;
+ sc.sc_bufposition += sizeof(struct sc_entry);
+ sc.sc_fileposition += sizeof(struct sc_entry);
+- return COMPLETED;
++ return TRUE;
+ }
+
+ /*
+@@ -6290,7 +6290,7 @@ get_deletes(unsigned long *startpfn, unsigned long *numpfns)
+ * that represent them.
+ * (pfn ranges are literally start and end, not start and end+1)
+ * see the array of vmemmap pfns and the pfns they represent: gvmem_pfns
+- * Return COMPLETED for delete, FAILED for not to delete.
++ * Return TRUE(1) for delete, FALSE(0) for not to delete.
+ */
+ int
+ find_vmemmap_pages(unsigned long startpfn, unsigned long endpfn, unsigned long *vmappfn,
+@@ -6323,12 +6323,12 @@ find_vmemmap_pages(unsigned long startpfn, unsigned long endpfn, unsigned long *
+ end_vmemmap_pfn = vmapp->vmap_pfn_start + vmemmap_pfns;
+ npages = end_vmemmap_pfn - start_vmemmap_pfn;
+ if (npages == 0)
+- return FAILED;
++ return FALSE;
+ *nmapnpfns = npages;
+- return COMPLETED;
++ return TRUE;
+ }
+ }
+- return FAILED;
++ return FALSE;
+ }
+
+ /*
+@@ -6359,12 +6359,12 @@ find_unused_vmemmap_pages(void)
+ if (lseek(bitmap1->fd, new_offset1, SEEK_SET) < 0 ) {
+ ERRMSG("Can't seek the bitmap(%s). %s\n",
+ bitmap1->file_name, strerror(errno));
+- return FAILED;
++ return FALSE;
+ }
+ if (read(bitmap1->fd, bitmap1->buf, BUFSIZE_BITMAP) != BUFSIZE_BITMAP) {
+ ERRMSG("Can't read the bitmap(%s). %s\n",
+ bitmap1->file_name, strerror(errno));
+- return FAILED;
++ return FALSE;
+ }
+ bitmap1->no_block = pfn / PFN_BUFBITMAP;
+
+@@ -6372,12 +6372,12 @@ find_unused_vmemmap_pages(void)
+ if (lseek(bitmap2->fd, new_offset2, SEEK_SET) < 0 ) {
+ ERRMSG("Can't seek the bitmap(%s). %s\n",
+ bitmap2->file_name, strerror(errno));
+- return FAILED;
++ return FALSE;
+ }
+ if (read(bitmap2->fd, bitmap2->buf, BUFSIZE_BITMAP) != BUFSIZE_BITMAP) {
+ ERRMSG("Can't read the bitmap(%s). %s\n",
+ bitmap2->file_name, strerror(errno));
+- return FAILED;
++ return FALSE;
+ }
+ bitmap2->no_block = pfn / PFN_BUFBITMAP;
+
+@@ -6422,12 +6422,11 @@ find_unused_vmemmap_pages(void)
+ endpfn = startpfn +
+ (numwords * BITS_PER_WORD) - 1;
+ if (find_vmemmap_pages(startpfn, endpfn,
+- &vmapstartpfn, &vmapnumpfns) ==
+- COMPLETED) {
+- if (save_deletes(vmapstartpfn,
+- vmapnumpfns) == FAILED) {
++ &vmapstartpfn, &vmapnumpfns)) {
++ if (!save_deletes(vmapstartpfn,
++ vmapnumpfns)) {
+ ERRMSG("save_deletes failed\n");
+- return FAILED;
++ return FALSE;
+ }
+ deleted_pages += vmapnumpfns;
+ }
+@@ -6444,11 +6443,10 @@ find_unused_vmemmap_pages(void)
+ not start and end + 1 */
+ endpfn = startpfn + (numwords * BITS_PER_WORD) - 1;
+ if (find_vmemmap_pages(startpfn, endpfn,
+- &vmapstartpfn, &vmapnumpfns) == COMPLETED) {
+- if (save_deletes(vmapstartpfn, vmapnumpfns)
+- == FAILED) {
++ &vmapstartpfn, &vmapnumpfns)) {
++ if (!save_deletes(vmapstartpfn, vmapnumpfns)) {
+ ERRMSG("save_deletes failed\n");
+- return FAILED;
++ return FALSE;
+ }
+ deleted_pages += vmapnumpfns;
+ }
+@@ -6457,7 +6455,7 @@ find_unused_vmemmap_pages(void)
+ }
+ PROGRESS_MSG("\nExcluded %ld unused vmemmap pages\n", deleted_pages);
+
+- return COMPLETED;
++ return TRUE;
+ }
+
+ /*
+@@ -6468,7 +6466,7 @@ delete_unused_vmemmap_pages(void)
+ {
+ unsigned long startpfn, numpfns, pfn, i;
+
+- while (get_deletes(&startpfn, &numpfns) == COMPLETED) {
++ while (get_deletes(&startpfn, &numpfns)) {
+ for (i = 0, pfn = startpfn; i < numpfns; i++, pfn++) {
+ clear_bit_on_2nd_bitmap_for_kernel(pfn, (struct cycle *)0);
+ // note that this is never to be used in cyclic mode!
+@@ -6496,23 +6494,23 @@ reset_save_control()
+ {
+ int i;
+ if (sc.sc_bufposition == 0)
+- return COMPLETED;
++ return TRUE;
+
+ i = write(sc.sc_fd, sc.sc_buf, sc.sc_buflen);
+ if (i != sc.sc_buflen) {
+ ERRMSG("reset: Can't write a page to %s\n",
+ sc.sc_filename);
+- return FAILED;
++ return FALSE;
+ }
+ sc.sc_filelen += sc.sc_bufposition;
+
+ if (lseek(sc.sc_fd, 0, SEEK_SET) < 0) {
+ ERRMSG("Can't seek the pfn file %s).", sc.sc_filename);
+- return FAILED;
++ return FALSE;
+ }
+ sc.sc_fileposition = 0;
+ sc.sc_bufposition = sc.sc_buflen; /* trigger 1st read */
+- return COMPLETED;
++ return TRUE;
+ }
+
+ int
+@@ -6602,11 +6600,11 @@ create_2nd_bitmap(struct cycle *cycle)
+
+ /* --exclude-unused-vm means exclude vmemmap page structures for unused pages */
+ if (info->flag_excludevm) {
+- if (init_save_control() == FAILED)
++ if (!init_save_control())
+ return FALSE;
+- if (find_unused_vmemmap_pages() == FAILED)
++ if (!find_unused_vmemmap_pages())
+ return FALSE;
+- if (reset_save_control() == FAILED)
++ if (!reset_save_control())
+ return FALSE;
+ delete_unused_vmemmap_pages();
+ finalize_save_control();
+@@ -10095,7 +10093,7 @@ create_dumpfile(void)
+
+ /* create an array of translations from pfn to vmemmap pages */
+ if (info->flag_excludevm) {
+- if (find_vmemmap() == FAILED) {
++ if (!find_vmemmap()) {
+ ERRMSG("Can't find vmemmap pages\n");
+ info->flag_excludevm = 0;
+ }
+--
+2.18.1
+
diff --git a/kexec-tools.spec b/kexec-tools.spec
index 4d356ad..a4c3b9c 100644
--- a/kexec-tools.spec
+++ b/kexec-tools.spec
@@ -96,6 +96,7 @@ Patch102: kexec-tools-2.0.20-makedumpfile-Fix-exclusion-range-in-find_vmemmap_pa
#
Patch601: kexec-tools-2.0.20-makedumpfile-Do-not-proceed-when-get_num_dumpable_cyclic-fails.patch
Patch602: kexec-tools-2.0.20-makedumpfile-Increase-SECTION_MAP_LAST_BIT-to-4.patch
+Patch603: kexec-tools-2.0.20-makedumpfile-Fix-inconsistent-return-value-from-find_vmemmap.patch
%description
kexec-tools provides /sbin/kexec binary that facilitates a new
@@ -116,6 +117,7 @@ tar -z -x -v -f %{SOURCE19}
%patch602 -p1
%patch101 -p1
%patch102 -p1
+%patch603 -p1
%ifarch ppc
%define archdef ARCH=ppc
commit bdd3061883174d861d85edb267b40ad2466fabb1
Author: Kazuhito Hagio <k-hagio(a)ab.jp.nec.com>
Date: Mon Sep 9 16:55:16 2019 -0400
makedumpfile: Fix exclusion range in find_vmemmap_pages()
Backport from the makedumpfile devel branch in upstream.
commit b461971bfac0f193a0c274c3b657d158e07d4995
Author: Kazuhito Hagio <k-hagio(a)ab.jp.nec.com>
Date: Thu Aug 29 14:51:56 2019 -0400
[PATCH] Fix exclusion range in find_vmemmap_pages()
In the function, since pfn ranges are literally start and end, not start
and end+1, if the struct page of endpfn is at the last in a vmemmap page,
the vmemmap page is dropped by the following code, and not excluded.
npfns_offset = endpfn - vmapp->rep_pfn_start;
vmemmap_offset = npfns_offset * size_table.page;
// round down to page boundary
vmemmap_offset -= (vmemmap_offset % pagesize);
We can use (endpfn+1) here to fix.
Signed-off-by: Kazuhito Hagio <k-hagio(a)ab.jp.nec.com>
Signed-off-by: Kazuhito Hagio <k-hagio(a)ab.jp.nec.com>
Acked-by: Kairui Song <kasong(a)redhat.com>
diff --git a/kexec-tools-2.0.20-makedumpfile-Fix-exclusion-range-in-find_vmemmap_pages.patch b/kexec-tools-2.0.20-makedumpfile-Fix-exclusion-range-in-find_vmemmap_pages.patch
new file mode 100644
index 0000000..2c94711
--- /dev/null
+++ b/kexec-tools-2.0.20-makedumpfile-Fix-exclusion-range-in-find_vmemmap_pages.patch
@@ -0,0 +1,37 @@
+From b461971bfac0f193a0c274c3b657d158e07d4995 Mon Sep 17 00:00:00 2001
+From: Kazuhito Hagio <k-hagio(a)ab.jp.nec.com>
+Date: Thu, 29 Aug 2019 14:51:56 -0400
+Subject: [PATCH] Fix exclusion range in find_vmemmap_pages()
+
+In the function, since pfn ranges are literally start and end, not start
+and end+1, if the struct page of endpfn is at the last in a vmemmap page,
+the vmemmap page is dropped by the following code, and not excluded.
+
+ npfns_offset = endpfn - vmapp->rep_pfn_start;
+ vmemmap_offset = npfns_offset * size_table.page;
+ // round down to page boundary
+ vmemmap_offset -= (vmemmap_offset % pagesize);
+
+We can use (endpfn+1) here to fix.
+
+Signed-off-by: Kazuhito Hagio <k-hagio(a)ab.jp.nec.com>
+---
+ makedumpfile.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/makedumpfile-1.6.6/makedumpfile.c b/makedumpfile-1.6.6/makedumpfile.c
+index 88df788..37df77d 100644
+--- a/makedumpfile-1.6.6/makedumpfile.c
++++ b/makedumpfile-1.6.6/makedumpfile.c
+@@ -6315,7 +6315,7 @@ find_vmemmap_pages(unsigned long startpfn, unsigned long endpfn, unsigned long *
+ start_vmemmap_pfn = vmapp->vmap_pfn_start + vmemmap_pfns;
+ *vmappfn = start_vmemmap_pfn;
+
+- npfns_offset = endpfn - vmapp->rep_pfn_start;
++ npfns_offset = (endpfn+1) - vmapp->rep_pfn_start;
+ vmemmap_offset = npfns_offset * size_table.page;
+ // round down to page boundary
+ vmemmap_offset -= (vmemmap_offset % pagesize);
+--
+2.20.1
+
diff --git a/kexec-tools.spec b/kexec-tools.spec
index 3fd41a7..4d356ad 100644
--- a/kexec-tools.spec
+++ b/kexec-tools.spec
@@ -78,6 +78,7 @@ Patch0: kexec-tools-2.0.20-fix-broken-multiboot2-buliding-for-i386.patch
# Patches 101 through 200 are meant for x86_64 kexec-tools enablement
#
Patch101: kexec-tools-2.0.20-makedumpfile-x86_64-Fix-incorrect-exclusion-by-e-option.patch
+Patch102: kexec-tools-2.0.20-makedumpfile-Fix-exclusion-range-in-find_vmemmap_pages.patch
#
# Patches 301 through 400 are meant for ppc64 kexec-tools enablement
@@ -114,6 +115,7 @@ tar -z -x -v -f %{SOURCE19}
%patch601 -p1
%patch602 -p1
%patch101 -p1
+%patch102 -p1
%ifarch ppc
%define archdef ARCH=ppc
commit 68f9e69a1693466e8535dcc8945826470c742439
Author: Kazuhito Hagio <k-hagio(a)ab.jp.nec.com>
Date: Mon Sep 9 16:55:15 2019 -0400
makedumpfile: x86_64: Fix incorrect exclusion by -e option with KASLR
Backport from the makedumpfile devel branch in upstream.
commit aa5ab4cf6c7335392094577380d2eaee8a0a8d52
Author: Kazuhito Hagio <k-hagio(a)ab.jp.nec.com>
Date: Thu Aug 29 12:26:34 2019 -0400
[PATCH] x86_64: Fix incorrect exclusion by -e option with KASLR
The -e option uses info->vmemmap_start for creating a table to determine
the positions of page structures that should be excluded, but it is a
hardcoded value even with KASLR-enabled vmcore. As a result, the option
excludes incorrect pages from it.
To fix this, get the vmemmap start address from info->mem_map_data.
Signed-off-by: Kazuhito Hagio <k-hagio(a)ab.jp.nec.com>
Signed-off-by: Kazuhito Hagio <k-hagio(a)ab.jp.nec.com>
Acked-by: Kairui Song <kasong(a)redhat.com>
diff --git a/kexec-tools-2.0.20-makedumpfile-x86_64-Fix-incorrect-exclusion-by-e-option.patch b/kexec-tools-2.0.20-makedumpfile-x86_64-Fix-incorrect-exclusion-by-e-option.patch
new file mode 100644
index 0000000..fa60b6a
--- /dev/null
+++ b/kexec-tools-2.0.20-makedumpfile-x86_64-Fix-incorrect-exclusion-by-e-option.patch
@@ -0,0 +1,41 @@
+From aa5ab4cf6c7335392094577380d2eaee8a0a8d52 Mon Sep 17 00:00:00 2001
+From: Kazuhito Hagio <k-hagio(a)ab.jp.nec.com>
+Date: Thu, 29 Aug 2019 12:26:34 -0400
+Subject: [PATCH] x86_64: Fix incorrect exclusion by -e option with KASLR
+
+The -e option uses info->vmemmap_start for creating a table to determine
+the positions of page structures that should be excluded, but it is a
+hardcoded value even with KASLR-enabled vmcore. As a result, the option
+excludes incorrect pages from it.
+
+To fix this, get the vmemmap start address from info->mem_map_data.
+
+Signed-off-by: Kazuhito Hagio <k-hagio(a)ab.jp.nec.com>
+---
+ arch/x86_64.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+diff --git a/makedumpfile-1.6.6/arch/x86_64.c b/makedumpfile-1.6.6/arch/x86_64.c
+index 3c0fdc5..4eeaf49 100644
+--- a/makedumpfile-1.6.6/arch/x86_64.c
++++ b/makedumpfile-1.6.6/arch/x86_64.c
+@@ -679,6 +679,16 @@ find_vmemmap_x86_64()
+ if (NUMBER(sme_mask) != NOT_FOUND_NUMBER)
+ pmask &= ~(NUMBER(sme_mask));
+
++ /*
++ * vmemmap region can be randomized by KASLR.
++ * (currently we don't utilize info->vmemmap_end on x86_64.)
++ *
++ if (info->mem_map_data &&
++ info->mem_map_data[0].mem_map != NOT_MEMMAP_ADDR)
++ info->vmemmap_start = info->mem_map_data[0].mem_map;
++
++ DEBUG_MSG("vmemmap_start: %16lx\n", info->vmemmap_start);
++
+ pagestructsize = size_table.page;
+ hugepagesize = PTRS_PER_PMD * info->page_size;
+ vaddr_base = info->vmemmap_start;
+--
+2.20.1
+
diff --git a/kexec-tools.spec b/kexec-tools.spec
index 71898da..3fd41a7 100644
--- a/kexec-tools.spec
+++ b/kexec-tools.spec
@@ -77,6 +77,7 @@ Patch0: kexec-tools-2.0.20-fix-broken-multiboot2-buliding-for-i386.patch
#
# Patches 101 through 200 are meant for x86_64 kexec-tools enablement
#
+Patch101: kexec-tools-2.0.20-makedumpfile-x86_64-Fix-incorrect-exclusion-by-e-option.patch
#
# Patches 301 through 400 are meant for ppc64 kexec-tools enablement
@@ -112,6 +113,7 @@ tar -z -x -v -f %{SOURCE19}
%patch0 -p1
%patch601 -p1
%patch602 -p1
+%patch101 -p1
%ifarch ppc
%define archdef ARCH=ppc
commit 680c0d3414a81066027cc0d9da643c107915a689
Author: Pingfan Liu <piliu(a)redhat.com>
Date: Wed Aug 28 15:22:22 2019 +0800
kdumpctl: distinguish the failed reason of ssh
On a host with ipaddr not ready before kdump service, ssh return errno 255.
While if no ssh-key, ssh also return errno 255. For both of cases, the
current kdump code promote user to run 'kdumpctl propagate'. This confuses
user who already installs ssh-key.
In order to tell these two cases from each other, the ssh warning message
should be involved, and parsed.
For the no ssh-key case , warning message is "Permission denied" or "No
such file or directory". For the other, warning message is "Network
Unreachable"
This patch also does a slight change to enlarge the timeout from 60s to
180s. This value can meet test at the time being
Signed-off-by: Pingfan Liu <piliu(a)redhat.com>
Acked-by: Kairui Song <kasong(a)redhat.com>
diff --git a/kdumpctl b/kdumpctl
index 2f2d819..f75b820 100755
--- a/kdumpctl
+++ b/kdumpctl
@@ -738,24 +738,38 @@ check_and_wait_network_ready()
local start_time=$(date +%s)
local cur
local diff
+ local retval
+ local errmsg
while true; do
- ssh -q -i $SSH_KEY_LOCATION -o BatchMode=yes $DUMP_TARGET mkdir -p $SAVE_PATH
+ errmsg=$(ssh -i $SSH_KEY_LOCATION -o BatchMode=yes $DUMP_TARGET mkdir -p $SAVE_PATH 2>&1)
+ retval=$?
+
# ssh exits with the exit status of the remote command or with 255 if an error occurred
- if [ $? -eq 0 ]; then
+ if [ $retval -eq 0 ]; then
return 0
- elif [ $? -ne 255 ]; then
+ elif [ $retval -ne 255 ]; then
+ echo "Could not create $DUMP_TARGET:$SAVE_PATH, you should check the privilege on server side" >&2
return 1
fi
+
+ # if server removes the authorized_keys or, no /root/.ssh/kdump_id_rsa
+ echo $errmsg | grep -q "Permission denied\|No such file or directory"
+ if [ $? -eq 0 ]; then
+ echo "Could not create $DUMP_TARGET:$SAVE_PATH, you probably need to run \"kdumpctl propagate\"" >&2
+ return 1
+ fi
+
cur=$(date +%s)
- diff=$( $cur - $start_time )
+ let "diff = $cur - $start_time"
# 60s time out
- if [ $diff -gt 60 ]; then
+ if [ $diff -gt 180 ]; then
break;
fi
sleep 1
done
+ echo "Could not create $DUMP_TARGET:$SAVE_PATH, ipaddr is not ready yet. You should check network connection" >&2
return 1
}
@@ -763,7 +777,6 @@ check_ssh_target()
{
check_and_wait_network_ready
if [ $? -ne 0 ]; then
- echo "Could not create $DUMP_TARGET:$SAVE_PATH, you probably need to run \"kdumpctl propagate\"" >&2
return 1
fi
return 0
commit 3e8526cf04a07fb2a69c1d86e40f8160d4fd7ecb
Author: Kairui Song <kasong(a)redhat.com>
Date: Wed May 29 17:00:43 2019 +0800
kexec-kdump-howto.txt: Add notes about device dump
Currently there are two issues with device dump:
- It may use too much memory
- kdump won't automatically include required driver in second kernel
User should manually reserve enough memory, and include the required
driver by using extra_modules. Add some notes about the issues in
kexec-kdump-howto.txt
Signed-off-by: Kairui Song <kasong(a)redhat.com>
Acked-by: Dave Young <dyoung(a)redhat.com>
diff --git a/kexec-kdump-howto.txt b/kexec-kdump-howto.txt
index 7e9e58a..8e6cc4c 100644
--- a/kexec-kdump-howto.txt
+++ b/kexec-kdump-howto.txt
@@ -698,6 +698,23 @@ crash kernel according, or update your encryption setup.
It's recommanded to use a non-encrypted target (eg. remote target)
instead.
+Notes on device dump:
+
+Device dump allows drivers to append dump data to vmcore, so you can
+collect driver specified debug info. The drivers could append the
+data without any limit, and the data is stored in memory, this may
+bring a significant memory stress. So device dump is disabled by default
+by passing "novmcoredd" command line option to the kdump capture kernel.
+If you want to collect debug data with device dump, you need to modify
+"KDUMP_COMMANDLINE_APPEND=" value in /etc/sysconfig/kdump and remove the
+"novmcoredd" option. You also need to increase the "crashkernel=" value
+accordingly in case of OOM issue.
+Besides, kdump initramfs won't automatically include the device drivers
+which support device dump, only device drivers that are required for
+the dump target setup will be included. To ensure the device dump data
+will be included in the vmcore, you need to force include related
+device drivers by using "extra_modules" option in /etc/kdump.conf
+
Parallel Dumping Operation
==========================
Kexec allows kdump using multiple cpus. So parallel feature can accelerate
commit ff329689b3405a0343711e375ec9b160ccf24e36
Author: Kairui Song <kasong(a)redhat.com>
Date: Wed May 29 10:47:58 2019 +0800
Disable device dump by default
Device dump may use a log of memory and cause OOM issue, so append
"novmcoredd" option for second kernel and disable it by default.
To use device dump, user should remove the vmcoredd parameter
manually.
Signed-off-by: Kairui Song <kasong(a)redhat.com>
Acked-by: Dave Young <dyoung(a)redhat.com>
diff --git a/kdump.sysconfig b/kdump.sysconfig
index ffe1df8..df518d6 100644
--- a/kdump.sysconfig
+++ b/kdump.sysconfig
@@ -21,7 +21,7 @@ KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet"
# This variable lets us append arguments to the current kdump commandline
# after processed by KDUMP_COMMANDLINE_REMOVE
-KDUMP_COMMANDLINE_APPEND="irqpoll maxcpus=1 reset_devices"
+KDUMP_COMMANDLINE_APPEND="irqpoll maxcpus=1 reset_devices novmcoredd"
# Any additional kexec arguments required. In most situations, this should
# be left empty
diff --git a/kdump.sysconfig.aarch64 b/kdump.sysconfig.aarch64
index c72a040..d5d7624 100644
--- a/kdump.sysconfig.aarch64
+++ b/kdump.sysconfig.aarch64
@@ -21,7 +21,7 @@ KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet"
# This variable lets us append arguments to the current kdump commandline
# after processed by KDUMP_COMMANDLINE_REMOVE
-KDUMP_COMMANDLINE_APPEND="irqpoll nr_cpus=1 reset_devices cgroup_disable=memory udev.children-max=2 panic=10 swiotlb=noforce"
+KDUMP_COMMANDLINE_APPEND="irqpoll nr_cpus=1 reset_devices cgroup_disable=memory udev.children-max=2 panic=10 swiotlb=noforce novmcoredd"
# Any additional kexec arguments required. In most situations, this should
# be left empty
diff --git a/kdump.sysconfig.i386 b/kdump.sysconfig.i386
index b5ec653..c31a8cb 100644
--- a/kdump.sysconfig.i386
+++ b/kdump.sysconfig.i386
@@ -21,7 +21,7 @@ KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet"
# This variable lets us append arguments to the current kdump commandline
# after processed by KDUMP_COMMANDLINE_REMOVE
-KDUMP_COMMANDLINE_APPEND="irqpoll nr_cpus=1 reset_devices numa=off udev.children-max=2 panic=10 transparent_hugepage=never"
+KDUMP_COMMANDLINE_APPEND="irqpoll nr_cpus=1 reset_devices numa=off udev.children-max=2 panic=10 transparent_hugepage=never novmcoredd"
# Any additional kexec arguments required. In most situations, this should
# be left empty
diff --git a/kdump.sysconfig.ppc64 b/kdump.sysconfig.ppc64
index e142c6e..1f95452 100644
--- a/kdump.sysconfig.ppc64
+++ b/kdump.sysconfig.ppc64
@@ -21,7 +21,7 @@ KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet"
# This variable lets us append arguments to the current kdump commandline
# after processed by KDUMP_COMMANDLINE_REMOVE
-KDUMP_COMMANDLINE_APPEND="irqpoll maxcpus=1 noirqdistrib reset_devices cgroup_disable=memory numa=off udev.children-max=2 ehea.use_mcs=0 panic=10 kvm_cma_resv_ratio=0 transparent_hugepage=never"
+KDUMP_COMMANDLINE_APPEND="irqpoll maxcpus=1 noirqdistrib reset_devices cgroup_disable=memory numa=off udev.children-max=2 ehea.use_mcs=0 panic=10 kvm_cma_resv_ratio=0 transparent_hugepage=never novmcoredd"
# Any additional kexec arguments required. In most situations, this should
# be left empty
diff --git a/kdump.sysconfig.ppc64le b/kdump.sysconfig.ppc64le
index e142c6e..1f95452 100644
--- a/kdump.sysconfig.ppc64le
+++ b/kdump.sysconfig.ppc64le
@@ -21,7 +21,7 @@ KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet"
# This variable lets us append arguments to the current kdump commandline
# after processed by KDUMP_COMMANDLINE_REMOVE
-KDUMP_COMMANDLINE_APPEND="irqpoll maxcpus=1 noirqdistrib reset_devices cgroup_disable=memory numa=off udev.children-max=2 ehea.use_mcs=0 panic=10 kvm_cma_resv_ratio=0 transparent_hugepage=never"
+KDUMP_COMMANDLINE_APPEND="irqpoll maxcpus=1 noirqdistrib reset_devices cgroup_disable=memory numa=off udev.children-max=2 ehea.use_mcs=0 panic=10 kvm_cma_resv_ratio=0 transparent_hugepage=never novmcoredd"
# Any additional kexec arguments required. In most situations, this should
# be left empty
diff --git a/kdump.sysconfig.s390x b/kdump.sysconfig.s390x
index 6edc2fa..abd45a2 100644
--- a/kdump.sysconfig.s390x
+++ b/kdump.sysconfig.s390x
@@ -21,7 +21,7 @@ KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet"
# This variable lets us append arguments to the current kdump commandline
# after processed by KDUMP_COMMANDLINE_REMOVE
-KDUMP_COMMANDLINE_APPEND="nr_cpus=1 cgroup_disable=memory numa=off udev.children-max=2 panic=10 transparent_hugepage=never"
+KDUMP_COMMANDLINE_APPEND="nr_cpus=1 cgroup_disable=memory numa=off udev.children-max=2 panic=10 transparent_hugepage=never novmcoredd"
# Any additional /sbin/mkdumprd arguments required.
MKDUMPRD_ARGS=""
diff --git a/kdump.sysconfig.x86_64 b/kdump.sysconfig.x86_64
index 17ae5e6..09de2eb 100644
--- a/kdump.sysconfig.x86_64
+++ b/kdump.sysconfig.x86_64
@@ -21,7 +21,7 @@ KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet"
# This variable lets us append arguments to the current kdump commandline
# after processed by KDUMP_COMMANDLINE_REMOVE
-KDUMP_COMMANDLINE_APPEND="irqpoll nr_cpus=1 reset_devices cgroup_disable=memory mce=off numa=off udev.children-max=2 panic=10 acpi_no_memhotplug transparent_hugepage=never nokaslr hest_disable"
+KDUMP_COMMANDLINE_APPEND="irqpoll nr_cpus=1 reset_devices cgroup_disable=memory mce=off numa=off udev.children-max=2 panic=10 acpi_no_memhotplug transparent_hugepage=never nokaslr hest_disable novmcoredd"
# Any additional kexec arguments required. In most situations, this should
# be left empty
commit 75297d6f202143f5b1528571ace8980c301044b4
Author: Kairui Song <kasong(a)redhat.com>
Date: Wed Aug 21 10:59:49 2019 +0800
dracut-module-setup: fix bond ifcfg processing
Bond options in ifcfg is space separated, dracut expected it to be comma
separated, so it have to be parsed and converted during initramfs
building.
The currently parsing and convert pattern is flawed, for example:
" downdelay=0 miimon=100 mode=802.3ad updelay=0 "
is converted to :
":,downdelay=0 miimon=100 mode=802.3ad updelay=0 "
should be:
":downdelay=0,miimon=100,mode=802.3ad,updelay=0"
So fix this issue by using more simple but robust method for processing
the options.
Signed-off-by: Kairui Song <kasong(a)redhat.com>
Acked-by: Dave Young <dyoung(a)redhat.com>
diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh
index a995dfc..b186b38 100755
--- a/dracut-module-setup.sh
+++ b/dracut-module-setup.sh
@@ -264,7 +264,7 @@ kdump_setup_bond() {
source_ifcfg_file $_netdev
- bondoptions="$(echo :$BONDING_OPTS | sed 's/\s\+/,/')"
+ bondoptions=":$(echo $BONDING_OPTS | xargs echo | tr " " ",")"
echo "$bondoptions" >> ${initdir}/etc/cmdline.d/42bond.conf
}
commit a5ea190af28ebcba186a4f83e6e25356cc459207
Author: Pingfan Liu <piliu(a)redhat.com>
Date: Mon Aug 26 17:03:13 2019 +0800
dracut-module-setup: filter out localhost for generic_fence_kdump
The localhost is filtered out in case of is_pcs_fence_kdump, do it too in
case of is_generic_fence_kdump.
Signed-off-by: Pingfan Liu <piliu(a)redhat.com>
Acked-by: Kairui Song <kasong(a)redhat.com>
diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh
index 7333047..a995dfc 100755
--- a/dracut-module-setup.sh
+++ b/dracut-module-setup.sh
@@ -754,6 +754,21 @@ get_pcs_fence_kdump_args() {
fi
}
+get_generic_fence_kdump_nodes() {
+ local filtered
+ local nodes
+
+ nodes=$(get_option_value "fence_kdump_nodes")
+ for node in ${nodes}; do
+ # Skip its own node name
+ if is_localhost $node; then
+ continue
+ fi
+ filtered="$filtered $node"
+ done
+ echo $filtered
+}
+
# setup fence_kdump in cluster
# setup proper network and install needed files
kdump_configure_fence_kdump () {
@@ -762,7 +777,7 @@ kdump_configure_fence_kdump () {
local args
if is_generic_fence_kdump; then
- nodes=$(get_option_value "fence_kdump_nodes")
+ nodes=$(get_generic_fence_kdump_nodes)
elif is_pcs_fence_kdump; then
nodes=$(get_pcs_fence_kdump_nodes)
commit f0b5493b2e224131e916c6e3ee706144baddee96
Author: Pingfan Liu <piliu(a)redhat.com>
Date: Mon Aug 26 17:03:12 2019 +0800
dracut-module-setup: get localhost alias by manual
'hostname -A' can not get the alias, meanwhile 'hostname -a' is deprecated.
So we should do it by ourselves.
The parsing is based on the format of /etc/hosts, i.e.
IP_address canonical_hostname [aliases...]
Signed-off-by: Pingfan Liu <piliu(a)redhat.com>
Acked-by: Kairui Song <kasong(a)redhat.com>
diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh
index 3fa696d..7333047 100755
--- a/dracut-module-setup.sh
+++ b/dracut-module-setup.sh
@@ -689,12 +689,31 @@ kdump_check_iscsi_targets () {
}
}
+# hostname -a is deprecated, do it by ourself
+get_alias() {
+ local ips
+ local entries
+ local alias_set
+
+ ips=$(hostname -I)
+ for ip in $ips
+ do
+ entries=$(grep $ip /etc/hosts | awk '{ $1=$2=""; print $0 }')
+ if [ $? -eq 0 ]; then
+ alias_set="$alias_set $entries"
+ fi
+ done
+
+ echo $alias_set
+}
+
is_localhost() {
local hostnames=$(hostname -A)
local shortnames=$(hostname -A -s)
+ local aliasname=$(get_alias)
local nodename=$1
- hostnames="$hostnames $shortnames"
+ hostnames="$hostnames $shortnames $aliasname"
for name in ${hostnames}; do
if [ "$name" == "$nodename" ]; then
commit c4a2ecb6e43efee8829e20cbeb52df9739c79162
Author: Vasiliy Glazov <vascom2(a)gmail.com>
Date: Tue Jun 11 07:46:47 2019 +0000
Add systemd-udev require.
It is needed to proper owning of /usr/lib/udev/rules.d directory.
diff --git a/kexec-tools.spec b/kexec-tools.spec
index b642543..73a293f 100644
--- a/kexec-tools.spec
+++ b/kexec-tools.spec
@@ -66,6 +66,10 @@ BuildRequires: automake autoconf libtool
Obsoletes: diskdumputils netdump kexec-tools-eppic
%endif
+%ifnarch s390x
+Requires: systemd-udev%{?_isa}
+%endif
+
#START INSERT
#
4 years, 2 months
[Report] Packages Restricting Arches
by root
Package that edited their arches constraints (1)
=============================================
- fpc
was ExclusiveArch: %{arm} %{ix86} x86_64 ppc64le
is ExclusiveArch: %{arm} aarch64 %{ix86} x86_64 ppc64le
List of packages currently excluding arches (2688)
===========================================
- 0ad
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le
- 90-Second-Portraits
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips} aarch64 ppc64
- GoldenCheetah
ExclusiveArch: %{qt5_qtwebengine_arches}
- GtkAda
ExclusiveArch: %{GPRbuild_arches}
- GtkAda3
ExclusiveArch: %{GPRbuild_arches}
- PragmARC
ExclusiveArch: %{GPRbuild_arches}
- R-V8
ExclusiveArch: %{nodejs_arches}
- RdRand
ExclusiveArch: %{ix86} x86_64
- SLOF
ExclusiveArch: ppc64le
- YafaRay
ExclusiveArch: %{ix86} x86_64
- aboot
ExclusiveArch: alpha
- acpid
ExclusiveArch: ia64 x86_64 %{ix86} %{arm} aarch64
- ahven
ExclusiveArch: %{GPRbuild_arches}
- alleyoop
ExclusiveArch: %{ix86} x86_64 ppc ppc64 ppc64le s390x %{arm} aarch64
- american-fuzzy-lop
ExclusiveArch: %{ix86} x86_64
- anet
ExclusiveArch: %{GPRbuild_arches}
- apmd
ExclusiveArch: %{ix86}
- appstream-generator
ExclusiveArch: x86_64 %{ix86} %{arm}
- arduino
ExclusiveArch: %{go_arches}
- arduino-builder
ExclusiveArch: %{go_arches}
- arm-trusted-firmware
ExclusiveArch: aarch64
- aunit
ExclusiveArch: %GPRbuild_arches
- avgtime
ExclusiveArch: %{ldc_arches}
- aws
ExclusiveArch: %GPRbuild_arches
- banshee
ExclusiveArch: %{mono_arches}
- banshee-community-extensions
ExclusiveArch: %ix86 x86_64 ppc ppc64 ia64 %{arm} sparcv9 alpha s390x
- bareftp
ExclusiveArch: %{mono_arches}
- bcal
ExclusiveArch: x86_64 aarch64 ia64 ppc64 ppc64le s390x
- bcc
ExclusiveArch: x86_64 %{power64} aarch64 s390x
- bcm283x-firmware
ExclusiveArch: %{arm} aarch64
- berusky2
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 %{mips}
- biosdevname
ExclusiveArch: %{ix86} x86_64
- bless
ExclusiveArch: %mono_arches
- boo
ExclusiveArch: %{mono_arches}
- bpftrace
ExclusiveArch: x86_64 %{power64} aarch64 s390x
- bwa
ExclusiveArch: x86_64
- calamares
ExclusiveArch: %{ix86} x86_64
- calibre
ExclusiveArch: %{qt5_qtwebengine_arches}
- carto
ExclusiveArch: %{nodejs_arches} noarch
- ccdciel
ExclusiveArch: %{fpc_arches}
- cdcollect
ExclusiveArch: %{mono_arches}
- chromium
ExclusiveArch: x86_64 i686
ExclusiveArch: x86_64 i686 aarch64
- cjdns
ExclusiveArch: %{nodejs_arches}
- cmospwd
ExclusiveArch: %{ix86} x86_64
- cmrt
ExclusiveArch: %{ix86} x86_64 ia64
- coffee-script
ExclusiveArch: %{nodejs_arches} noarch
- colorful
ExclusiveArch: %{fpc_arches}
- containers
ExclusiveArch: %{ldc_arches}
- cpu-x
ExclusiveArch: i686 x86_64
- cpuid
ExclusiveArch: %{ix86} x86_64
- cqrlog
ExclusiveArch: %{fpc_arches}
- crash
ExclusiveArch: %{ix86} ia64 x86_64 ppc ppc64 s390 s390x %{arm} aarch64 ppc64le
- cri-tools
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- criu
ExclusiveArch: x86_64 %{arm} ppc64le aarch64 s390x
- cryptlib
ExclusiveArch: x86_64 %{ix86} aarch64 ppc64 ppc64le
- cryptobone
ExclusiveArch: x86_64 %{ix86} ppc64 ppc64le aarch64
- daq
ExclusiveArch: x86_64 aarch64
- darktable
ExclusiveArch: x86_64 aarch64 ppc64le
- dbus-sharp
ExclusiveArch: %mono_arches
- dbus-sharp-glib
ExclusiveArch: %mono_arches
- dbxtool
ExclusiveArch: i386 x86_64 aarch64
- deepin-daemon
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- discord-irc
ExclusiveArch: %{nodejs_arches} noarch
- dlm
ExclusiveArch: i686 x86_64
- dmidecode
ExclusiveArch: %{ix86} x86_64 ia64 aarch64
- docco
ExclusiveArch: %{nodejs_arches} noarch
- docker-distribution
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- dolphin-emu
ExclusiveArch: x86_64 armv7l aarch64
- doublecmd
ExclusiveArch: %{ix86} x86_64
- dpdk
ExclusiveArch: x86_64 i686 aarch64 ppc64le
- dssi-vst
ExclusiveArch: %{ix86} x86_64
- dyninst
ExclusiveArch: %{ix86} x86_64 ppc64le aarch64
- e3
ExclusiveArch: %{ix86} x86_64
- edac-utils
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 %{power64}
- edb
ExclusiveArch: %{ix86} x86_64
- edk2
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
ExclusiveArch: x86_64 aarch64
- efibootmgr
ExclusiveArch: %{efi}
- efivar
ExclusiveArch: %{efi}
- elasticdump
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
ExclusiveArch: %{nodejs_arches} noarch
- elk
ExclusiveArch: x86_64 %{ix86}
ExclusiveArch: x86_64 %{ix86} aarch64 %{arm} %{power64}
- embree
ExclusiveArch: x86_64
- enki
ExclusiveArch: %{qt5_qtwebengine_arches} noarch
- envytools
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- exciting
ExclusiveArch: x86_64 %{ix86}
ExclusiveArch: x86_64 %{ix86} aarch64 %{power64}
ExclusiveArch: x86_64 %{ix86} aarch64 %{arm} %{power64}
- expresso
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- extlinux-bootloader
ExclusiveArch: %{arm} aarch64
- fcitx-libpinyin
ExclusiveArch: %{qt5_qtwebengine_arches}
- fedora-dockerfiles
ExclusiveArch: %{go_arches}
- fes
ExclusiveArch: %{ix86} x86_64
- flannel
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le s390x
- florist
ExclusiveArch: %{GPRbuild_arches}
- fluxcapacitor
ExclusiveArch: %{ix86} x86_64 %{arm}
- fpc
ExclusiveArch: %{arm} aarch64 %{ix86} x86_64 ppc64le
- frescobaldi
ExclusiveArch: %{qt5_qtwebengine_arches}
- frysk
ExclusiveArch: %{ix86} x86_64 ppc64
- fst
ExclusiveArch: i686
- fwts
ExclusiveArch: x86_64 %{arm} aarch64 s390x %{power64}
- ga
ExclusiveArch: %{ix86} x86_64
- gbrainy
ExclusiveArch: %mono_arches
- gdata-sharp
ExclusiveArch: %mono_arches
- gdb-exploitable
ExclusiveArch: x86_64 i386
ExclusiveArch: x86_64 noarch
- gela-asis
ExclusiveArch: %GPRbuild_arches
- ghdl
ExclusiveArch: %{GNAT_arches}
- ghostwriter
ExclusiveArch: %{qt5_qtwebengine_arches}
- gio-sharp
ExclusiveArch: %mono_arches
- gir-to-d
ExclusiveArch: %{ldc_arches}
- git-octopus
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- giver
ExclusiveArch: %{mono_arches}
- gkeyfile-sharp
ExclusiveArch: %mono_arches
- glibc32
ExclusiveArch: x86_64
- glibd
ExclusiveArch: %{ldc_arches}
- gmqcc
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- gnatcoll
ExclusiveArch: %{GPRbuild_arches}
- gnatcoll-bindings
ExclusiveArch: %{GPRbuild_arches}
- gnatcoll-db
ExclusiveArch: %{GPRbuild_arches}
- gnome-boxes
ExclusiveArch: x86_64
- gnome-desktop-sharp
ExclusiveArch: %mono_arches
- gnome-do
ExclusiveArch: %mono_arches
- gnome-guitar
ExclusiveArch: %{mono_arches}
- gnome-keyring-sharp
ExclusiveArch: %mono_arches
- gnome-rdp
ExclusiveArch: %{mono_arches}
- gnome-sharp
ExclusiveArch: %mono_arches
- gnome-subtitles
ExclusiveArch: %mono_arches
- gnu-efi
ExclusiveArch: %{efi}
- go-bindata
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- go-compilers
ExclusiveArch: %{go_arches}
- go-rpm-macros
ExclusiveArch: %{golang_arches} %{gccgo_arches}
- godep
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang
ExclusiveArch: %{golang_arches}
- gomtree
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- gotun
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
ExclusiveArch: x86_64
- gprbuild
ExclusiveArch: %{GPRbuild_arches} %{bootstrap_arch}
- gprolog
ExclusiveArch: x86_64 %{ix86} ppc alpha
- grafana
ExclusiveArch: %{grafana_arches}
- grafana-pcp
ExclusiveArch: %{nodejs_arches}
- gtk-sharp-beans
ExclusiveArch: %mono_arches
- gtk-sharp2
ExclusiveArch: %mono_arches
- gtk-sharp3
ExclusiveArch: %{mono_arches}
- gtkd
ExclusiveArch: %{ldc_arches}
- gudev-sharp
ExclusiveArch: %mono_arches
- hcc
ExclusiveArch: x86_64 aarch64
- hedgewars
ExclusiveArch: %{fpc_arches}
- heketi
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- hip
ExclusiveArch: x86_64
- hsakmt
ExclusiveArch: x86_64 aarch64
- hyena
ExclusiveArch: %{mono_arches}
- hyperscan
ExclusiveArch: x86_64
- hyperv-daemons
ExclusiveArch: i686 x86_64
- i3status-rs
ExclusiveArch: %{rust_arches}
- icaro
ExclusiveArch: %{ix86} x86_64 noarch
- ikona
ExclusiveArch: %{qt5_qtwebengine_arches}
- imvirt
ExclusiveArch: %{ix86} x86_64 ia64
- indistarter
ExclusiveArch: %{fpc_arches}
- infinipath-psm
ExclusiveArch: x86_64
- insect
ExclusiveArch: %{nodejs_arches} noarch
- intel-cmt-cat
ExclusiveArch: x86_64 i686 i586
ExclusiveArch: x86_64 i686 i586
- intel-gmmlib
ExclusiveArch: x86_64 i686
- intel-mediasdk
ExclusiveArch: x86_64
- intel-undervolt
ExclusiveArch: i386 x86_64
- ioport
ExclusiveArch: %{ix86} x86_64
- ipmctl
ExclusiveArch: x86_64
- ipw2100-firmware
ExclusiveArch: noarch i386 x86_64
- ipw2200-firmware
ExclusiveArch: noarch i386 x86_64
- ispc
ExclusiveArch: %{arm} %{ix86} x86_64
- iucode-tool
ExclusiveArch: %{ix86} x86_64
- jake
ExclusiveArch: %{nodejs_arches} noarch
- jasmine-node
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- java-1.8.0-openjdk-aarch32
ExclusiveArch: %{arm}
- josm
ExclusiveArch: %{ix86} x86_64
- keepass
ExclusiveArch: %{mono_arches}
- kernel
ExclusiveArch: x86_64 s390x %{arm} aarch64 ppc64le
ExclusiveArch: noarch i386 i686 x86_64 s390x %{arm} aarch64 ppc64le
- kf5-akonadi-calendar
ExclusiveArch: x86_64 %{arm}
- kf5-akonadi-search
ExclusiveArch: x86_64 ppc64le %{arm}
- kf5-kalarmcal
ExclusiveArch: x86_64 ppc64le %{arm}
- kf5-kblog
ExclusiveArch: x86_64 ppc64le %{arm}
- kf5-kcalendarcore
ExclusiveArch: x86_64 ppc64le %{arm}
- kf5-kcalendarutils
ExclusiveArch: x86_64 ppc64le %{arm}
- kf5-kitinerary
ExclusiveArch: x86_64 ppc64le %{arm}
- kf5-kmailtransport
ExclusiveArch: x86_64 %{arm}
- kf5-ktnef
ExclusiveArch: x86_64 ppc64le %{arm}
- kf5-libgravatar
ExclusiveArch: x86_64 %{arm}
- kf5-libkdcraw
ExclusiveArch: x86_64 ppc64le %{arm}
- kf5-libkdepim
ExclusiveArch: x86_64 %{arm}
- kf5-libksieve
ExclusiveArch: x86_64 %{arm}
- kf5-mailimporter
ExclusiveArch: x86_64 %{arm}
- kf5-pimcommon
ExclusiveArch: x86_64 %{arm}
- kicad
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le
- kiwix-desktop
ExclusiveArch: %{qt5_qtwebengine_arches}
- knot-resolver
ExclusiveArch: %{ix86} x86_64
ExclusiveArch: %{arm} aarch64 %{ix86} x86_64
- knotes
ExclusiveArch: x86_64 %{arm}
- kompose
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 s390x
- kosmtik
ExclusiveArch: %{nodejs_arches} noarch
- kubernetes
ExclusiveArch: x86_64 aarch64 ppc64le s390x %{arm}
- lazarus
ExclusiveArch: %{fpc_arches}
- ldc
ExclusiveArch: %{ldc_arches}
- libbsr
ExclusiveArch: %{power64}
- libclc
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 %{power64} s390x
- libcxl
ExclusiveArch: %{power64}
- libdfp
ExclusiveArch: ppc ppc64 ppc64le s390 s390x
- libica
ExclusiveArch: s390 s390x
- libipt
ExclusiveArch: %{ix86} x86_64
ExclusiveArch: %{ix86} x86_64
- libkgapi
ExclusiveArch: x86_64 %{arm}
- libocxl
ExclusiveArch: ppc64le
- libpmemobj-cpp
ExclusiveArch: x86_64
- libpsm2
ExclusiveArch: x86_64
- libquentier
ExclusiveArch: %{qt5_qtwebengine_arches}
- libretro-desmume2015
ExclusiveArch: i686 x86_64
- librtas
ExclusiveArch: %{power64}
- libservicelog
ExclusiveArch: ppc %{power64}
- libsmbios
ExclusiveArch: x86_64 %{ix86}
- libunwind
ExclusiveArch: %{arm} aarch64 hppa ia64 mips ppc %{power64} %{ix86} x86_64
- libva-intel-hybrid-driver
ExclusiveArch: %{ix86} x86_64 ia64
- libvmi
ExclusiveArch: x86_64
- libvpd
ExclusiveArch: %{power64}
- libxsmm
ExclusiveArch: x86_64
- libzfcphbaapi
ExclusiveArch: s390 s390x
- lightdm
ExclusiveArch: x86_64 ppc64le
- lodash
ExclusiveArch: %{nodejs_arches} noarch
- log4net
ExclusiveArch: %mono_arches
- lrmi
ExclusiveArch: %{ix86}
- lsvpd
ExclusiveArch: %{power64}
- luajit
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips} aarch64 s390x ppc64le
- luxcorerender
ExclusiveArch: x86_64
- mactel-boot
ExclusiveArch: x86_64
- manifest-tool
ExclusiveArch: x86_64 aarch64 ppc64le s390x
- mantle
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- marked
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- matreshka
ExclusiveArch: %GPRbuild_arches
- maxima
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc sparcv9
ExclusiveArch: %{ix86} x86_64 ppc sparcv9
- mbpfan
ExclusiveArch: x86_64
- mcelog
ExclusiveArch: i686 x86_64
- mediaconch
ExclusiveArch: %{qt5_qtwebengine_arches}
- mellowplayer
ExclusiveArch: %{qt5_qtwebengine_arches}
- memkind
ExclusiveArch: x86_64
- memtest86+
ExclusiveArch: %{ix86} x86_64
- mesos
ExclusiveArch: x86_64
- microcode_ctl
ExclusiveArch: %{ix86} x86_64
- micropython
ExclusiveArch: %{arm} %{ix86} x86_64
- mine_detector
ExclusiveArch: %{GPRbuild_arches}
- minetest
ExclusiveArch: %{ix86} x86_64
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips} aarch64
- mingw-wine-gecko
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- mirrorlist-server
ExclusiveArch: %{rust_arches}
- mkbootdisk
ExclusiveArch: %{ix86} sparc sparc64 x86_64
- mnemosyne
ExclusiveArch: noarch %{qt5_qtwebengine_arches}
- mocha
ExclusiveArch: %{nodejs_arches} noarch
- mod_mono
ExclusiveArch: %mono_arches
- module-build-service
ExclusiveArch: %{ix86} x86_64 noarch
- mokutil
ExclusiveArch: %{ix86} x86_64 aarch64
- mono
ExclusiveArch: %mono_arches
- mono-addins
ExclusiveArch: %mono_arches
- mono-basic
ExclusiveArch: %{mono_arches}
- mono-bouncycastle
ExclusiveArch: %mono_arches
- mono-cecil
ExclusiveArch: %mono_arches
- mono-cecil-flowanalysis
ExclusiveArch: %mono_arches
- mono-reflection
ExclusiveArch: %mono_arches
- mono-tools
ExclusiveArch: %mono_arches
- mono-zeroconf
ExclusiveArch: %mono_arches
- monobristol
ExclusiveArch: %{mono_arches}
- monodevelop
ExclusiveArch: %mono_arches
- monodevelop-debugger-gdb
ExclusiveArch: %{mono_arches}
- monosim
ExclusiveArch: %mono_arches
- mozilla-iot-gateway
ExclusiveArch: %{nodejs_arches} noarch
- mozilla-iot-gateway-addon-node
ExclusiveArch: %{nodejs_arches} noarch
- mrrescue
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips} aarch64 ppc64
- msr-tools
ExclusiveArch: %{ix86} x86_64
- mustache-d
ExclusiveArch: %{ldc_arches}
- mysql-connector-net
ExclusiveArch: %{mono_arches}
- nacl-arm-binutils
ExclusiveArch: x86_64
- nacl-binutils
ExclusiveArch: x86_64
- nant
ExclusiveArch: %mono_arches
- nbc
ExclusiveArch: %{fpc_arches}
- nbdkit
ExclusiveArch: x86_64
- ndesk-dbus
ExclusiveArch: %{mono_arches}
- ndesk-dbus-glib
ExclusiveArch: %{mono_arches}
- newtonsoft-json
ExclusiveArch: %{mono_arches}
- nim
ExclusiveArch: %{nim_arches}
- node-gyp
ExclusiveArch: %{nodejs_arches} noarch
- nodejs
ExclusiveArch: %{nodejs_arches}
- nodejs-Base64
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-abbrev
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-acorn
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-acorn-dynamic-import
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-acorn-jsx
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-acorn-object-spread
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-agentkeepalive
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ain2
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-align-text
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-bgblack
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-bgblue
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-bgcyan
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-bggreen
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-bgmagenta
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-bgred
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-bgwhite
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-bgyellow
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-black
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-blue
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-bold
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-colors
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-cyan
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ansi-dim
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-escapes
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-gray
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-green
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ansi-grey
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-hidden
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-inverse
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-italic
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-magenta
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ansi-red
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-regex
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-reset
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-strikethrough
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-styles
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ansi-underline
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-white
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ansi-wrap
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ansi-yellow
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ansicolors
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ansistyles
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-any-path
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-any-promise
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ap
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-append-field
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-append-transform
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-archy
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-are-we-there-yet
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-argparse
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-argsparser
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-arr-diff
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-arr-exclude
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-arr-flatten
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-arr-union
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-array-buffer-from-string
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-array-differ
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-array-events
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-array-filter
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-array-find
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-array-find-index
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-array-flatten
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-array-foreach
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-array-ify
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-array-index
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-array-map
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-array-reduce
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-array-union
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-array-unique
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-arraybuffer-dot-slice
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-arraybuffer-equal
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-arrify
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-asap
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ascii-tree
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ascli
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-asn1
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-assert-plus
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-assertion-error
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-assume
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-async
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-async-array-reduce
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-async-arrays
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-async-limiter
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-async-queue
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-async-some
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-asynckit
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-atob
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-auto-bind
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-autoresolve
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-aws-sign
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-aws-sign2
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-aws4
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-babel-code-frame
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-babel-plugin-syntax-async-functions
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-babel-plugin-syntax-async-generators
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-babel-runtime
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-babylon
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-backbone
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-backoff
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-balanced-match
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-base
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-base-plugins
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-base32-encode
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-base64-arraybuffer
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-base64-url
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-base64id
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-bash-match
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-basic-auth
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-basic-auth-connect
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-batch
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-bcrypt
ExclusiveArch: %{nodejs_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
- nodejs-bcryptjs
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-beeper
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-benchmark
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-better-assert
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-better-than-before
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-bignumber-js
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-bind-obj-methods
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-bindings
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-bit-mask
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-bl
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-blob
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-block-stream
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-bluebird
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-body-parser
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-boolbase
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-boom
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-brace-expansion
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-braces
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-browser-stdout
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-bson
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-buble
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-buf-compare
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-buffer-crc32
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-buffer-equal
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-buffer-writer
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-bufferutil
ExclusiveArch: %{nodejs_arches}
- nodejs-builtin-modules
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-builtins
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-bundle-dependencies
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-bunker
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-bunyan
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-burrito
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-busboy
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-byline
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-bytes
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-cache-base
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-caching-transform
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-call-delayed
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-call-matcher
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-call-me-maybe
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-call-signature
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-callback-stream
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-caller-callsite
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-caller-path
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-callsite
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-callsites
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-camelcase
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-camelcase-keys
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-carrier
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-caseless
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-center-align
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-chai
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-chai-as-promised
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-chai-cheerio
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-chai-connect-middleware
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-chai-fs
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-chai-json-schema
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-chai-oauth2orize-grant
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-chai-passport-strategy
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-chai-spies-next
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-chainer
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-chalk
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-char-spinner
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-character-parser
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-chardet
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-charenc
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-charm
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-check-env
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-check-error
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-cheerio
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-child-process-close
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-chmodr
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-chownr
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-chroma-js
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-chrono
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ci-info
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-circular-json
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-cjson
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-clap
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-class-utils
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-clean-css
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-clean-yaml-object
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-clear-require
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-cli
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-cli-color
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-cli-spinner
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-cli-table
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-cliui
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-clone
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-clone-deep
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-clone-stats
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-closure-compiler
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-cmd-shim
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-co
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-co-mocha
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-co-with-promise
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-coa
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-code-point-at
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-codemirror
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-coffee-coverage
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-collection-visit
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-collections
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-color-support
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-colors
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-colour
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-columnify
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-combined-stream
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-commander
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-common-path-prefix
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-commondir
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-commonmark
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-compare-func
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-compare-versions
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-component-emitter
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-component-indexof
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-component-inherit
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-concat-map
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-concat-stream
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-config-chain
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-connect
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-connect-livereload
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-connect-timeout
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-console-dot-log
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-console-group
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-consolemd
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-constantinople
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-content-disposition
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-content-type
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-conventional-changelog-angular
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-conventional-changelog-atom
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-conventional-changelog-codemirror
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-conventional-changelog-ember
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-conventional-changelog-eslint
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-conventional-changelog-express
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-conventional-changelog-jquery
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-conventional-changelog-jscs
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-conventional-changelog-jshint
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-conventional-changelog-preset-loader
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-conventional-changelog-writer
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-conventional-commits-filter
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-conventional-commits-parser
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-convert-hex
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-convert-source-map
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-cookie
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-cookie-jar
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-cookie-parser
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-cookie-session
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-cookie-signature
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-cookiejar
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-cookies
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-copy-descriptor
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-core-assert
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-core-js
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-core-util-is
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-cors
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-couch-login
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-coveralls
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-crc
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-cross-spawn
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-cross-spawn-async
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-crypt
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-cryptiles
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-csrf
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-css
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-css-parse
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-css-select
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-css-stringify
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-css-tree
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-css-what
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-csscomb-core
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-csslint
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-csso
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-cssom
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-csurf
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-csv
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-csv-generate
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-csv-parse
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-csv-spectrum
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-csv-stringify
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ctype
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-currently-unhandled
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-cycle
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-cyclist
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-d
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-dargs
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-data-uri-to-buffer
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-dateformat
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-death
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-debug
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-debug-fabulous
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-debug-log
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-debuglog
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-decamelize
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-decamelize-keys
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-decimal-js
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-dedent
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-deep-eql
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-deep-equal
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-deep-extend
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-deep-is
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-deeper
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-default-require-extensions
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-default-resolution
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-defaults
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-defence
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-defence-cli
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-define-properties
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-define-property
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-defined
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-del
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-delayed-stream
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-delegates
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-delete
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-dep-graph
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-depd
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-deprecated
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-destroy
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-detect-file
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-detect-indent
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-detect-newline
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-detect-node
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-detective
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-dezalgo
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-dicer
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-diff
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-difflet
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-difflib
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-dirty-chai
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-discord-js
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-docopt
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-doctrine
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-dot-prop
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-dotfile-regex
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-dryice
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-duplexer
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-duplexer2
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-duplexify
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-duration
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-each
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ebnf-parser
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-echomd
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-editor
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ee-first
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ejs
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-emojione
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-empty-dir
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-end-of-stream
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-engine-dot-io-client
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-engine-dot-io-parser
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-error-ex
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-error-symbol
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-es-abstract
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-es-to-primitive
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-es5-ext
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-es5-shim
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-es6-iterator
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-es6-promise
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-es6-promisify
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-es6-shim
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-es6-symbol
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-es6-weak-map
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-escallmatch
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-escape-html
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-escape-regexp-component
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-escape-string-regexp
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-escodegen
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-escope
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-espower
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-espower-location-detector
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-esprima
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-esprima-fb
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-esprima-harmony-jscs
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-espurify
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-esrecurse
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-estraverse
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-estraverse-fb
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-estree-walker
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-esutils
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-event-emitter
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-eventemitter2
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-events
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-events-to-array
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-everything-dot-js
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-exit
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-expand-brackets
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-expand-range
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-expand-tilde
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-expect
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-expect-dot-js
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-express
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-express-session
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-extend
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-extend-shallow
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-extended-emitter
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-extglob
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-fake
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-fancy-log
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-fast-levenshtein
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-fastfall
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-faucet
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-faye-websocket
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-figures
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-file-entry-cache
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-file-sync-cmp
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-filelist
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-filename-regex
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-fileset
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-fill-keys
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-fill-range
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-find-cache-dir
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-find-up
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-findup-sync
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-first-chunk-stream
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-flagged-respawn
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-flat-cache
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-flush-write-stream
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-fmix
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-fn-dot-name
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-for-each
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-for-in
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-for-own
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-foreach
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-foreground-child
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-forever-agent
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-form-data
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-formatio
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-formidable
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-forwarded
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-fragment-cache
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-freetree
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-fresh
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-from
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-fs-dot-notify
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-fs-exists-cached
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-fs-exists-sync
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-fs-ext
ExclusiveArch: %{nodejs_arches}
- nodejs-fs-promise
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-fs-temp
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-fs-vacuum
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-fs-write-stream-atomic
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-fstream
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-fstream-ignore
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-fstream-npm
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-function-bind
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-function-loop
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-gauge
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-gaze
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-gdal
ExclusiveArch: %{nodejs_arches}
- nodejs-generate-function
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-generate-object-property
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-generic-pool
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-get-port
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-get-value
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-getobject
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-git-remote-origin-url
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-git-tails
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-gitconfiglocal
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-github-url-from-git
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-github-url-from-username-repo
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-glob
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-glob-base
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-glob-expand
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-glob-parent
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-glob-to-regexp
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-global-modules
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-global-prefix
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-globals
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-globby
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-globule
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-glogg
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-gnode
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-gonzales-pe
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-graceful-fs
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-graceful-readlink
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-grip
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-growl
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-grunt
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-grunt-banner
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-grunt-cli
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-grunt-compare-size
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-grunt-contrib-clean
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-grunt-contrib-concat
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-grunt-contrib-csslint
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-grunt-contrib-internal
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-grunt-contrib-nodeunit
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-grunt-contrib-uglify
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-grunt-contrib-watch
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-grunt-git-authors
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-grunt-init
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-grunt-known-options
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-grunt-legacy-log
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-grunt-legacy-log-utils
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-grunt-legacy-util
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-grunt-lib-contrib
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-grunt-sed
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-grunt-simple-mocha
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-grunt-wrap
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-gulplog
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-gzip-size
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-handlebars
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-har-validator
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-has
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-has-ansi
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-has-binary
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-has-binary2
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-has-color
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-has-cors
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-has-flag
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-has-glob
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-has-gulplog
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-has-symbols
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-has-unicode
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-has-value
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-has-values
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-has-yarn
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-hash_file
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-hawk
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-heap
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-hex-to-array-buffer
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-highlight-js
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-historic-readline
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-hoek
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-homedir-polyfill
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-hook-std
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-hooker
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-hosted-git-info
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-hsluv
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-htmlparser2
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-http-deceiver
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-http-errors
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-http-signature
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-http2
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-humanize-ms
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-i
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-i18n-transform
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-i2c
ExclusiveArch: %{nodejs_arches}
- nodejs-iconv
ExclusiveArch: %{nodejs_arches}
- nodejs-iconv-lite
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-iferr
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ignore
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-image-size
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-immutable
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-import-local
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-imul
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-imurmurhash
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-indent-string
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-indexof
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-inflight
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-info-symbol
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-inherit
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-inherits
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-inherits1
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ini
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-int64-buffer
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-intercept-require
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-interpret
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-invert-kv
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ip
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ipaddr-dot-js
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-irc-colors
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-irc-formatting
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-irc-upd
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-irregular-plurals
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-accessor-descriptor
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-arrayish
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-arrow-function
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-boolean-object
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-buffer
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-builtin-module
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-callable
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-data-descriptor
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-date-object
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-descriptor
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-dir
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-dotfile
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-equal-shallow
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-error
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-extendable
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-extglob
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-finite
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-fullwidth-code-point
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-function
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-generator
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-generator-fn
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-generator-function
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-glob
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-module
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-my-json-valid
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-negated-glob
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-node
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-number
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-number-object
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-obj
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-object
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-observable
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-odd
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-path-cwd
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-path-in-cwd
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-path-inside
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-plain-obj
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-plain-object
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-primitive
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-promise
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-property
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-regex
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-regexp
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-registered
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-relative
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-stream
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-string
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-subset
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-symbol
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-text-path
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-typedarray
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-unc-path
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-url
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-utf8
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-valid-glob
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-is-valid-instance
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-is-windows
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-isarray
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-isexe
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-iso8601
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-isobject
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-isodate
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-isstream
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-istanbul-lib-coverage
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-istanbul-lib-hook
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-istanbul-lib-report
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-istanbul-lib-source-maps
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-istanbul-reports
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-jade
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-jasmine-growl-reporter
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-jasmine-reporters
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-jest-mock
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-jison-lex
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-joose
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-joosex-namespace-depended
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-joosex-simplerequest
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-js-base64
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-js-string-escape
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-js-tokens
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-js-yaml
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-jschardet
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-jscoverage
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-json-diff
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-json-localizer
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-json-parse-helpfulerror
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-json-stable-stringify
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-json-stringify-safe
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-json3
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-jsonfile
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-jsonify
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-jsonm
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-jsonparse
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-jsonpointer
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-jsonpointer-dot-js
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-jsonselect
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-jwt-simple
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-keep-alive-agent
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-keygrip
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-keypress
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-kind-of
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-klaw
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-kuler2gpl
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-lazy-cache
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-lazystream
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-lcid
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-lcov-parse
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-leaflet
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-leaflet-formbuilder
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-leaflet-hash
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-leche
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-left-pad
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-less
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-less-plugin-clean-css
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-levn
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-libpq
ExclusiveArch: %{nodejs_arches}
- nodejs-libxmljs
ExclusiveArch: %{nodejs_arches}
- nodejs-line-numbers
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-line-reader
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-linefix
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-linkify-it
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-load-grunt-tasks
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-locate-character
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-locate-path
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-lockfile
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-log-driver
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-log-ok
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-log-utils
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-lolex
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-long
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-longest
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-loophole
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-loud-rejection
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-lru-cache
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-lru-queue
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ltx
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-magic-string
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-make-arrow-function
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-make-dir
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-make-error
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-make-generator-function
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-make-node
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-makedir
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-makeerror
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-map-cache
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-map-obj
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-map-visit
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mapnik
ExclusiveArch: %{nodejs_arches}
- nodejs-mapnik-pool
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mapnik-vector-tile
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-markdown
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-markdown-it-testgen
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-marked
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-matched
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-max-timeout
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-maxmin
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mbtiles
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-md5
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-md5-hex
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-md5-o-matic
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-mdn-data
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mdurl
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-media-typer
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-memoize-path
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-memoizee
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-merge-descriptors
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-metascript
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-methods
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-micromatch
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-millstone
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mime
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-mime-db
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mime-types
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mimeparse
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-minimalistic-assert
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-minimatch
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-minimist
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-minipass
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mixin-deep
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mixin-object
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mkdirp
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mock-bin
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mock-fs
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mock-git
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-modify-values
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-module-not-found-error
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mongodb
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mongodb-core
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-monocle
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-morgan
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ms
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-muffin
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-multimatch
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-multiparty
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-multipipe
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-murmur-32
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mustache
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mutate-fs
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mute-stream
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mv
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-mysql
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-mz
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-nan
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-nan0
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-nan1
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-nanomatch
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-nanomsg
ExclusiveArch: %{nodejs_arches}
- nodejs-nanoseconds
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ncp
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-needle
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-negative-zero
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-net-browserify-alt
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-netmask
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-next-tick
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ng-classify
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-node-dot-extend
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-node-expat
ExclusiveArch: %{nodejs_arches}
ExclusiveArch: %{ix86} x86_64 %{arm}
- nodejs-node-int64
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-node-markdown
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-node-static
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-node-stringprep
ExclusiveArch: %{nodejs_arches}
- nodejs-node-uuid
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-nomnom
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-noncharacters
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-nopt
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-nopt-usage
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-noptify
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-normalize-git-url
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-normalize-path
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-npm-cache-filename
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-npm-install-checks
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-npm-license
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-npm-package-arg
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-npm-run-path
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-npm-user-validate
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-npmlog
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-nth-check
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-number-is-nan
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-numeral
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-oauth
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-oauth-sign
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-oauth2orize
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-object-assign
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-object-copy
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-object-dot-assign
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-object-dot-entries
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-object-dot-omit
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-object-dot-pick
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-object-inspect
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-object-is
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-object-keys
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-object-visit
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-observable-to-promise
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-obuf
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-okay
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-on-finished
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-on-headers
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-once
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-only-shallow
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-opal-runtime
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-open
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-opener
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-option-cache
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-option-chain
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-optionator
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-options
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-optjs
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-opts
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-orchestrator
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ordered-read-streams
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-os-homedir
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-os-locale
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-os-shim
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-os-tmpdir
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-osenv
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-output-file-sync
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-own-or
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-own-or-env
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-p-finally
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-p-limit
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-p-locate
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-package
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-package-license
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-packaging
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-packet-reader
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pad
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-pad-left
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-paperboy
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-parallel-transform
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-parse-github-repo-url
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-parse-glob
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-parse-ms
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-parse-passwd
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-parsejson
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-parseqs
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-parseuri
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-parseurl
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-pascalcase
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-passport-http-bearer
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-passport-oauth
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-passport-oauth1
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-passport-oauth2
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-passport-oauth2-client-password
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-passport-strategy
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-path-array
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-path-dirname
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-path-exists
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-path-extra
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-path-is-absolute
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-path-is-inside
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-path-key
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-path-parse
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-path-to-regexp
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-path-type
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-path2
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-pathval
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pause
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-pbkdf2-password
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pedding
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pff
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pg
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pg-connection-string
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pg-cursor
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pg-escape
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pg-int8
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pg-native
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pg-numeric
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pg-packet-stream
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pg-pool
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pg-types
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pgpass
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pinkie
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pinkie-promise
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pkg-dir
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-pkg-up
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pkginfo
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-platform
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-plur
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-posix-character-classes
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-postgres-array
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-postgres-bytea
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-postgres-date
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-postgres-interval
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-precond
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-prelude-ls
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-preserve
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-pretty-bytes
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-pretty-hrtime
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-pretty-ms
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pretty-time
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-prism-media
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-process-nextick-args
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-proclaim
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-progress
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-progress-stream
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-promise
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-promises-aplus-tests
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-prompt
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-promzard
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-propagate
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-propget
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-proto-list
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-proxy-addr
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-proxyquire
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pruddy-error
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pseudomap
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-pubcontrol
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-pump
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-pumpify
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-q
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-q-io
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-qs
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-qtdatastream
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-queue-async
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-quick-lru
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-qunit-extras
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-rainbowsocks
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-random-bytes
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-random-path
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-randomatic
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-range-parser
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-raw-body
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-re-emitter
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-read
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-read-all-stream
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-read-cmd-shim
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-read-file
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-read-json-sync
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-read-package-json
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-read-pkg
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-readable-stream
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-readdir-enhanced
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-readdir-scoped-modules
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-readdirp
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-realize-package-specifier
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-rechoir
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-redent
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-reduce-component
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-regex-cache
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-regex-not
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-remove-trailing-separator
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-repeat-element
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-repeat-string
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-repeating
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-repl
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-replace
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-replace-ext
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-replace-require-self
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-request
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-require-cs
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-require-directory
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-require-inject
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-require-main-filename
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-require-relative
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-require-uncached
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-require-yaml
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-requirejs
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-resolve
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-resolve-cwd
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-resolve-dir
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-resolve-from
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-resolve-pkg
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-resolve-url
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-response-time
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-resumer
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ret
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-retry
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-reusify
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-revalidator
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-rewire
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-rfile
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-rhea
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-right-align
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-rimraf
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-rndm
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-rollup
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-rollup-plugin-buble
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-rollup-plugin-commonjs
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-rollup-plugin-json
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-rollup-plugin-node-resolve
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-rollup-plugin-typescript
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-rollup-pluginutils
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ronn
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-runforcover
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-safe-buffer
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-safe-json-stringify
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-safe-regex
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-safecb
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-samsam
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-sax
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-secure-random
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-seedrandom
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-select-hose
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-semver
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-sentiment
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-sequencify
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-serialize-error
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-serve-index
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-server-destroy
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-set-blocking
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-set-getter
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-set-immediate
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-set-immediate-shim
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-set-value
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-setimmediate
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-setprototypeof
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-sha
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-shallow-clone
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-shebang-command
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-shebang-regex
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-shelljs
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-shelljs-nodecli
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-should
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-should-equal
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-should-format
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-should-http
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-should-type
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-showdown
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-sift
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-sigmund
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-signal-exit
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-simple-assert
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-simple-asyncify
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-simple-fmt
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-simple-is
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-simple-markdown
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-single-line-log
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-sinon
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-sinon-chai
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-sinon-restore
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-slash
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-sliced
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-slide
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-snapdragon
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-snapdragon-capture
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-snapdragon-capture-set
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-snapdragon-node
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-snapdragon-util
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-snekfetch
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-snockets
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-sntp
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-socket-dot-io-parser
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-sorted-object
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-source-map
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-source-map-fixtures
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-source-map-resolve
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-source-map-support
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-source-map-url
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-sparkles
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-spawn-sync
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-spawn-wrap
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-spdx-exceptions
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-spdx-license-ids
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-spec
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-spec-js
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-speedometer
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-split
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-split-string
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-split2
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-sprintf
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-sprintf-js
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-sqlite3
ExclusiveArch: %{nodejs_arches}
- nodejs-srs
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ssri
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-stable
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-stack-trace
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-stack-utils
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-static-extend
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-static-favicon
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-statuses
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-stream-combiner
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-stream-consume
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-stream-counter
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-stream-each
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-stream-pair
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-stream-replace
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-stream-shift
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-stream-spigot
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-stream-transform
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-streamsearch
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-streamtest
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-string
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-string-dot-prototype-dot-repeat
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-string-dot-prototype-dot-trim
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-string-width
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-string_decoder
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-stringmap
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-stringscanner
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-stringset
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-stringstream
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-strip-ansi
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-strip-bom
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-strip-bom-stream
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-strip-bom-string
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-strip-color
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-strip-eof
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-strip-json-comments
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-strip-path
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-strong-log-transformer
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-success-symbol
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-superagent
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-supertest
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-supervisor
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-supports-color
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-suspend
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-svgo
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-symbol-observable
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-tap
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tap-mocha-reporter
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tap-out
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-tap-parser
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tap-spec
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-tape
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tapes
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tar
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tar-pack
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-temp
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-temp-dir
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-temp-write
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tempfile
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-temporary
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tern-cordovajs
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tern-liferay
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-terst
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-testdata-w3c-json-form
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-testswarm
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-testutil
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-text-extensions
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-text-table
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-thenify
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-thenify-all
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-thread-sleep
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-through
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-through2
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-through2-filter
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-thunkify
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-tildify
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-tilelive-mapnik
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tiletype
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-time-diff
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-time-stamp
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-timekeeper
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-timers-ext
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-tiny-lr-fork
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-tippex
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tlds
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-tmatch
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tmp
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tmpl
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-to-absolute-glob
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-to-array
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-to-object-path
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-to-regex
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-to-regex-range
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-touch
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tough-cookie
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tracejs
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-transformers
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-traverse
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-treeify
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-tressa
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-trim
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-trim-newlines
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-trim-off-newlines
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-trivial-deferred
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-try-open
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-try-thread-sleep
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tryor
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-tsame
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tslib
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tsscmp
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-tunnel-agent
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tv4
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tweetnacl
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tweetnacl-util
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-type-check
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-type-detect
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-type-is
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-type-name
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-typeahead.js
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-typescript
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-uc-dot-micro
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-uglify-to-browserify
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-uid-number
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-uid-safe
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-uid2
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-ultron
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-umask
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-unc-path-regex
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-underscore
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-underscore-dot-logger
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-unicode-length
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-union-value
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-unique-filename
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-unique-slug
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-unique-stream
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-unique-temp-dir
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-unpipe
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-unset-value
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-uri-path
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-urix
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-url2
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-use
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-user-home
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-utf8
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-util
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-util-deprecate
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-util-extend
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-util-inspect
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-utilities
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-utils-merge
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-uuid
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-vali-date
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-validate-npm-package-name
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-vasync
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-vhost
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-vlq
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-vow
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-vow-fs
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-vow-queue
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-vows
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-walkdir
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-walker
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ware
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-warning-symbol
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-watchit
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-watershed
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-wbuf
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-wcwidth
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-weak-map
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-websocket-driver
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-when
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-whet-dot-extend
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-which
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-win-spawn
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-window-size
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-winston
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-with
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-wolfy87-eventemitter
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-woothee
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-wordwrap
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-wrap-ansi
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-wrap-fn
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-wrappy
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-write
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-write-file-atomic
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-ws
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-xdg-basedir
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-xml2js
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-xmlbuilder
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-xmlhttprequest
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-xmlhttprequest-ssl
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-xtend
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-y18n
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-yallist
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-yapool
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-yargs
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-yargs-parser
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-yarn
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-yeast
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-yn
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-zap
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-zeropad
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-zipfile
ExclusiveArch: %{nodejs_arches}
- nodejs-zlib-browserify
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-zlibjs
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodeunit
ExclusiveArch: %{nodejs_arches} noarch
- notify-sharp
ExclusiveArch: %{mono_arches}
- notify-sharp3
ExclusiveArch: %{mono_arches}
- nuget
ExclusiveArch: %{mono_arches}
- numatop
ExclusiveArch: x86_64 ppc64le
- nunit
ExclusiveArch: %{mono_arches}
- nunit2
ExclusiveArch: %{mono_arches}
- nvml
ExclusiveArch: x86_64
- nwchem
ExclusiveArch: x86_64 %{ix86}
- obs-service-rust2rpm
ExclusiveArch: %{rust_arches} noarch
- oci-kvm-hook
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- oci-seccomp-bpf-hook
ExclusiveArch: x86_64 %{power64} aarch64 s390x
- oci-umount
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le s390x %{mips}
- ocitools
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- oidn
ExclusiveArch: x86_64
- olpc-kbdshim
ExclusiveArch: %{ix86} %{arm}
- olpc-netutils
ExclusiveArch: %{ix86} %{arm}
- olpc-utils
ExclusiveArch: %{ix86} %{arm}
- onedrive
ExclusiveArch: %{ldc_arches}
- opal-prd
ExclusiveArch: ppc64le
- open-vm-tools
ExclusiveArch: x86_64
ExclusiveArch: %{ix86} x86_64
- openblas
ExclusiveArch: %{openblas_arches}
- openjfx
ExclusiveArch: %{ix86} x86_64
- openlibm
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 %{power64}
- openni
ExclusiveArch: %{ix86} x86_64 %{arm}
- openni-primesense
ExclusiveArch: %{ix86} x86_64 %{arm}
- openssl-ibmca
ExclusiveArch: s390 s390x
- origin
ExclusiveArch: %{go_arches}
ExclusiveArch: x86_64 aarch64 ppc64le s390x
- orion
ExclusiveArch: %{qt5_qtwebengine_arches}
- orthorobot
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips} aarch64 ppc64
- oshinko-cli
ExclusiveArch: %{go_arches}
ExclusiveArch: x86_64 aarch64 ppc64le s390x
- paflib
ExclusiveArch: ppc %{power64}
- pcc
ExclusiveArch: %{ix86} x86_64
- pcmciautils
ExclusiveArch: %{ix86} x86_64 ia64 ppc ppc64 %{arm}
- pdfmod
ExclusiveArch: %mono_arches
- peripety
ExclusiveArch: %{rust_arches}
- perl-Dumbbench
ExclusiveArch: %{ix86} x86_64 noarch
- perl-Parse-DMIDecode
ExclusiveArch: %{ix86} x86_64 ia64 aarch64
- pesign
ExclusiveArch: %{ix86} x86_64 ia64 aarch64 %{arm}
- pesign-test-app
ExclusiveArch: i686 x86_64 ia64 aarch64
- pinta
ExclusiveArch: %mono_arches
- pioneer
ExclusiveArch: %{ix86} x86_64
- pmdk-convert
ExclusiveArch: x86_64
- pmemkv
ExclusiveArch: x86_64
- pocl
ExclusiveArch: %{arm} aarch64 %{ix86} x86_64
- poppler-sharp
ExclusiveArch: %mono_arches
- popub
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- powerpc-utils
ExclusiveArch: ppc %{power64}
- ppc64-diag
ExclusiveArch: ppc %{power64}
- publican-jboss
ExclusiveArch: i686 x86_64
- pveclib
ExclusiveArch: ppc %{power64}
- pvs-sbcl
ExclusiveArch: %{ix86} x86_64 ppc sparcv9
- pyqtwebengine
ExclusiveArch: %{qt5_qtwebengine_arches}
- python-etcd
ExclusiveArch: noarch %{ix86} x86_64 %{arm} aarch64 ppc64le s390x
- python-healpy
ExclusiveArch: aarch64 ppc64 ppc64le x86_64 s390x
- python-javabridge
ExclusiveArch: i686 x86_64
- python-openoffice
ExclusiveArch: noarch x86_64
- python-pymoc
ExclusiveArch: aarch64 ppc64 ppc64le x86_64 s390x
- python-rpi-gpio
ExclusiveArch: %{arm} aarch64
- q4wine
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- qcint
ExclusiveArch: x86_64
- qclib
ExclusiveArch: s390 s390x
- qevercloud
ExclusiveArch: %{qt5_qtwebengine_arches}
- qmapshack
ExclusiveArch: %{qt5_qtwebengine_arches}
- qt4pas
ExclusiveArch: %{fpc_arches}
- qt5-qtwebengine
ExclusiveArch: %{qt5_qtwebengine_arches}
- quantum-espresso
ExclusiveArch: x86_64 %{ix86}
ExclusiveArch: x86_64 %{ix86}
- quentier
ExclusiveArch: %{qt5_qtwebengine_arches}
- reactfx
ExclusiveArch: %{ix86} x86_64 noarch
- rear
ExclusiveArch: %ix86 x86_64 ppc ppc64 ppc64le ia64
- redhat-lsb
ExclusiveArch: %{ix86} ia64 x86_64 ppc ppc64 s390 s390x %{arm} aarch64 ppc64le
- reg
ExclusiveArch: x86_64
- renderdoc
ExclusiveArch: %{ix86} x86_64
- reptyr
ExclusiveArch: %{ix86} x86_64 %{arm}
- rescene
ExclusiveArch: %{mono_arches}
- restsharp
ExclusiveArch: %{mono_arches}
- rhythmbox-alternative-toolbar
ExclusiveArch: %{ix86} %{arm} x86_64 ppc64 ppc64le
- rocm-runtime
ExclusiveArch: x86_64 aarch64
- rocminfo
ExclusiveArch: x86_64 aarch64
- rpm-ostree
ExclusiveArch: %{rust_arches}
- rssguard
ExclusiveArch: %{qt5_qtwebengine_arches}
- rubygem-childprocess
ExclusiveArch: %{ix86} x86_64 noarch
- runc
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le %{mips} s390x
- rust
ExclusiveArch: %{rust_arches}
- rust-abomonation
ExclusiveArch: %{rust_arches}
- rust-actix
ExclusiveArch: %{rust_arches}
- rust-actix-codec
ExclusiveArch: %{rust_arches}
- rust-actix-connect
ExclusiveArch: %{rust_arches}
- rust-actix-files
ExclusiveArch: %{rust_arches}
- rust-actix-http
ExclusiveArch: %{rust_arches}
- rust-actix-macros
ExclusiveArch: %{rust_arches}
- rust-actix-router
ExclusiveArch: %{rust_arches}
- rust-actix-rt
ExclusiveArch: %{rust_arches}
- rust-actix-server
ExclusiveArch: %{rust_arches}
- rust-actix-server-config
ExclusiveArch: %{rust_arches}
- rust-actix-service
ExclusiveArch: %{rust_arches}
- rust-actix-testing
ExclusiveArch: %{rust_arches}
- rust-actix-threadpool
ExclusiveArch: %{rust_arches}
- rust-actix-tls
ExclusiveArch: %{rust_arches}
- rust-actix-utils
ExclusiveArch: %{rust_arches}
- rust-actix-web
ExclusiveArch: %{rust_arches}
- rust-actix-web-codegen
ExclusiveArch: %{rust_arches}
- rust-actix_derive
ExclusiveArch: %{rust_arches}
- rust-addr2line
ExclusiveArch: %{rust_arches}
- rust-adler32
ExclusiveArch: %{rust_arches}
- rust-aes
ExclusiveArch: %{rust_arches}
- rust-aes-soft
ExclusiveArch: %{rust_arches}
- rust-afterburn
ExclusiveArch: %{rust_arches}
- rust-ahash
ExclusiveArch: %{rust_arches}
- rust-aho-corasick
ExclusiveArch: %{rust_arches}
- rust-alga
ExclusiveArch: %{rust_arches}
- rust-alga_derive
ExclusiveArch: %{rust_arches}
- rust-alloc-no-stdlib
ExclusiveArch: %{rust_arches}
- rust-alloc-stdlib
ExclusiveArch: %{rust_arches}
- rust-alphanumeric-sort
ExclusiveArch: %{rust_arches}
- rust-ammonia
ExclusiveArch: %{rust_arches}
- rust-ansi_colours
ExclusiveArch: %{rust_arches}
- rust-ansi_term
ExclusiveArch: %{rust_arches}
- rust-ansi_term0.11
ExclusiveArch: %{rust_arches}
- rust-antidote
ExclusiveArch: %{rust_arches}
- rust-aom-sys
ExclusiveArch: %{rust_arches}
- rust-approx
ExclusiveArch: %{rust_arches}
- rust-arbitrary
ExclusiveArch: %{rust_arches}
- rust-arc-swap
ExclusiveArch: %{rust_arches}
- rust-arg_enum_proc_macro
ExclusiveArch: %{rust_arches}
- rust-array-init
ExclusiveArch: %{rust_arches}
- rust-arraydeque
ExclusiveArch: %{rust_arches}
- rust-arrayref
ExclusiveArch: %{rust_arches}
- rust-arrayvec
ExclusiveArch: %{rust_arches}
- rust-ascii
ExclusiveArch: %{rust_arches}
- rust-askalono
ExclusiveArch: %{rust_arches}
- rust-askalono-cli
ExclusiveArch: %{rust_arches}
- rust-assert-json-diff
ExclusiveArch: %{rust_arches}
- rust-assert_matches
ExclusiveArch: %{rust_arches}
- rust-async-task
ExclusiveArch: %{rust_arches}
- rust-async-trait
ExclusiveArch: %{rust_arches}
- rust-atk
ExclusiveArch: %{rust_arches}
- rust-atk-sys
ExclusiveArch: %{rust_arches}
- rust-atom
ExclusiveArch: %{rust_arches}
- rust-atomicwrites
ExclusiveArch: %{rust_arches}
- rust-atty
ExclusiveArch: %{rust_arches}
- rust-autocfg
ExclusiveArch: %{rust_arches}
- rust-awc
ExclusiveArch: %{rust_arches}
- rust-backtrace
ExclusiveArch: %{rust_arches}
- rust-backtrace-sys
ExclusiveArch: %{rust_arches}
- rust-base100
ExclusiveArch: %{rust_arches}
- rust-base64
ExclusiveArch: %{rust_arches}
- rust-base64-0.10
ExclusiveArch: %{rust_arches}
- rust-bat
ExclusiveArch: %{rust_arches}
- rust-battery
ExclusiveArch: %{rust_arches}
- rust-bencher
ExclusiveArch: %{rust_arches}
- rust-better-panic
ExclusiveArch: %{rust_arches}
- rust-bincode
ExclusiveArch: %{rust_arches}
- rust-bincode0.8
ExclusiveArch: %{rust_arches}
- rust-bindgen
ExclusiveArch: %{rust_arches}
- rust-bit-set
ExclusiveArch: %{rust_arches}
- rust-bit-vec
ExclusiveArch: %{rust_arches}
- rust-bitflags
ExclusiveArch: %{rust_arches}
- rust-bitstream-io
ExclusiveArch: %{rust_arches}
- rust-blake2
ExclusiveArch: %{rust_arches}
- rust-blobby
ExclusiveArch: %{rust_arches}
- rust-block-buffer
ExclusiveArch: %{rust_arches}
- rust-block-cipher-trait
ExclusiveArch: %{rust_arches}
- rust-block-modes
ExclusiveArch: %{rust_arches}
- rust-block-padding
ExclusiveArch: %{rust_arches}
- rust-brev
ExclusiveArch: %{rust_arches}
- rust-brotli
ExclusiveArch: %{rust_arches}
- rust-brotli-decompressor
ExclusiveArch: %{rust_arches}
- rust-brotli-sys
ExclusiveArch: %{rust_arches}
- rust-brotli2
ExclusiveArch: %{rust_arches}
- rust-bstr
ExclusiveArch: %{rust_arches}
- rust-buf_redux
ExclusiveArch: %{rust_arches}
- rust-bufstream
ExclusiveArch: %{rust_arches}
- rust-build_const
ExclusiveArch: %{rust_arches}
- rust-byte-tools
ExclusiveArch: %{rust_arches}
- rust-byte-unit
ExclusiveArch: %{rust_arches}
- rust-bytecount
ExclusiveArch: %{rust_arches}
- rust-byteorder
ExclusiveArch: %{rust_arches}
- rust-bytes
ExclusiveArch: %{rust_arches}
- rust-bytes0.3
ExclusiveArch: %{rust_arches}
- rust-bytes0.4
ExclusiveArch: %{rust_arches}
- rust-bytesize
ExclusiveArch: %{rust_arches}
- rust-bytestring
ExclusiveArch: %{rust_arches}
- rust-c2-chacha
ExclusiveArch: %{rust_arches}
- rust-c_vec
ExclusiveArch: %{rust_arches}
- rust-cairo-rs
ExclusiveArch: %{rust_arches}
- rust-cairo-sys-rs
ExclusiveArch: %{rust_arches}
- rust-caps
ExclusiveArch: %{rust_arches}
- rust-cargo
ExclusiveArch: %{rust_arches}
- rust-cargo-bloat
ExclusiveArch: %{rust_arches}
- rust-cargo-c
ExclusiveArch: %{rust_arches}
- rust-cargo-husky
ExclusiveArch: %{rust_arches}
- rust-cargo_metadata
ExclusiveArch: %{rust_arches}
- rust-cassowary
ExclusiveArch: %{rust_arches}
- rust-cast
ExclusiveArch: %{rust_arches}
- rust-cbindgen
ExclusiveArch: %{rust_arches}
- rust-cc
ExclusiveArch: %{rust_arches}
- rust-cexpr
ExclusiveArch: %{rust_arches}
- rust-cfg-if
ExclusiveArch: %{rust_arches}
- rust-chainerror
ExclusiveArch: %{rust_arches}
- rust-charset
ExclusiveArch: %{rust_arches}
- rust-chbs
ExclusiveArch: %{rust_arches}
- rust-checked_int_cast
ExclusiveArch: %{rust_arches}
- rust-chrono
ExclusiveArch: %{rust_arches}
- rust-chrono-humanize
ExclusiveArch: %{rust_arches}
- rust-chrono-tz
ExclusiveArch: %{rust_arches}
- rust-chunked_transfer
ExclusiveArch: %{rust_arches}
- rust-clang-sys
ExclusiveArch: %{rust_arches}
- rust-clap
ExclusiveArch: %{rust_arches}
- rust-clicolors-control
ExclusiveArch: %{rust_arches}
- rust-cmake
ExclusiveArch: %{rust_arches}
- rust-color_quant
ExclusiveArch: %{rust_arches}
- rust-colored
ExclusiveArch: %{rust_arches}
- rust-colored_json
ExclusiveArch: %{rust_arches}
- rust-compiletest_rs
ExclusiveArch: %{rust_arches}
- rust-comrak
ExclusiveArch: %{rust_arches}
- rust-config
ExclusiveArch: %{rust_arches}
- rust-console
ExclusiveArch: %{rust_arches}
- rust-const-random
ExclusiveArch: %{rust_arches}
- rust-const-random-macro
ExclusiveArch: %{rust_arches}
- rust-content_inspector
ExclusiveArch: %{rust_arches}
- rust-cookie
ExclusiveArch: %{rust_arches}
- rust-cookie_store
ExclusiveArch: %{rust_arches}
- rust-copyless
ExclusiveArch: %{rust_arches}
- rust-coreos-installer
ExclusiveArch: %{rust_arches}
- rust-cpio
ExclusiveArch: %{rust_arches}
- rust-cpp_demangle
ExclusiveArch: %{rust_arches}
- rust-crates-io
ExclusiveArch: %{rust_arches}
- rust-crc
ExclusiveArch: %{rust_arches}
- rust-crc-core
ExclusiveArch: %{rust_arches}
- rust-crc32fast
ExclusiveArch: %{rust_arches}
- rust-criterion
ExclusiveArch: %{rust_arches}
- rust-criterion-plot
ExclusiveArch: %{rust_arches}
- rust-crossbeam
ExclusiveArch: %{rust_arches}
- rust-crossbeam-channel
ExclusiveArch: %{rust_arches}
- rust-crossbeam-channel0.3
ExclusiveArch: %{rust_arches}
- rust-crossbeam-deque
ExclusiveArch: %{rust_arches}
- rust-crossbeam-epoch
ExclusiveArch: %{rust_arches}
- rust-crossbeam-queue
ExclusiveArch: %{rust_arches}
- rust-crossbeam-queue0.1
ExclusiveArch: %{rust_arches}
- rust-crossbeam-utils
ExclusiveArch: %{rust_arches}
- rust-crossbeam-utils0.6
ExclusiveArch: %{rust_arches}
- rust-crossterm
ExclusiveArch: %{rust_arches}
- rust-crypto-hash
ExclusiveArch: %{rust_arches}
- rust-crypto-mac
ExclusiveArch: %{rust_arches}
- rust-cryptovec
ExclusiveArch: %{rust_arches}
- rust-cssparser
ExclusiveArch: %{rust_arches}
- rust-cssparser-macros
ExclusiveArch: %{rust_arches}
- rust-csv
ExclusiveArch: %{rust_arches}
- rust-csv-core
ExclusiveArch: %{rust_arches}
- rust-ctrlc
ExclusiveArch: %{rust_arches}
- rust-curl
ExclusiveArch: %{rust_arches}
- rust-curl-sys
ExclusiveArch: %{rust_arches}
- rust-custom_derive
ExclusiveArch: %{rust_arches}
- rust-darling
ExclusiveArch: %{rust_arches}
- rust-darling_core
ExclusiveArch: %{rust_arches}
- rust-darling_macro
ExclusiveArch: %{rust_arches}
- rust-data-encoding
ExclusiveArch: %{rust_arches}
- rust-data-url
ExclusiveArch: %{rust_arches}
- rust-datetime
ExclusiveArch: %{rust_arches}
- rust-dav1d-sys
ExclusiveArch: %{rust_arches}
- rust-dbus
ExclusiveArch: %{rust_arches}
- rust-dbus0.2
ExclusiveArch: %{rust_arches}
- rust-decimal
ExclusiveArch: %{rust_arches}
- rust-deflate
ExclusiveArch: %{rust_arches}
- rust-defmac
ExclusiveArch: %{rust_arches}
- rust-delta_e
ExclusiveArch: %{rust_arches}
- rust-derive_builder
ExclusiveArch: %{rust_arches}
- rust-derive_builder_core
ExclusiveArch: %{rust_arches}
- rust-derive_more
ExclusiveArch: %{rust_arches}
- rust-deunicode
ExclusiveArch: %{rust_arches}
- rust-devicemapper
ExclusiveArch: %{rust_arches}
- rust-diff
ExclusiveArch: %{rust_arches}
- rust-difference
ExclusiveArch: %{rust_arches}
- rust-digest
ExclusiveArch: %{rust_arches}
- rust-directories
ExclusiveArch: %{rust_arches}
- rust-dirs
ExclusiveArch: %{rust_arches}
- rust-dirs-sys
ExclusiveArch: %{rust_arches}
- rust-dns-parser
ExclusiveArch: %{rust_arches}
- rust-doc-comment
ExclusiveArch: %{rust_arches}
- rust-docmatic
ExclusiveArch: %{rust_arches}
- rust-docopt
ExclusiveArch: %{rust_arches}
- rust-downcast-rs
ExclusiveArch: %{rust_arches}
- rust-dtoa
ExclusiveArch: %{rust_arches}
- rust-dtoa-short
ExclusiveArch: %{rust_arches}
- rust-duct
ExclusiveArch: %{rust_arches}
- rust-dutree
ExclusiveArch: %{rust_arches}
- rust-edit-distance
ExclusiveArch: %{rust_arches}
- rust-either
ExclusiveArch: %{rust_arches}
- rust-elasticlunr-rs
ExclusiveArch: %{rust_arches}
- rust-encode_unicode
ExclusiveArch: %{rust_arches}
- rust-encoding
ExclusiveArch: %{rust_arches}
- rust-encoding-index-japanese
ExclusiveArch: %{rust_arches}
- rust-encoding-index-korean
ExclusiveArch: %{rust_arches}
- rust-encoding-index-simpchinese
ExclusiveArch: %{rust_arches}
- rust-encoding-index-singlebyte
ExclusiveArch: %{rust_arches}
- rust-encoding-index-tradchinese
ExclusiveArch: %{rust_arches}
- rust-encoding_index_tests
ExclusiveArch: %{rust_arches}
- rust-encoding_rs
ExclusiveArch: %{rust_arches}
- rust-encoding_rs_io
ExclusiveArch: %{rust_arches}
- rust-entities
ExclusiveArch: %{rust_arches}
- rust-enum-as-inner
ExclusiveArch: %{rust_arches}
- rust-enum_primitive
ExclusiveArch: %{rust_arches}
- rust-env_logger
ExclusiveArch: %{rust_arches}
- rust-env_logger0.4
ExclusiveArch: %{rust_arches}
- rust-env_logger0.5
ExclusiveArch: %{rust_arches}
- rust-env_logger0.6
ExclusiveArch: %{rust_arches}
- rust-envsubst
ExclusiveArch: %{rust_arches}
- rust-erased-serde
ExclusiveArch: %{rust_arches}
- rust-err-derive
ExclusiveArch: %{rust_arches}
- rust-errln
ExclusiveArch: %{rust_arches}
- rust-errno
ExclusiveArch: %{rust_arches}
- rust-error-chain
ExclusiveArch: %{rust_arches}
- rust-exa
ExclusiveArch: %{rust_arches}
- rust-extprim
ExclusiveArch: %{rust_arches}
- rust-extprim_literals_macros
ExclusiveArch: %{rust_arches}
- rust-fail
ExclusiveArch: %{rust_arches}
- rust-failure
ExclusiveArch: %{rust_arches}
- rust-failure-tools
ExclusiveArch: %{rust_arches}
- rust-failure_derive
ExclusiveArch: %{rust_arches}
- rust-fake-simd
ExclusiveArch: %{rust_arches}
- rust-fake_clock
ExclusiveArch: %{rust_arches}
- rust-fallible-iterator
ExclusiveArch: %{rust_arches}
- rust-fd-find
ExclusiveArch: %{rust_arches}
- rust-fedora-coreos-pinger
ExclusiveArch: %{rust_arches}
- rust-fern
ExclusiveArch: %{rust_arches}
- rust-ffsend
ExclusiveArch: %{rust_arches}
- rust-ffsend-api
ExclusiveArch: %{rust_arches}
- rust-filetime
ExclusiveArch: %{rust_arches}
- rust-findshlibs
ExclusiveArch: %{rust_arches}
- rust-fixedbitset
ExclusiveArch: %{rust_arches}
- rust-flame
ExclusiveArch: %{rust_arches}
- rust-flate2
ExclusiveArch: %{rust_arches}
- rust-float-cmp
ExclusiveArch: %{rust_arches}
- rust-fnv
ExclusiveArch: %{rust_arches}
- rust-foreign-types
ExclusiveArch: %{rust_arches}
- rust-foreign-types-shared
ExclusiveArch: %{rust_arches}
- rust-fragile
ExclusiveArch: %{rust_arches}
- rust-fs2
ExclusiveArch: %{rust_arches}
- rust-fs_extra
ExclusiveArch: %{rust_arches}
- rust-fuse
ExclusiveArch: %{rust_arches}
- rust-futf
ExclusiveArch: %{rust_arches}
- rust-futures
ExclusiveArch: %{rust_arches}
- rust-futures-channel
ExclusiveArch: %{rust_arches}
- rust-futures-core
ExclusiveArch: %{rust_arches}
- rust-futures-cpupool
ExclusiveArch: %{rust_arches}
- rust-futures-executor
ExclusiveArch: %{rust_arches}
- rust-futures-io
ExclusiveArch: %{rust_arches}
- rust-futures-macro
ExclusiveArch: %{rust_arches}
- rust-futures-sink
ExclusiveArch: %{rust_arches}
- rust-futures-task
ExclusiveArch: %{rust_arches}
- rust-futures-util
ExclusiveArch: %{rust_arches}
- rust-futures0.1
ExclusiveArch: %{rust_arches}
- rust-fuzzy-matcher
ExclusiveArch: %{rust_arches}
- rust-fxhash
ExclusiveArch: %{rust_arches}
- rust-gcsf
ExclusiveArch: %{rust_arches}
- rust-gdk
ExclusiveArch: %{rust_arches}
- rust-gdk-pixbuf
ExclusiveArch: %{rust_arches}
- rust-gdk-pixbuf-sys
ExclusiveArch: %{rust_arches}
- rust-gdk-sys
ExclusiveArch: %{rust_arches}
- rust-generic-array
ExclusiveArch: %{rust_arches}
- rust-gethostname
ExclusiveArch: %{rust_arches}
- rust-getopts
ExclusiveArch: %{rust_arches}
- rust-getrandom
ExclusiveArch: %{rust_arches}
- rust-gettext-rs
ExclusiveArch: %{rust_arches}
- rust-gettext-sys
ExclusiveArch: %{rust_arches}
- rust-gif
ExclusiveArch: %{rust_arches}
- rust-gimli
ExclusiveArch: %{rust_arches}
- rust-gio
ExclusiveArch: %{rust_arches}
- rust-gio-sys
ExclusiveArch: %{rust_arches}
- rust-gir-format-check
ExclusiveArch: %{rust_arches}
- rust-git2
ExclusiveArch: %{rust_arches}
- rust-git2-curl
ExclusiveArch: %{rust_arches}
- rust-glib
ExclusiveArch: %{rust_arches}
- rust-glib-sys
ExclusiveArch: %{rust_arches}
- rust-glob
ExclusiveArch: %{rust_arches}
- rust-globset
ExclusiveArch: %{rust_arches}
- rust-globwalk
ExclusiveArch: %{rust_arches}
- rust-gobject-sys
ExclusiveArch: %{rust_arches}
- rust-goblin
ExclusiveArch: %{rust_arches}
- rust-google-drive3-fork
ExclusiveArch: %{rust_arches}
- rust-grep
ExclusiveArch: %{rust_arches}
- rust-grep-cli
ExclusiveArch: %{rust_arches}
- rust-grep-matcher
ExclusiveArch: %{rust_arches}
- rust-grep-pcre2
ExclusiveArch: %{rust_arches}
- rust-grep-printer
ExclusiveArch: %{rust_arches}
- rust-grep-regex
ExclusiveArch: %{rust_arches}
- rust-grep-searcher
ExclusiveArch: %{rust_arches}
- rust-groupable
ExclusiveArch: %{rust_arches}
- rust-gspell
ExclusiveArch: %{rust_arches}
- rust-gspell-sys
ExclusiveArch: %{rust_arches}
- rust-gstreamer
ExclusiveArch: %{rust_arches}
- rust-gstreamer-audio
ExclusiveArch: %{rust_arches}
- rust-gstreamer-audio-sys
ExclusiveArch: %{rust_arches}
- rust-gstreamer-base
ExclusiveArch: %{rust_arches}
- rust-gstreamer-base-sys
ExclusiveArch: %{rust_arches}
- rust-gstreamer-editing-services
ExclusiveArch: %{rust_arches}
- rust-gstreamer-editing-services-sys
ExclusiveArch: %{rust_arches}
- rust-gstreamer-pbutils
ExclusiveArch: %{rust_arches}
- rust-gstreamer-pbutils-sys
ExclusiveArch: %{rust_arches}
- rust-gstreamer-player
ExclusiveArch: %{rust_arches}
- rust-gstreamer-player-sys
ExclusiveArch: %{rust_arches}
- rust-gstreamer-sys
ExclusiveArch: %{rust_arches}
- rust-gstreamer-video
ExclusiveArch: %{rust_arches}
- rust-gstreamer-video-sys
ExclusiveArch: %{rust_arches}
- rust-gtk
ExclusiveArch: %{rust_arches}
- rust-gtk-rs-lgpl-docs
ExclusiveArch: %{rust_arches}
- rust-gtk-source-sys
ExclusiveArch: %{rust_arches}
- rust-gtk-sys
ExclusiveArch: %{rust_arches}
- rust-gzip-header
ExclusiveArch: %{rust_arches}
- rust-h2
ExclusiveArch: %{rust_arches}
- rust-h2-0.1
ExclusiveArch: %{rust_arches}
- rust-half
ExclusiveArch: %{rust_arches}
- rust-hamcrest
ExclusiveArch: %{rust_arches}
- rust-handlebars
ExclusiveArch: %{rust_arches}
- rust-hashbrown
ExclusiveArch: %{rust_arches}
- rust-hashbrown0.5
ExclusiveArch: %{rust_arches}
- rust-headers
ExclusiveArch: %{rust_arches}
- rust-headers-core
ExclusiveArch: %{rust_arches}
- rust-headers-derive
ExclusiveArch: %{rust_arches}
- rust-heapsize
ExclusiveArch: %{rust_arches}
- rust-heck
ExclusiveArch: %{rust_arches}
- rust-hex
ExclusiveArch: %{rust_arches}
- rust-hex-literal
ExclusiveArch: %{rust_arches}
- rust-hex-literal-impl
ExclusiveArch: %{rust_arches}
- rust-hexyl
ExclusiveArch: %{rust_arches}
- rust-hkdf
ExclusiveArch: %{rust_arches}
- rust-hmac
ExclusiveArch: %{rust_arches}
- rust-home
ExclusiveArch: %{rust_arches}
- rust-horrorshow
ExclusiveArch: %{rust_arches}
- rust-hostname
ExclusiveArch: %{rust_arches}
- rust-html2pango
ExclusiveArch: %{rust_arches}
- rust-html5ever
ExclusiveArch: %{rust_arches}
- rust-http
ExclusiveArch: %{rust_arches}
- rust-http-body
ExclusiveArch: %{rust_arches}
- rust-http0.1
ExclusiveArch: %{rust_arches}
- rust-httparse
ExclusiveArch: %{rust_arches}
- rust-humansize
ExclusiveArch: %{rust_arches}
- rust-humantime
ExclusiveArch: %{rust_arches}
- rust-hyper
ExclusiveArch: %{rust_arches}
- rust-hyper-native-tls
ExclusiveArch: %{rust_arches}
- rust-hyper-tls
ExclusiveArch: %{rust_arches}
- rust-hyper0.10
ExclusiveArch: %{rust_arches}
- rust-hyperfine
ExclusiveArch: %{rust_arches}
- rust-i3ipc
ExclusiveArch: %{rust_arches}
- rust-id_tree
ExclusiveArch: %{rust_arches}
- rust-ident_case
ExclusiveArch: %{rust_arches}
- rust-idna
ExclusiveArch: %{rust_arches}
- rust-idna0.1
ExclusiveArch: %{rust_arches}
- rust-ignore
ExclusiveArch: %{rust_arches}
- rust-im-rc
ExclusiveArch: %{rust_arches}
- rust-image
ExclusiveArch: %{rust_arches}
- rust-imgref
ExclusiveArch: %{rust_arches}
- rust-indexmap
ExclusiveArch: %{rust_arches}
- rust-indicatif
ExclusiveArch: %{rust_arches}
- rust-inflate
ExclusiveArch: %{rust_arches}
- rust-inotify
ExclusiveArch: %{rust_arches}
- rust-inotify-sys
ExclusiveArch: %{rust_arches}
- rust-input_buffer
ExclusiveArch: %{rust_arches}
- rust-interpolate_name
ExclusiveArch: %{rust_arches}
- rust-intervaltree
ExclusiveArch: %{rust_arches}
- rust-iovec
ExclusiveArch: %{rust_arches}
- rust-ipnet
ExclusiveArch: %{rust_arches}
- rust-ipnetwork
ExclusiveArch: %{rust_arches}
- rust-iron
ExclusiveArch: %{rust_arches}
- rust-iso8601
ExclusiveArch: %{rust_arches}
- rust-iter-read
ExclusiveArch: %{rust_arches}
- rust-itertools
ExclusiveArch: %{rust_arches}
- rust-itertools-num
ExclusiveArch: %{rust_arches}
- rust-itoa
ExclusiveArch: %{rust_arches}
- rust-ivf
ExclusiveArch: %{rust_arches}
- rust-jetscii
ExclusiveArch: %{rust_arches}
- rust-jobserver
ExclusiveArch: %{rust_arches}
- rust-jpeg-decoder
ExclusiveArch: %{rust_arches}
- rust-jql
ExclusiveArch: %{rust_arches}
- rust-jwalk
ExclusiveArch: %{rust_arches}
- rust-lab
ExclusiveArch: %{rust_arches}
- rust-language-tags
ExclusiveArch: %{rust_arches}
- rust-lazy-init
ExclusiveArch: %{rust_arches}
- rust-lazy_static
ExclusiveArch: %{rust_arches}
- rust-lazycell
ExclusiveArch: %{rust_arches}
- rust-letter-avatar
ExclusiveArch: %{rust_arches}
- rust-lexical-core
ExclusiveArch: %{rust_arches}
- rust-lexical-core0.4
ExclusiveArch: %{rust_arches}
- rust-libc
ExclusiveArch: %{rust_arches}
- rust-libdbus-sys
ExclusiveArch: %{rust_arches}
- rust-libflate
ExclusiveArch: %{rust_arches}
- rust-libgit2-sys
ExclusiveArch: %{rust_arches}
- rust-libhandy
ExclusiveArch: %{rust_arches}
- rust-libhandy-sys
ExclusiveArch: %{rust_arches}
- rust-libloading
ExclusiveArch: %{rust_arches}
- rust-libm
ExclusiveArch: %{rust_arches}
- rust-libmount
ExclusiveArch: %{rust_arches}
- rust-liboverdrop
ExclusiveArch: %{rust_arches}
- rust-libpulse-binding
ExclusiveArch: %{rust_arches}
- rust-libpulse-sys
ExclusiveArch: %{rust_arches}
- rust-libssh2-sys
ExclusiveArch: %{rust_arches}
- rust-libsystemd
ExclusiveArch: %{rust_arches}
- rust-libudev
ExclusiveArch: %{rust_arches}
- rust-libudev-sys
ExclusiveArch: %{rust_arches}
- rust-libz-sys
ExclusiveArch: %{rust_arches}
- rust-line-wrap
ExclusiveArch: %{rust_arches}
- rust-linked-hash-map
ExclusiveArch: %{rust_arches}
- rust-linkify
ExclusiveArch: %{rust_arches}
- rust-lipsum
ExclusiveArch: %{rust_arches}
- rust-lmdb
ExclusiveArch: %{rust_arches}
- rust-lmdb-sys
ExclusiveArch: %{rust_arches}
- rust-locale
ExclusiveArch: %{rust_arches}
- rust-locale_config
ExclusiveArch: %{rust_arches}
- rust-lock_api
ExclusiveArch: %{rust_arches}
- rust-log
ExclusiveArch: %{rust_arches}
- rust-log0.3
ExclusiveArch: %{rust_arches}
- rust-loggerv
ExclusiveArch: %{rust_arches}
- rust-loopdev
ExclusiveArch: %{rust_arches}
- rust-lru-cache
ExclusiveArch: %{rust_arches}
- rust-lru_time_cache
ExclusiveArch: %{rust_arches}
- rust-lscolors
ExclusiveArch: %{rust_arches}
- rust-lsd
ExclusiveArch: %{rust_arches}
- rust-lzma-sys
ExclusiveArch: %{rust_arches}
- rust-lzw
ExclusiveArch: %{rust_arches}
- rust-mac
ExclusiveArch: %{rust_arches}
- rust-macro-attr
ExclusiveArch: %{rust_arches}
- rust-maildir
ExclusiveArch: %{rust_arches}
- rust-mailparse
ExclusiveArch: %{rust_arches}
- rust-man
ExclusiveArch: %{rust_arches}
- rust-maplit
ExclusiveArch: %{rust_arches}
- rust-markup5ever
ExclusiveArch: %{rust_arches}
- rust-matches
ExclusiveArch: %{rust_arches}
- rust-matrixmultiply
ExclusiveArch: %{rust_arches}
- rust-maxminddb
ExclusiveArch: %{rust_arches}
- rust-md-5
ExclusiveArch: %{rust_arches}
- rust-md5
ExclusiveArch: %{rust_arches}
- rust-mdl
ExclusiveArch: %{rust_arches}
- rust-memchr
ExclusiveArch: %{rust_arches}
- rust-memmap
ExclusiveArch: %{rust_arches}
- rust-memoffset
ExclusiveArch: %{rust_arches}
- rust-metadeps
ExclusiveArch: %{rust_arches}
- rust-mime
ExclusiveArch: %{rust_arches}
- rust-mime-sniffer
ExclusiveArch: %{rust_arches}
- rust-mime0.2
ExclusiveArch: %{rust_arches}
- rust-mime_guess
ExclusiveArch: %{rust_arches}
- rust-mime_guess1
ExclusiveArch: %{rust_arches}
- rust-miniz-sys
ExclusiveArch: %{rust_arches}
- rust-miniz_oxide
ExclusiveArch: %{rust_arches}
- rust-miniz_oxide_c_api
ExclusiveArch: %{rust_arches}
- rust-mint
ExclusiveArch: %{rust_arches}
- rust-mio
ExclusiveArch: %{rust_arches}
- rust-mio-extras
ExclusiveArch: %{rust_arches}
- rust-mio-uds
ExclusiveArch: %{rust_arches}
- rust-mktemp
ExclusiveArch: %{rust_arches}
- rust-mnt
ExclusiveArch: %{rust_arches}
- rust-mockito
ExclusiveArch: %{rust_arches}
- rust-modifier
ExclusiveArch: %{rust_arches}
- rust-muldiv
ExclusiveArch: %{rust_arches}
- rust-multimap
ExclusiveArch: %{rust_arches}
- rust-multipart
ExclusiveArch: %{rust_arches}
- rust-mustache
ExclusiveArch: %{rust_arches}
- rust-nalgebra
ExclusiveArch: %{rust_arches}
- rust-nasm-rs
ExclusiveArch: %{rust_arches}
- rust-native-tls
ExclusiveArch: %{rust_arches}
- rust-natord
ExclusiveArch: %{rust_arches}
- rust-net2
ExclusiveArch: %{rust_arches}
- rust-netmap_sys
ExclusiveArch: %{rust_arches}
- rust-new_debug_unreachable
ExclusiveArch: %{rust_arches}
- rust-newtype_derive
ExclusiveArch: %{rust_arches}
- rust-nickel
ExclusiveArch: %{rust_arches}
- rust-nix
ExclusiveArch: %{rust_arches}
- rust-nix0.14
ExclusiveArch: %{rust_arches}
- rust-no-panic
ExclusiveArch: %{rust_arches}
- rust-nodrop
ExclusiveArch: %{rust_arches}
- rust-nom
ExclusiveArch: %{rust_arches}
- rust-nom4
ExclusiveArch: %{rust_arches}
- rust-noop_proc_macro
ExclusiveArch: %{rust_arches}
- rust-normalize-line-endings
ExclusiveArch: %{rust_arches}
- rust-notify
ExclusiveArch: %{rust_arches}
- rust-num
ExclusiveArch: %{rust_arches}
- rust-num-bigint
ExclusiveArch: %{rust_arches}
- rust-num-complex
ExclusiveArch: %{rust_arches}
- rust-num-derive
ExclusiveArch: %{rust_arches}
- rust-num-integer
ExclusiveArch: %{rust_arches}
- rust-num-iter
ExclusiveArch: %{rust_arches}
- rust-num-rational
ExclusiveArch: %{rust_arches}
- rust-num-traits
ExclusiveArch: %{rust_arches}
- rust-num-traits0.1
ExclusiveArch: %{rust_arches}
- rust-num_cpus
ExclusiveArch: %{rust_arches}
- rust-number_prefix
ExclusiveArch: %{rust_arches}
- rust-numtoa
ExclusiveArch: %{rust_arches}
- rust-object
ExclusiveArch: %{rust_arches}
- rust-objekt
ExclusiveArch: %{rust_arches}
- rust-odds
ExclusiveArch: %{rust_arches}
- rust-once_cell
ExclusiveArch: %{rust_arches}
- rust-onig
ExclusiveArch: %{rust_arches}
- rust-onig_sys
ExclusiveArch: %{rust_arches}
- rust-opaque-debug
ExclusiveArch: %{rust_arches}
- rust-open
ExclusiveArch: %{rust_arches}
- rust-opener
ExclusiveArch: %{rust_arches}
- rust-openssh-keys
ExclusiveArch: %{rust_arches}
- rust-openssl
ExclusiveArch: %{rust_arches}
- rust-openssl-probe
ExclusiveArch: %{rust_arches}
- rust-openssl-sys
ExclusiveArch: %{rust_arches}
- rust-ord_subset
ExclusiveArch: %{rust_arches}
- rust-ordered-float
ExclusiveArch: %{rust_arches}
- rust-os_info
ExclusiveArch: %{rust_arches}
- rust-os_pipe
ExclusiveArch: %{rust_arches}
- rust-osstrtools
ExclusiveArch: %{rust_arches}
- rust-owning_ref
ExclusiveArch: %{rust_arches}
- rust-packaging
ExclusiveArch: %{rust_arches}
- rust-pad
ExclusiveArch: %{rust_arches}
- rust-pager
ExclusiveArch: %{rust_arches}
- rust-pango
ExclusiveArch: %{rust_arches}
- rust-pango-sys
ExclusiveArch: %{rust_arches}
- rust-pangocairo
ExclusiveArch: %{rust_arches}
- rust-pangocairo-sys
ExclusiveArch: %{rust_arches}
- rust-parity-wasm
ExclusiveArch: %{rust_arches}
- rust-parking_lot
ExclusiveArch: %{rust_arches}
- rust-parking_lot_core
ExclusiveArch: %{rust_arches}
- rust-parse-zoneinfo
ExclusiveArch: %{rust_arches}
- rust-partial-io
ExclusiveArch: %{rust_arches}
- rust-paste
ExclusiveArch: %{rust_arches}
- rust-paste-impl
ExclusiveArch: %{rust_arches}
- rust-path-slash
ExclusiveArch: %{rust_arches}
- rust-pathdiff
ExclusiveArch: %{rust_arches}
- rust-pbr
ExclusiveArch: %{rust_arches}
- rust-pcap
ExclusiveArch: %{rust_arches}
- rust-pcre2
ExclusiveArch: %{rust_arches}
- rust-pcre2-sys
ExclusiveArch: %{rust_arches}
- rust-peeking_take_while
ExclusiveArch: %{rust_arches}
- rust-peg
ExclusiveArch: %{rust_arches}
- rust-percent-encoding
ExclusiveArch: %{rust_arches}
- rust-percent-encoding1
ExclusiveArch: %{rust_arches}
- rust-permutate
ExclusiveArch: %{rust_arches}
- rust-permutohedron
ExclusiveArch: %{rust_arches}
- rust-pest
ExclusiveArch: %{rust_arches}
- rust-pest_derive
ExclusiveArch: %{rust_arches}
- rust-pest_generator
ExclusiveArch: %{rust_arches}
- rust-pest_meta
ExclusiveArch: %{rust_arches}
- rust-petgraph
ExclusiveArch: %{rust_arches}
- rust-phf
ExclusiveArch: %{rust_arches}
- rust-phf_codegen
ExclusiveArch: %{rust_arches}
- rust-phf_generator
ExclusiveArch: %{rust_arches}
- rust-phf_shared
ExclusiveArch: %{rust_arches}
- rust-pin-project
ExclusiveArch: %{rust_arches}
- rust-pin-project-internal
ExclusiveArch: %{rust_arches}
- rust-pin-project-lite
ExclusiveArch: %{rust_arches}
- rust-pin-utils
ExclusiveArch: %{rust_arches}
- rust-pkg-config
ExclusiveArch: %{rust_arches}
- rust-plain
ExclusiveArch: %{rust_arches}
- rust-plist
ExclusiveArch: %{rust_arches}
- rust-plugin
ExclusiveArch: %{rust_arches}
- rust-pnet_base
ExclusiveArch: %{rust_arches}
- rust-pnet_datalink
ExclusiveArch: %{rust_arches}
- rust-pnet_sys
ExclusiveArch: %{rust_arches}
- rust-png
ExclusiveArch: %{rust_arches}
- rust-ppv-lite86
ExclusiveArch: %{rust_arches}
- rust-precomputed-hash
ExclusiveArch: %{rust_arches}
- rust-predicates-core
ExclusiveArch: %{rust_arches}
- rust-predicates-tree
ExclusiveArch: %{rust_arches}
- rust-pretty-git-prompt
ExclusiveArch: %{rust_arches}
- rust-pretty_assertions
ExclusiveArch: %{rust_arches}
- rust-pretty_env_logger
ExclusiveArch: %{rust_arches}
- rust-prettytable-rs
ExclusiveArch: %{rust_arches}
- rust-proc-macro-error
ExclusiveArch: %{rust_arches}
- rust-proc-macro-error-attr
ExclusiveArch: %{rust_arches}
- rust-proc-macro-hack
ExclusiveArch: %{rust_arches}
- rust-proc-macro-nested
ExclusiveArch: %{rust_arches}
- rust-proc-macro2
ExclusiveArch: %{rust_arches}
- rust-proc-macro2-0.4
ExclusiveArch: %{rust_arches}
- rust-procedural-masquerade
ExclusiveArch: %{rust_arches}
- rust-progress-streams
ExclusiveArch: %{rust_arches}
- rust-prometheus
ExclusiveArch: %{rust_arches}
- rust-proptest
ExclusiveArch: %{rust_arches}
- rust-proptest-derive
ExclusiveArch: %{rust_arches}
- rust-protobuf
ExclusiveArch: %{rust_arches}
- rust-protobuf-codegen
ExclusiveArch: %{rust_arches}
- rust-protoc
ExclusiveArch: %{rust_arches}
- rust-protoc-rust
ExclusiveArch: %{rust_arches}
- rust-psm
ExclusiveArch: %{rust_arches}
- rust-publicsuffix
ExclusiveArch: %{rust_arches}
- rust-pulldown-cmark
ExclusiveArch: %{rust_arches}
- rust-pulse
ExclusiveArch: %{rust_arches}
- rust-qr2term
ExclusiveArch: %{rust_arches}
- rust-qrcode
ExclusiveArch: %{rust_arches}
- rust-quick-error
ExclusiveArch: %{rust_arches}
- rust-quickcheck
ExclusiveArch: %{rust_arches}
- rust-quickcheck0.6
ExclusiveArch: %{rust_arches}
- rust-quickersort
ExclusiveArch: %{rust_arches}
- rust-quote
ExclusiveArch: %{rust_arches}
- rust-quote0.3
ExclusiveArch: %{rust_arches}
- rust-quote0.6
ExclusiveArch: %{rust_arches}
- rust-quoted_printable
ExclusiveArch: %{rust_arches}
- rust-rand
ExclusiveArch: %{rust_arches}
- rust-rand0.4
ExclusiveArch: %{rust_arches}
- rust-rand0.5
ExclusiveArch: %{rust_arches}
- rust-rand0.6
ExclusiveArch: %{rust_arches}
- rust-rand_chacha
ExclusiveArch: %{rust_arches}
- rust-rand_chacha0.1
ExclusiveArch: %{rust_arches}
- rust-rand_core
ExclusiveArch: %{rust_arches}
- rust-rand_core0.3
ExclusiveArch: %{rust_arches}
- rust-rand_core0.4
ExclusiveArch: %{rust_arches}
- rust-rand_hc
ExclusiveArch: %{rust_arches}
- rust-rand_hc0.1
ExclusiveArch: %{rust_arches}
- rust-rand_isaac
ExclusiveArch: %{rust_arches}
- rust-rand_isaac0.1
ExclusiveArch: %{rust_arches}
- rust-rand_jitter
ExclusiveArch: %{rust_arches}
- rust-rand_jitter0.1
ExclusiveArch: %{rust_arches}
- rust-rand_os
ExclusiveArch: %{rust_arches}
- rust-rand_os0.1
ExclusiveArch: %{rust_arches}
- rust-rand_pcg
ExclusiveArch: %{rust_arches}
- rust-rand_pcg0.1
ExclusiveArch: %{rust_arches}
- rust-rand_xorshift
ExclusiveArch: %{rust_arches}
- rust-rand_xorshift0.1
ExclusiveArch: %{rust_arches}
- rust-rand_xoshiro
ExclusiveArch: %{rust_arches}
- rust-rawpointer
ExclusiveArch: %{rust_arches}
- rust-rawslice
ExclusiveArch: %{rust_arches}
- rust-rayon
ExclusiveArch: %{rust_arches}
- rust-rayon-core
ExclusiveArch: %{rust_arches}
- rust-recycler
ExclusiveArch: %{rust_arches}
- rust-regex
ExclusiveArch: %{rust_arches}
- rust-regex-automata
ExclusiveArch: %{rust_arches}
- rust-regex-syntax
ExclusiveArch: %{rust_arches}
- rust-region
ExclusiveArch: %{rust_arches}
- rust-relay
ExclusiveArch: %{rust_arches}
- rust-remove_dir_all
ExclusiveArch: %{rust_arches}
- rust-reqwest
ExclusiveArch: %{rust_arches}
- rust-resize
ExclusiveArch: %{rust_arches}
- rust-resolv-conf
ExclusiveArch: %{rust_arches}
- rust-restson
ExclusiveArch: %{rust_arches}
- rust-rgb
ExclusiveArch: %{rust_arches}
- rust-ripgrep
ExclusiveArch: %{rust_arches}
- rust-rmp
ExclusiveArch: %{rust_arches}
- rust-rmp-serde
ExclusiveArch: %{rust_arches}
- rust-roff
ExclusiveArch: %{rust_arches}
- rust-ron
ExclusiveArch: %{rust_arches}
- rust-rpassword
ExclusiveArch: %{rust_arches}
- rust-rpick
ExclusiveArch: %{rust_arches}
- rust-rust-ini
ExclusiveArch: %{rust_arches}
- rust-rust-stemmers
ExclusiveArch: %{rust_arches}
- rust-rust_decimal
ExclusiveArch: %{rust_arches}
- rust-rust_hawktracer
ExclusiveArch: %{rust_arches}
- rust-rust_hawktracer_normal_macro
ExclusiveArch: %{rust_arches}
- rust-rust_hawktracer_proc_macro
ExclusiveArch: %{rust_arches}
- rust-rust_hawktracer_sys
ExclusiveArch: %{rust_arches}
- rust-rustc-demangle
ExclusiveArch: %{rust_arches}
- rust-rustc-hash
ExclusiveArch: %{rust_arches}
- rust-rustc-serialize
ExclusiveArch: %{rust_arches}
- rust-rustc-test
ExclusiveArch: %{rust_arches}
- rust-rustc_version
ExclusiveArch: %{rust_arches}
- rust-rustdoc-stripper
ExclusiveArch: %{rust_arches}
- rust-rustfilt
ExclusiveArch: %{rust_arches}
- rust-rustfix
ExclusiveArch: %{rust_arches}
- rust-rustio
ExclusiveArch: %{rust_arches}
- rust-rustversion
ExclusiveArch: %{rust_arches}
- rust-rusty-fork
ExclusiveArch: %{rust_arches}
- rust-ryu
ExclusiveArch: %{rust_arches}
- rust-safe-transmute
ExclusiveArch: %{rust_arches}
- rust-safemem
ExclusiveArch: %{rust_arches}
- rust-same-file
ExclusiveArch: %{rust_arches}
- rust-sass-rs
ExclusiveArch: %{rust_arches}
- rust-sass-sys
ExclusiveArch: %{rust_arches}
- rust-scan_fmt
ExclusiveArch: %{rust_arches}
- rust-scoped-tls
ExclusiveArch: %{rust_arches}
- rust-scoped_threadpool
ExclusiveArch: %{rust_arches}
- rust-scopeguard
ExclusiveArch: %{rust_arches}
- rust-scroll
ExclusiveArch: %{rust_arches}
- rust-scroll_derive
ExclusiveArch: %{rust_arches}
- rust-sd
ExclusiveArch: %{rust_arches}
- rust-seahash
ExclusiveArch: %{rust_arches}
- rust-secret-service
ExclusiveArch: %{rust_arches}
- rust-semver
ExclusiveArch: %{rust_arches}
- rust-semver-parser
ExclusiveArch: %{rust_arches}
- rust-semver-parser0.7
ExclusiveArch: %{rust_arches}
- rust-serde
ExclusiveArch: %{rust_arches}
- rust-serde-pickle
ExclusiveArch: %{rust_arches}
- rust-serde-xml-rs
ExclusiveArch: %{rust_arches}
- rust-serde0.8
ExclusiveArch: %{rust_arches}
- rust-serde_bytes
ExclusiveArch: %{rust_arches}
- rust-serde_cbor
ExclusiveArch: %{rust_arches}
- rust-serde_derive
ExclusiveArch: %{rust_arches}
- rust-serde_ignored
ExclusiveArch: %{rust_arches}
- rust-serde_json
ExclusiveArch: %{rust_arches}
- rust-serde_json0.8
ExclusiveArch: %{rust_arches}
- rust-serde_stacker
ExclusiveArch: %{rust_arches}
- rust-serde_test
ExclusiveArch: %{rust_arches}
- rust-serde_urlencoded
ExclusiveArch: %{rust_arches}
- rust-serde_urlencoded0.5
ExclusiveArch: %{rust_arches}
- rust-serde_yaml
ExclusiveArch: %{rust_arches}
- rust-sha-1
ExclusiveArch: %{rust_arches}
- rust-sha1
ExclusiveArch: %{rust_arches}
- rust-sha2
ExclusiveArch: %{rust_arches}
- rust-shared_child
ExclusiveArch: %{rust_arches}
- rust-shell-escape
ExclusiveArch: %{rust_arches}
- rust-shell-words
ExclusiveArch: %{rust_arches}
- rust-shlex
ExclusiveArch: %{rust_arches}
- rust-signal-hook
ExclusiveArch: %{rust_arches}
- rust-signal-hook-registry
ExclusiveArch: %{rust_arches}
- rust-silver
ExclusiveArch: %{rust_arches}
- rust-simd_helpers
ExclusiveArch: %{rust_arches}
- rust-simple_logger
ExclusiveArch: %{rust_arches}
- rust-simplelog
ExclusiveArch: %{rust_arches}
- rust-siphasher
ExclusiveArch: %{rust_arches}
- rust-sized-chunks
ExclusiveArch: %{rust_arches}
- rust-skeptic
ExclusiveArch: %{rust_arches}
- rust-skim
ExclusiveArch: %{rust_arches}
- rust-slab
ExclusiveArch: %{rust_arches}
- rust-slice-deque
ExclusiveArch: %{rust_arches}
- rust-slog
ExclusiveArch: %{rust_arches}
- rust-slog-async
ExclusiveArch: %{rust_arches}
- rust-slog-scope
ExclusiveArch: %{rust_arches}
- rust-slog-term
ExclusiveArch: %{rust_arches}
- rust-slotmap
ExclusiveArch: %{rust_arches}
- rust-slug
ExclusiveArch: %{rust_arches}
- rust-smallvec
ExclusiveArch: %{rust_arches}
- rust-snowflake
ExclusiveArch: %{rust_arches}
- rust-socket2
ExclusiveArch: %{rust_arches}
- rust-sourceview
ExclusiveArch: %{rust_arches}
- rust-spin
ExclusiveArch: %{rust_arches}
- rust-spmc
ExclusiveArch: %{rust_arches}
- rust-stable_deref_trait
ExclusiveArch: %{rust_arches}
- rust-stacker
ExclusiveArch: %{rust_arches}
- rust-starship
ExclusiveArch: %{rust_arches}
- rust-starship_module_config_derive
ExclusiveArch: %{rust_arches}
- rust-static_assertions
ExclusiveArch: %{rust_arches}
- rust-statistical
ExclusiveArch: %{rust_arches}
- rust-stb_truetype
ExclusiveArch: %{rust_arches}
- rust-stream-cipher
ExclusiveArch: %{rust_arches}
- rust-streaming-stats
ExclusiveArch: %{rust_arches}
- rust-string
ExclusiveArch: %{rust_arches}
- rust-string_cache
ExclusiveArch: %{rust_arches}
- rust-string_cache_codegen
ExclusiveArch: %{rust_arches}
- rust-string_cache_shared
ExclusiveArch: %{rust_arches}
- rust-strings
ExclusiveArch: %{rust_arches}
- rust-strip-ansi-escapes
ExclusiveArch: %{rust_arches}
- rust-strsim
ExclusiveArch: %{rust_arches}
- rust-structopt
ExclusiveArch: %{rust_arches}
- rust-structopt-derive
ExclusiveArch: %{rust_arches}
- rust-structopt-derive0.2
ExclusiveArch: %{rust_arches}
- rust-structopt0.2
ExclusiveArch: %{rust_arches}
- rust-strum
ExclusiveArch: %{rust_arches}
- rust-strum_macros
ExclusiveArch: %{rust_arches}
- rust-subtle
ExclusiveArch: %{rust_arches}
- rust-sudo_plugin
ExclusiveArch: %{rust_arches}
- rust-sudo_plugin-sys
ExclusiveArch: %{rust_arches}
- rust-sval
ExclusiveArch: %{rust_arches}
- rust-sval_derive
ExclusiveArch: %{rust_arches}
- rust-syn
ExclusiveArch: %{rust_arches}
- rust-syn-mid
ExclusiveArch: %{rust_arches}
- rust-syn0.15
ExclusiveArch: %{rust_arches}
- rust-synom
ExclusiveArch: %{rust_arches}
- rust-synstructure
ExclusiveArch: %{rust_arches}
- rust-syntect
ExclusiveArch: %{rust_arches}
- rust-sys-info
ExclusiveArch: %{rust_arches}
- rust-sysinfo
ExclusiveArch: %{rust_arches}
- rust-tabwriter
ExclusiveArch: %{rust_arches}
- rust-take
ExclusiveArch: %{rust_arches}
- rust-take_mut
ExclusiveArch: %{rust_arches}
- rust-tar
ExclusiveArch: %{rust_arches}
- rust-tempdir
ExclusiveArch: %{rust_arches}
- rust-tempfile
ExclusiveArch: %{rust_arches}
- rust-tendril
ExclusiveArch: %{rust_arches}
- rust-tera
ExclusiveArch: %{rust_arches}
- rust-term
ExclusiveArch: %{rust_arches}
- rust-term_grid
ExclusiveArch: %{rust_arches}
- rust-term_size
ExclusiveArch: %{rust_arches}
- rust-termcolor
ExclusiveArch: %{rust_arches}
- rust-terminal_size
ExclusiveArch: %{rust_arches}
- rust-terminfo
ExclusiveArch: %{rust_arches}
- rust-termion
ExclusiveArch: %{rust_arches}
- rust-termios
ExclusiveArch: %{rust_arches}
- rust-test-assembler
ExclusiveArch: %{rust_arches}
- rust-tester
ExclusiveArch: %{rust_arches}
- rust-textwrap
ExclusiveArch: %{rust_arches}
- rust-thread-id
ExclusiveArch: %{rust_arches}
- rust-thread-scoped
ExclusiveArch: %{rust_arches}
- rust-thread_local
ExclusiveArch: %{rust_arches}
- rust-threadpool
ExclusiveArch: %{rust_arches}
- rust-tiff
ExclusiveArch: %{rust_arches}
- rust-time
ExclusiveArch: %{rust_arches}
- rust-timebomb
ExclusiveArch: %{rust_arches}
- rust-timer
ExclusiveArch: %{rust_arches}
- rust-timerfd
ExclusiveArch: %{rust_arches}
- rust-tiny_http
ExclusiveArch: %{rust_arches}
- rust-tinytemplate
ExclusiveArch: %{rust_arches}
- rust-tokei
ExclusiveArch: %{rust_arches}
- rust-tokio
ExclusiveArch: %{rust_arches}
- rust-tokio-async-await
ExclusiveArch: %{rust_arches}
- rust-tokio-buf
ExclusiveArch: %{rust_arches}
- rust-tokio-codec
ExclusiveArch: %{rust_arches}
- rust-tokio-core
ExclusiveArch: %{rust_arches}
- rust-tokio-current-thread
ExclusiveArch: %{rust_arches}
- rust-tokio-executor
ExclusiveArch: %{rust_arches}
- rust-tokio-fs
ExclusiveArch: %{rust_arches}
- rust-tokio-io
ExclusiveArch: %{rust_arches}
- rust-tokio-io-pool
ExclusiveArch: %{rust_arches}
- rust-tokio-macros
ExclusiveArch: %{rust_arches}
- rust-tokio-mock-task
ExclusiveArch: %{rust_arches}
- rust-tokio-mockstream
ExclusiveArch: %{rust_arches}
- rust-tokio-openssl
ExclusiveArch: %{rust_arches}
- rust-tokio-process
ExclusiveArch: %{rust_arches}
- rust-tokio-reactor
ExclusiveArch: %{rust_arches}
- rust-tokio-service
ExclusiveArch: %{rust_arches}
- rust-tokio-signal
ExclusiveArch: %{rust_arches}
- rust-tokio-sync
ExclusiveArch: %{rust_arches}
- rust-tokio-tcp
ExclusiveArch: %{rust_arches}
- rust-tokio-test
ExclusiveArch: %{rust_arches}
- rust-tokio-threadpool
ExclusiveArch: %{rust_arches}
- rust-tokio-timer
ExclusiveArch: %{rust_arches}
- rust-tokio-tls
ExclusiveArch: %{rust_arches}
- rust-tokio-tls0.2
ExclusiveArch: %{rust_arches}
- rust-tokio-trace-core
ExclusiveArch: %{rust_arches}
- rust-tokio-udp
ExclusiveArch: %{rust_arches}
- rust-tokio-uds
ExclusiveArch: %{rust_arches}
- rust-tokio-util
ExclusiveArch: %{rust_arches}
- rust-tokio0.1
ExclusiveArch: %{rust_arches}
- rust-toml
ExclusiveArch: %{rust_arches}
- rust-toml0.4
ExclusiveArch: %{rust_arches}
- rust-traitobject
ExclusiveArch: %{rust_arches}
- rust-treebitmap
ExclusiveArch: %{rust_arches}
- rust-treeline
ExclusiveArch: %{rust_arches}
- rust-trust-dns-native-tls
ExclusiveArch: %{rust_arches}
- rust-trust-dns-openssl
ExclusiveArch: %{rust_arches}
- rust-trust-dns-proto
ExclusiveArch: %{rust_arches}
- rust-trust-dns-resolver
ExclusiveArch: %{rust_arches}
- rust-try-lock
ExclusiveArch: %{rust_arches}
- rust-try_from
ExclusiveArch: %{rust_arches}
- rust-try_or
ExclusiveArch: %{rust_arches}
- rust-trybuild
ExclusiveArch: %{rust_arches}
- rust-tui
ExclusiveArch: %{rust_arches}
- rust-tuikit
ExclusiveArch: %{rust_arches}
- rust-tungstenite
ExclusiveArch: %{rust_arches}
- rust-twoway
ExclusiveArch: %{rust_arches}
- rust-typeable
ExclusiveArch: %{rust_arches}
- rust-typed-arena
ExclusiveArch: %{rust_arches}
- rust-typemap
ExclusiveArch: %{rust_arches}
- rust-typenum
ExclusiveArch: %{rust_arches}
- rust-ucd-parse
ExclusiveArch: %{rust_arches}
- rust-ucd-trie
ExclusiveArch: %{rust_arches}
- rust-ucd-util
ExclusiveArch: %{rust_arches}
- rust-unchecked-index
ExclusiveArch: %{rust_arches}
- rust-unescape
ExclusiveArch: %{rust_arches}
- rust-unic-char-property
ExclusiveArch: %{rust_arches}
- rust-unic-char-range
ExclusiveArch: %{rust_arches}
- rust-unic-common
ExclusiveArch: %{rust_arches}
- rust-unic-segment
ExclusiveArch: %{rust_arches}
- rust-unic-ucd-category
ExclusiveArch: %{rust_arches}
- rust-unic-ucd-common
ExclusiveArch: %{rust_arches}
- rust-unic-ucd-segment
ExclusiveArch: %{rust_arches}
- rust-unic-ucd-version
ExclusiveArch: %{rust_arches}
- rust-unicase
ExclusiveArch: %{rust_arches}
- rust-unicase1
ExclusiveArch: %{rust_arches}
- rust-unicode-bidi
ExclusiveArch: %{rust_arches}
- rust-unicode-normalization
ExclusiveArch: %{rust_arches}
- rust-unicode-segmentation
ExclusiveArch: %{rust_arches}
- rust-unicode-width
ExclusiveArch: %{rust_arches}
- rust-unicode-xid
ExclusiveArch: %{rust_arches}
- rust-unicode-xid0.1
ExclusiveArch: %{rust_arches}
- rust-unicode_categories
ExclusiveArch: %{rust_arches}
- rust-unindent
ExclusiveArch: %{rust_arches}
- rust-unix_socket
ExclusiveArch: %{rust_arches}
- rust-unreachable
ExclusiveArch: %{rust_arches}
- rust-unsafe-any
ExclusiveArch: %{rust_arches}
- rust-untrusted
ExclusiveArch: %{rust_arches}
- rust-uom
ExclusiveArch: %{rust_arches}
- rust-url
ExclusiveArch: %{rust_arches}
- rust-url1
ExclusiveArch: %{rust_arches}
- rust-url_serde
ExclusiveArch: %{rust_arches}
- rust-urlencoding
ExclusiveArch: %{rust_arches}
- rust-urlshortener
ExclusiveArch: %{rust_arches}
- rust-users
ExclusiveArch: %{rust_arches}
- rust-utf-8
ExclusiveArch: %{rust_arches}
- rust-utf8-ranges
ExclusiveArch: %{rust_arches}
- rust-utf8parse
ExclusiveArch: %{rust_arches}
- rust-uuid
ExclusiveArch: %{rust_arches}
- rust-uuid0.6
ExclusiveArch: %{rust_arches}
- rust-uuid0.7
ExclusiveArch: %{rust_arches}
- rust-v_escape
ExclusiveArch: %{rust_arches}
- rust-v_escape_derive
ExclusiveArch: %{rust_arches}
- rust-v_htmlescape
ExclusiveArch: %{rust_arches}
- rust-varlink
ExclusiveArch: %{rust_arches}
- rust-varlink-cli
ExclusiveArch: %{rust_arches}
- rust-varlink_generator
ExclusiveArch: %{rust_arches}
- rust-varlink_parser
ExclusiveArch: %{rust_arches}
- rust-varlink_stdinterfaces
ExclusiveArch: %{rust_arches}
- rust-vec_map
ExclusiveArch: %{rust_arches}
- rust-vergen
ExclusiveArch: %{rust_arches}
- rust-version-compare
ExclusiveArch: %{rust_arches}
- rust-version-sync
ExclusiveArch: %{rust_arches}
- rust-version_check
ExclusiveArch: %{rust_arches}
- rust-void
ExclusiveArch: %{rust_arches}
- rust-vte
ExclusiveArch: %{rust_arches}
- rust-wait-timeout
ExclusiveArch: %{rust_arches}
- rust-walkdir
ExclusiveArch: %{rust_arches}
- rust-want
ExclusiveArch: %{rust_arches}
- rust-warp
ExclusiveArch: %{rust_arches}
- rust-websocket
ExclusiveArch: %{rust_arches}
- rust-websocket-base
ExclusiveArch: %{rust_arches}
- rust-which
ExclusiveArch: %{rust_arches}
- rust-which1
ExclusiveArch: %{rust_arches}
- rust-wild
ExclusiveArch: %{rust_arches}
- rust-ws
ExclusiveArch: %{rust_arches}
- rust-x11
ExclusiveArch: %{rust_arches}
- rust-xattr
ExclusiveArch: %{rust_arches}
- rust-xdg
ExclusiveArch: %{rust_arches}
- rust-xml-rs
ExclusiveArch: %{rust_arches}
- rust-xz2
ExclusiveArch: %{rust_arches}
- rust-y4m
ExclusiveArch: %{rust_arches}
- rust-yaml-rust
ExclusiveArch: %{rust_arches}
- rust-yaml-rust0.3
ExclusiveArch: %{rust_arches}
- rust-ybaas
ExclusiveArch: %{rust_arches}
- rust-yubibomb
ExclusiveArch: %{rust_arches}
- rust-yup-oauth2
ExclusiveArch: %{rust_arches}
- rust-zincati
ExclusiveArch: %{rust_arches}
- rust-zoneinfo_compiled
ExclusiveArch: %{rust_arches}
- rust-zram-generator
ExclusiveArch: %{rust_arches}
- rust-zstd
ExclusiveArch: %{rust_arches}
- rust-zstd-safe
ExclusiveArch: %{rust_arches}
- rust-zstd-sys
ExclusiveArch: %{rust_arches}
- s390utils
ExclusiveArch: s390 s390x
- safetyblanket
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips} aarch64 ppc64
- sagemath
ExclusiveArch: aarch64 %{arm} %{ix86} x86_64 ppc sparcv9
- sbcl
ExclusiveArch: %{arm} %{ix86} x86_64 ppc sparcv9 aarch64
- sbd
ExclusiveArch: i686 x86_64 s390x aarch64 ppc64le
- sbsigntools
ExclusiveArch: x86_64 aarch64 %{arm} %{ix86}
- seabios
ExclusiveArch: x86_64
- seamonkey
ExclusiveArch: %{ix86} x86_64
- servicelog
ExclusiveArch: ppc %{power64}
- sgabios
ExclusiveArch: %{ix86} x86_64
- sharpfont
ExclusiveArch: %mono_arches
- sharpziplib
ExclusiveArch: %{mono_arches}
- shim
ExclusiveArch: %{efi}
- shim-unsigned-aarch64
ExclusiveArch: aarch64
- shim-unsigned-x64
ExclusiveArch: x86_64
- sigul
ExclusiveArch: x86_64
- skychart
ExclusiveArch: %{fpc_arches}
- snapd
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le s390x
- soup-sharp
ExclusiveArch: %{mono_arches}
- source-to-image
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- sparkleshare
ExclusiveArch: %{mono_arches}
- spicctrl
ExclusiveArch: %{ix86} x86_64
- spice
ExclusiveArch: x86_64
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- springlobby
ExclusiveArch: %{ix86} x86_64
- startdde
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- statsd
ExclusiveArch: %{nodejs_arches} noarch
- stratis-cli
ExclusiveArch: %{rust_arches} noarch
- stratisd
ExclusiveArch: %{rust_arches}
- stripesnoop
ExclusiveArch: %{ix86} x86_64
- supermin
ExclusiveArch: x86_64
- svt-av1
ExclusiveArch: x86_64
- svt-vp9
ExclusiveArch: x86_64
- swift-lang
ExclusiveArch: x86_64 aarch64
- sysbench
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips}
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips} aarch64
- syslinux
ExclusiveArch: %{ix86} x86_64
ExclusiveArch: %{ix86} x86_64
- taglib-sharp
ExclusiveArch: %{mono_arches}
- tarantool
ExclusiveArch: %{ix86} x86_64 armv7hl armv7hnl
- tboot
ExclusiveArch: %{ix86} x86_64
- tdlib
ExclusiveArch: x86_64
- templates_parser
ExclusiveArch: %GPRbuild_arches
- termy-qt
ExclusiveArch: %{ix86} x86_64
- ternimal
ExclusiveArch: %{rust_arches}
- themonospot-base
ExclusiveArch: %mono_arches
- themonospot-console
ExclusiveArch: %mono_arches
- themonospot-gui-gtk
ExclusiveArch: %mono_arches
- themonospot-plugin-avi
ExclusiveArch: %mono_arches
- themonospot-plugin-mkv
ExclusiveArch: %mono_arches
- thermald
ExclusiveArch: %{ix86} x86_64
- tilix
ExclusiveArch: %{ldc_arches}
- tmux-top
ExclusiveArch: %{go_arches}
- tomboy
ExclusiveArch: %{mono_arches}
- toolbox
ExclusiveArch: aarch64 %{arm} ppc64le s390x x86_64
- tuned-profiles-nfv-host-bin
ExclusiveArch: %{ix86} x86_64
- uClibc
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips}
- ucx
ExclusiveArch: aarch64 ppc64le x86_64
- ugene
ExclusiveArch: %{ix86} x86_64
- uglify-js
ExclusiveArch: %{nodejs_arches} noarch
- uglify-js1
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- unetbootin
ExclusiveArch: %{ix86} x86_64
- ursa-major
ExclusiveArch: %{ix86} x86_64 noarch
- v8-314
ExclusiveArch: %{ix86} x86_64 %{arm} mips mipsel ppc ppc64
- valgrind
ExclusiveArch: %{ix86} x86_64 ppc ppc64 ppc64le s390x armv7hl aarch64
- vboot-utils
ExclusiveArch: %{arm} aarch64 %{ix86} x86_64
- vim-go
ExclusiveArch: %{?golang_arches}%{!?golang_arches:%{ix86} x86_64 %{arm}}
- virt-p2v
ExclusiveArch: x86_64
- virtualbox-guest-additions
ExclusiveArch: i686 x86_64
- virtualplanet
ExclusiveArch: %{fpc_arches}
- vkd3d
ExclusiveArch: %{ix86} x86_64 %{arm}
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- vmaf
ExclusiveArch: x86_64
- vmemcache
ExclusiveArch: x86_64 ppc64 ppc64le s390x aarch64
- vrq
ExclusiveArch: %{ix86} x86_64
- warsow
ExclusiveArch: %{ix86} x86_64 %{arm}
- warsow-data
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
ExclusiveArch: %{ix86} x86_64 %{arm}
- webkit2-sharp
ExclusiveArch: %mono_arches
- wine
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
ExclusiveArch: %{ix86} %{arm}
- wine-dxvk
ExclusiveArch: %{ix86} x86_64
- winetricks
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- wxMaxima
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc sparcv9
- x2goclient
ExclusiveArch: x86_64
- xe-guest-utilities-latest
ExclusiveArch: %{ix86} x86_64
- xen
ExclusiveArch: %{ix86} x86_64 armv7hl aarch64
- xmlada
ExclusiveArch: %{GPRbuild_arches}
- xorg-x11-drv-armsoc
ExclusiveArch: %{arm} aarch64
- xorg-x11-drv-geode
ExclusiveArch: %{ix86}
- xorg-x11-drv-intel
ExclusiveArch: %{ix86} x86_64 ia64
- xorg-x11-drv-openchrome
ExclusiveArch: %{ix86} x86_64
- xorg-x11-drv-vesa
ExclusiveArch: %{ix86} x86_64
- xorg-x11-drv-vmware
ExclusiveArch: %{ix86} x86_64 ia64
- xsp
ExclusiveArch: %mono_arches
- ycssmin
ExclusiveArch: %{nodejs_arches} noarch
- zeromq-ada
ExclusiveArch: %{GPRbuild_arches}
- zlib-ada
ExclusiveArch: %{GPRbuild_arches}
- zola
ExclusiveArch: %{rust_arches}
4 years, 2 months
Architecture specific change in rpms/Pound.git
by githook-noreply@fedoraproject.org
The package rpms/Pound.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/Pound.git/commit/?id=1499a4a26de6....
Change:
-%ifarch %{ix86} x86_64 aarch64 %{power64}
Thanks.
Full change:
============
commit 1499a4a26de60660e54116ea5938db3bef241a10
Author: Breno B Fernandes <brandfbb(a)gmail.com>
Date: Tue Jan 28 09:49:03 2020 -0500
For now I am only maintaing the package in EPEL.
So, I am reverting this by now.
Revert "Revert "Pound fails to build from source: https://bugzilla.redhat.com/show_bug.cgi?id=1674583""
This reverts commit dd7d5d9b7297cecb64e2b71ea68843cc98fa45f7.
diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 5b4601c..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,8 +0,0 @@
-Pound-2.5.tgz
-/Pound-2.6c.tgz
-/Pound-2.6f.tgz
-/Pound-2.6.tgz
-/Pound-2.7b.tgz
-/Pound-2.7c.tgz
-/Pound-2.7d.tgz
-/Pound-2.7.tgz
diff --git a/Pound.spec b/Pound.spec
deleted file mode 100644
index a612585..0000000
--- a/Pound.spec
+++ /dev/null
@@ -1,299 +0,0 @@
-%global pound_user pound
-%global pound_group pound
-%global pound_home %{_localstatedir}/lib/pound
-%global _hardened_build 1
-
-Name: Pound
-Version: 2.7
-Release: 10%{?dist}
-Epoch: 1
-Summary: Reverse proxy and load balancer
-License: GPLv3
-URL: http://www.apsis.ch/pound
-
-BuildRequires: gcc
-BuildRequires: openssl-devel, pcre-devel
-# We actually need the openssl binary, not just the libs and headers
-BuildRequires: openssl
-BuildRequires: systemd-units
-
-# tcmalloc exists only on selected arches
-%ifarch %{ix86} x86_64 aarch64 %{power64}
-BuildRequires: gperftools-devel
-%endif
-
-Requires(pre): %{_sbindir}/useradd
-Requires(pre): %{_sbindir}/groupadd
-Requires(post): systemd-sysv
-Requires(post): systemd-units
-Requires(preun): systemd-units
-Requires(postun): systemd-units
-
-Source0: http://www.apsis.ch/pound/%{name}-%{version}.tgz
-Source1: pound.service
-Source2: pound.cfg
-Patch0: pound-remove-owner.patch
-
-%description
-The Pound program is a reverse proxy, load balancer and
-HTTPS front-end for Web server(s). Pound was developed
-to enable distributing the load among several Web-servers
-and to allow for a convenient SSL wrapper for those Web
-servers that do not offer it natively. Pound is distributed
-under the GPL - no warranty, it's free to use, copy and
-give away
-
-%prep
-%setup -q -n %{name}-%{version}
-%patch0 -p1 -b .remove-owner
-
-%build
-%configure
-make %{?_smp_mflags}
-
-%install
-make install DESTDIR=%{buildroot}
-
-%{__install} -d %{buildroot}%{pound_home}
-%{__install} -p -D -m 644 %{SOURCE1} %{buildroot}%{_unitdir}/pound.service
-%{__install} -p -D -m 644 %{SOURCE2} %{buildroot}%{_sysconfdir}/pound.cfg
-
-mkdir -p %{buildroot}%{_sysconfdir}/pki/tls/certs
-touch %{buildroot}%{_sysconfdir}/pki/tls/certs/pound.pem
-
-%pre
-%{_sbindir}/groupadd -f -r %{pound_group}
-id %{pound_user} >/dev/null 2>&1 || \
- %{_sbindir}/useradd -r -g %{pound_group} -d %{pound_home} -s /sbin/nologin \
- -c "Pound user" %{pound_user}
-
-%post
-%systemd_post pound.service
-# generate dummy certificate
-exec > /dev/null 2> /dev/null
-if [ ! -f %{_sysconfdir}/pki/tls/certs/pound.pem ] ; then
-pushd %{_sysconfdir}/pki/tls/certs
-umask 077
-cat << EOF | make pound.pem
---
-SomeState
-SomeCity
-Pound Example Certificate
-SomeOrganizationalUnit
-localhost.localdomain
-root(a)localhost.localdomain
-EOF
-chown root:pound pound.pem
-chmod 640 pound.pem
-popd
-fi
-exit 0
-
-%preun
-%systemd_preun pound.service
-
-%postun
-%systemd_postun_with_restart pound.service
-
-%triggerun -- pound < 2.6-0.2.c
-# Save the current service runlevel info
-# User must manually run systemd-sysv-convert --apply pound
-# to migrate them to systemd targets
-/usr/bin/systemd-sysv-convert --save pound >/dev/null 2>&1 ||:
-
-# Run these because the SysV package being removed won't do them
-/sbin/chkconfig --del pound >/dev/null 2>&1 || :
-/bin/systemctl try-restart pound.service >/dev/null 2>&1 || :
-
-%files
-%doc CHANGELOG FAQ GPL.txt README
-%{_mandir}/man8/pound.8*
-%{_mandir}/man8/poundctl.8*
-%{_sbindir}/pound
-%{_sbindir}/poundctl
-%{_unitdir}/pound.service
-%config(noreplace) %{_sysconfdir}/pound.cfg
-%ghost %config(noreplace) %{_sysconfdir}/pki/tls/certs/pound.pem
-%attr(-,%{pound_user},%{pound_group}) %dir %{pound_home}
-
-%changelog
-* Wed Jul 24 2019 Fedora Release Engineering <releng(a)fedoraproject.org> - 1:2.7-10
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
-
-* Thu Jan 31 2019 Fedora Release Engineering <releng(a)fedoraproject.org> - 1:2.7-9
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
-
-* Thu Jul 12 2018 Fedora Release Engineering <releng(a)fedoraproject.org> - 1:2.7-8
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
-
-* Wed Feb 07 2018 Fedora Release Engineering <releng(a)fedoraproject.org> - 1:2.7-7
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild
-
-* Wed Aug 02 2017 Fedora Release Engineering <releng(a)fedoraproject.org> - 1:2.7-6
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild
-
-* Wed Jul 26 2017 Fedora Release Engineering <releng(a)fedoraproject.org> - 1:2.7-5
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild
-
-* Fri Feb 10 2017 Fedora Release Engineering <releng(a)fedoraproject.org> - 1:2.7-4
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild
-
-* Wed Feb 03 2016 Fedora Release Engineering <releng(a)fedoraproject.org> - 1:2.7-3
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
-
-* Tue Sep 15 2015 Marcin Juszkiewicz <mjuszkiewicz(a)redhat.com> - 1:2.7-2
-- Enable gperftools use on aarch64 and ppc64le
-
-* Tue Sep 01 2015 Adam Tkac <vonsch(a)gmail.com> - 1:2.7-1
-- update to 2.7 final (#1258262)
-
-* Tue Jun 16 2015 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> - 1:2.7-0.5.d
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
-
-* Fri Oct 24 2014 Lubomir Rintel <lkundrak(a)v3.sk> - 1:2.7-0.4.d
-- Update to 2.7d:
-- added "Disable PROTO" directives (fix for Poodle vulnerability)
-- added Cert, Disable and Cipher directives for HTTPS back-ends. The
- directive HTTPS "cert" no longer supported.
-- fixed address comparison for RewriteLocation (IPv4/IPv6 problem -
-
-* Fri Sep 19 2014 Pete Zaitcev <zaitcev(a)redhat.com> - 1:2.7-0.4.c
-- chmod 644 pound.service # avoids warnings in messages
-
-* Fri Aug 15 2014 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> - 1:2.7-0.3.c
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild
-
-* Fri Jun 06 2014 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> - 1:2.7-0.2.c
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild
-
-* Wed Apr 23 2014 Lubomir Rintel (GoodData) <lubo.rintel(a)gooddata.com> - 1:2.7-0.1.c
-- Rebased to new upstream release
-- Bump epoch; the prerelease tag was added incorrectly. Sigh.
-
-* Mon Oct 14 2013 Pete Zaitcev <zaitcev(a)redhat.com> - 2.7b-1
-- Upstream 2.7b (includes ./configure for autoconf 2.69, required for ARM 64)
-- Rebuild for PIE (954334)
-
-* Fri Aug 02 2013 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> - 2.6-7
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild
-
-* Wed Feb 13 2013 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> - 2.6-6
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild
-
-* Sun Aug 19 2012 Tom Callaway <spot(a)fedoraproject.org> - 2.6-5
-- update scriptlets to use new systemd macros
-
-* Wed Jul 18 2012 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> - 2.6-4
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild
-
-* Sat Feb 18 2012 Ruben Kerkhof <ruben(a)rubenkerkhof.com> 2.6-3
-- Rebuild against gperftools
-
-* Thu Jan 12 2012 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> - 2.6-2
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild
-
-* Mon Jan 09 2012 Ruben Kerkhof <ruben(a)rubenkerkhof.com> 2.6-1
-- Fix Release
-
-* Mon Jan 09 2012 Ruben Kerkhof <ruben(a)rubenkerkhof.com> 2.6-0.5
-- Upstream released new version
-
-* Mon Oct 17 2011 Dan Hork <dan[at]danny.cz> 2.6-0.4.f
-- switch to positive arch list for BR: google-perftools
-
-* Sat Sep 17 2011 Ruben Kerkhof <ruben(a)tilaa.nl> 2.6-0.3.f
-- Upstream released new version
-
-* Fri Sep 16 2011 Tom Callaway <spot(a)fedoraproject.org> 2.6-0.2.c
-- convert to systemd
-
-* Wed Feb 09 2011 Ruben Kerkhof <ruben(a)rubenkerkhof.com> 2.6-0.1.c
-- Upstream released new version
-- Drop upstreamed OpenSSL patch
-
-* Mon Feb 07 2011 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> - 2.5-2
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
-
-* Wed Feb 10 2010 Ruben Kerkhof <ruben(a)rubenkerkhof.com> 2.5-1
-- Upstream released new version
-
-* Wed Nov 11 2009 Lubomir Rintel (GoodData) <lubo.rintel(a)gooddata.com> - 2.4.5-1
-- Rebased to new upstream release
-
-* Wed Aug 26 2009 Tomas Mraz <tmraz(a)redhat.com> - 2.4.4-4
-- rebuilt with new openssl
-
-* Fri Jul 24 2009 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> - 2.4.4-3
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild
-
-* Mon Feb 23 2009 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> - 2.4.4-2
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild
-
-* Thu Jan 15 2009 Ruben Kerkhof <ruben(a)rubenkerkhof.com> 2.4.4-1
-- upstream released new version
-
-* Mon Oct 13 2008 Ruben Kerkhof <ruben(a)rubenkerkhof.com> 2.4.3-1
-- Upstream released new version
-
-* Fri Jun 27 2008 Dennis Gilmore <dennis(a)ausil.us> 2.4-2
-- sparc arches dont have tcmalloc
-
-* Sat Feb 16 2008 Ruben Kerkhof <ruben(a)rubenkerkhof.com> 2.4-1
-- New stable version
-
-* Sat Feb 09 2008 Ruben Kerkhof <ruben(a)rubenkerkhof.com> - 2.4-0.2f
-- Upstream released new version
-
-* Wed Dec 05 2007 Release Engineering <rel-eng at fedoraproject dot org> - 2.4-0.2
-- Rebuild for deps
-
-* Sun Dec 02 2007 Ruben Kerkhof <ruben(a)rubenkerkhof.com> 2.4.0-1e
-- Update to experimental version 2.4e
-* Thu Aug 16 2007 Ruben Kerkhof <ruben(a)rubenkerkhof.com> 2.4.0-1d
-- Update to experimental version 2.4d
-- Upstream changed license to GPLv3
-* Wed Jun 06 2007 Ruben Kerkhof <ruben(a)rubenkerkhof.com> 2.4.0-1c
-- Upstream released new version
-* Sat May 26 2007 Ruben Kerkhof <ruben(a)rubenkerkhof.com> 2.4.0-2b
-- Disable linking with tcmalloc on ppc (#238390)
-* Fri May 25 2007 Ruben Kerkhof <ruben(a)rubenkerkhof.com> 2.4-0.1b
-- Update to experimental version 2.4b
-- Better handling of user creation
-- Build with tcmalloc for increased performance
-* Wed Apr 11 2007 Ruben Kerkhof <ruben(a)rubenkerkhof.com> 2.3-1
-- Update to 2.3
-* Thu Apr 05 2007 <ruben(a)rubenkerkhof.com> 2.2.8-1
-- Sync with upstream
-* Mon Mar 12 2007 <ruben(a)rubenkerkhof.com> 2.2.7-1
-- Sync with upstream
-* Sun Mar 04 2007 <ruben(a)rubenkerkhof.com> 2.2.6-1
-- Sync with upstream
-* Wed Feb 21 2007 <ruben(a)rubenkerkhof.com> 2.2.5-1
-- Sync with upstream
-* Sat Feb 10 2007 <ruben(a)rubenkerkhof.com> 2.2.4-1
-- Sync with upstream
-* Sat Jan 20 2007 <ruben(a)rubenkerkhof.com> 2.2.3-1
-- Fix problems in bad 2.2.2 release
-* Mon Jan 15 2007 <ruben(a)rubenkerkhof.com> 2.2.2-1
-- Sync with upstream
-* Wed Jan 03 2007 <ruben(a)rubenkerkhof.com> 2.2.1-1
-- Sync with new beta release from upstream
-* Sun Dec 17 2006 <ruben(a)rubenkerkhof.com> 2.2-2
-- Fixed empty debuginfo rpm (bz 219942)
-* Sat Dec 16 2006 <ruben(a)rubenkerkhof.com> 2.2-1
-- Sync with upstream
-* Sat Dec 09 2006 <ruben(a)rubenkerkhof.com> 2.1.8-1
-- Sync with upstream
-* Thu Dec 07 2006 <ruben(a)rubenkerkhof.com> 2.1.7-1
-- Sync with upstream
-* Wed Nov 08 2006 <ruben(a)rubenkerkhof.com> 2.1.6-2
-- Changed hardcoded paths into rpmmacros
-* Mon Nov 06 2006 <ruben(a)rubenkerkhof.com> 2.1.6-1
-- Synced with upstream version
-- Changed Summary
-- Added an init script
-- Added pound.cfg with an example configuration
-- Added pound user and group
-- A self-signed ssl certificate is created in %%post
-* Fri Nov 03 2006 <ruben(a)rubenkerkhof.com> 2.1.5-1
-- initial version
diff --git a/dead.package b/dead.package
new file mode 100644
index 0000000..8531e0d
--- /dev/null
+++ b/dead.package
@@ -0,0 +1 @@
+Pound fails to build from source: https://bugzilla.redhat.com/show_bug.cgi?id=1674583
diff --git a/pound-remove-owner.patch b/pound-remove-owner.patch
deleted file mode 100644
index 6e05a51..0000000
--- a/pound-remove-owner.patch
+++ /dev/null
@@ -1,18 +0,0 @@
---- Pound-2.2.3/Makefile.in.remove-owner 2007-01-21 01:45:44.000000000 +0100
-+++ Pound-2.2.3/Makefile.in 2007-01-21 01:46:59.000000000 +0100
-@@ -50,11 +50,11 @@
-
- install: all
- @INSTALL@ -d ${DESTDIR}@sbindir@
-- @INSTALL@ -o @I_OWNER@ -g @I_GRP@ -m 555 pound ${DESTDIR}@sbindir@/pound
-- @INSTALL@ -o @I_OWNER@ -g @I_GRP@ -m 555 poundctl ${DESTDIR}@sbindir@/poundctl
-+ @INSTALL@ -p -m 755 pound ${DESTDIR}@sbindir@/pound
-+ @INSTALL@ -p -m 755 poundctl ${DESTDIR}@sbindir@/poundctl
- @INSTALL@ -d ${DESTDIR}@mandir@/man8
-- @INSTALL@ -o @I_OWNER@ -g @I_GRP@ -m 644 pound.8 ${DESTDIR}@mandir(a)/man8/pound.8
-- @INSTALL@ -o @I_OWNER@ -g @I_GRP@ -m 644 poundctl.8 ${DESTDIR}@mandir(a)/man8/poundctl.8
-+ @INSTALL@ -p -m 644 pound.8 ${DESTDIR}@mandir(a)/man8/pound.8
-+ @INSTALL@ -p -m 644 poundctl.8 ${DESTDIR}@mandir(a)/man8/poundctl.8
-
- clean:
- rm -f pound $(OBJS) poundctl poundctl.o
diff --git a/pound.cfg b/pound.cfg
deleted file mode 100644
index 681b359..0000000
--- a/pound.cfg
+++ /dev/null
@@ -1,35 +0,0 @@
-#
-# Default pound.cfg
-#
-# Pound listens on port 80 for HTTP and port 443 for HTTPS
-# and distributes requests to 2 backends running on localhost.
-# see pound(8) for configuration directives.
-# You can enable/disable backends with poundctl(8).
-#
-
-User "pound"
-Group "pound"
-Control "/var/lib/pound/pound.cfg"
-
-ListenHTTP
- Address 0.0.0.0
- Port 80
-End
-
-ListenHTTPS
- Address 0.0.0.0
- Port 443
- Cert "/etc/pki/tls/certs/pound.pem"
-End
-
-Service
- BackEnd
- Address 127.0.0.1
- Port 8000
- End
-
- BackEnd
- Address 127.0.0.1
- Port 8001
- End
-End
diff --git a/pound.service b/pound.service
deleted file mode 100644
index fd50f1b..0000000
--- a/pound.service
+++ /dev/null
@@ -1,11 +0,0 @@
-[Unit]
-Description=Pound Reverse Proxy And Load-balancer
-After=syslog.target network.target
-
-[Service]
-Type=forking
-PIDFile=/var/run/pound.pid
-ExecStart=/usr/sbin/pound
-
-[Install]
-WantedBy=multi-user.target
diff --git a/sources b/sources
deleted file mode 100644
index dcb7c34..0000000
--- a/sources
+++ /dev/null
@@ -1 +0,0 @@
-ec8298aa3e4aee3ffbecdc0639d7f14a Pound-2.7.tgz
commit 264d0cbfc087490c626fc6a11d81463e45fcc15c
Author: Breno B Fernandes <brandfbb(a)gmail.com>
Date: Tue Jan 28 09:48:55 2020 -0500
Revert "- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild"
This reverts commit b76b12360ae72c1b9be53e2a7ba9016cfb48511a.
diff --git a/Pound.spec b/Pound.spec
index 82eac5b..a612585 100644
--- a/Pound.spec
+++ b/Pound.spec
@@ -5,7 +5,7 @@
Name: Pound
Version: 2.7
-Release: 11%{?dist}
+Release: 10%{?dist}
Epoch: 1
Summary: Reverse proxy and load balancer
License: GPLv3
@@ -117,9 +117,6 @@ exit 0
%attr(-,%{pound_user},%{pound_group}) %dir %{pound_home}
%changelog
-* Tue Jan 28 2020 Fedora Release Engineering <releng(a)fedoraproject.org> - 1:2.7-11
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
-
* Wed Jul 24 2019 Fedora Release Engineering <releng(a)fedoraproject.org> - 1:2.7-10
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
4 years, 2 months
Architecture specific change in rpms/xsimd.git
by githook-noreply@fedoraproject.org
The package rpms/xsimd.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/xsimd.git/commit/?id=bcd2e5d687a4....
Change:
+%ifnarch ppc64le s390x
Thanks.
Full change:
============
commit bcd2e5d687a49a3b49df2dc177d4533bc6a58531
Author: serge-sans-paille <sguelton(a)redhat.com>
Date: Wed Jan 22 15:05:11 2020 +0000
Upstream release - 7.4.6
diff --git a/292.patch b/292.patch
deleted file mode 100644
index acfd05e..0000000
--- a/292.patch
+++ /dev/null
@@ -1,419 +0,0 @@
-From da7ab060cbcf57a20adf1c7d5b013658183f8bc5 Mon Sep 17 00:00:00 2001
-From: Johan Mabille <johan.mabille(a)gmail.com>
-Date: Wed, 3 Jul 2019 17:09:58 +0200
-Subject: [PATCH] Disabled most of the tests when no SIMD instruction set is
- available
-
----
- .travis.yml | 11 ++++++++++
- .../xsimd/config/xsimd_instruction_set.hpp | 8 ++++---
- include/xsimd/memory/xsimd_alignment.hpp | 2 +-
- include/xsimd/memory/xsimd_load_store.hpp | 2 +-
- include/xsimd/types/xsimd_types_include.hpp | 2 +-
- test/xsimd_algorithms.cpp | 22 +++++++++++++------
- test/xsimd_api_test.cpp | 2 +-
- test/xsimd_basic_math_test.cpp | 5 ++++-
- test/xsimd_error_gamma_test.cpp | 5 ++++-
- test/xsimd_exponential_test.cpp | 5 ++++-
- test/xsimd_fp_manipulation_test.cpp | 5 ++++-
- test/xsimd_hyperbolic_test.cpp | 5 ++++-
- test/xsimd_interface_test.cpp | 3 +++
- test/xsimd_memory_test.cpp | 3 +++
- test/xsimd_power_test.cpp | 5 ++++-
- test/xsimd_rounding_test.cpp | 5 ++++-
- test/xsimd_trigonometric_test.cpp | 5 ++++-
- 17 files changed, 73 insertions(+), 22 deletions(-)
-
-diff --git a/.travis.yml b/.travis.yml
-index d155b05..36bd25d 100644
---- a/.travis.yml
-+++ b/.travis.yml
-@@ -18,6 +18,14 @@ matrix:
- packages:
- - g++-5
- env: COMPILER=gcc GCC=5
-+ - os: linux
-+ addons:
-+ apt:
-+ sources:
-+ - ubuntu-toolchain-r-test
-+ packages:
-+ - g++-6
-+ env: COMPILER=gcc GCC=6 FORCE_NO_INSTR_SET=1
- - os: linux
- addons:
- apt:
-@@ -175,6 +183,9 @@ install:
- else
- cmake . -DDOWNLOAD_GTEST=ON ;
- fi
-+ - if [[ "$FORCE_NO_INSTR_SET" == 1 ]] ; then
-+ cmake . -DDOWNLOAD_GTEST=ON -DXSIMD_FORCE_X86_INSTR_SET=0 ;
-+ fi
- - make -j2 test_xsimd
- - cd test
- script:
-diff --git a/include/xsimd/config/xsimd_instruction_set.hpp b/include/xsimd/config/xsimd_instruction_set.hpp
-index ca0f1c1..627537b 100644
---- a/include/xsimd/config/xsimd_instruction_set.hpp
-+++ b/include/xsimd/config/xsimd_instruction_set.hpp
-@@ -138,7 +138,9 @@
- * PPC INSTRUCTION SET *
- ***********************/
-
--#define XSIMD_PPC_VMX_VERSION XSIMD_VERSION_NUMBER(1, 0, 0)
-+// We haven't implemented any support for PPC, so we should
-+// not enable detection for this instructoin set
-+/*#define XSIMD_PPC_VMX_VERSION XSIMD_VERSION_NUMBER(1, 0, 0)
- #define XSIMD_PPC_VSX_VERSION XSIMD_VERSION_NUMBER(1, 1, 0)
- #define XSIMD_PPC_QPX_VERSION XSIMD_VERSION_NUMBER(2, 0, 0)
-
-@@ -161,7 +163,7 @@
- #define XSIMD_PPC_INSTR_SET XSIMD_VERSION_NUMBER_NOT_AVAILABLE
- #else
- #define XSIMD_PPC_INSTR_SET_AVAILABLE XSIMD_VERSION_NUMBER_AVAILABLE
--#endif
-+#endif*/
-
- /***********************
- * ARM INSTRUCTION SET *
-@@ -224,7 +226,7 @@
-
- #if !defined(XSIMD_INSTR_SET)
- #define XSIMD_INSTR_SET XSIMD_VERSION_NUMBER_NOT_AVAILABLE
--#else
-+#elif XSIMD_INSTR_SET != XSIMD_VERSION_NUMBER_NOT_AVAILABLE
- #define XSIMD_INSTR_SET_AVAILABLE XSIMD_VERSION_NUMBER_AVAILABLE
- #endif
-
-diff --git a/include/xsimd/memory/xsimd_alignment.hpp b/include/xsimd/memory/xsimd_alignment.hpp
-index bff50ea..301d72a 100644
---- a/include/xsimd/memory/xsimd_alignment.hpp
-+++ b/include/xsimd/memory/xsimd_alignment.hpp
-@@ -40,7 +40,7 @@ namespace xsimd
- using type = unaligned_mode;
- };
-
--#if defined(XSIMD_X86_INSTR_SET_AVAILABLE) || defined(XSIMD_ARM_INSTR_SET_AVAILABLE)
-+#if defined(XSIMD_DEFAULT_ALIGNMENT)
- template <class T>
- struct allocator_alignment<aligned_allocator<T, XSIMD_DEFAULT_ALIGNMENT>>
- {
-diff --git a/include/xsimd/memory/xsimd_load_store.hpp b/include/xsimd/memory/xsimd_load_store.hpp
-index b4b6773..45d5e33 100644
---- a/include/xsimd/memory/xsimd_load_store.hpp
-+++ b/include/xsimd/memory/xsimd_load_store.hpp
-@@ -598,7 +598,7 @@ namespace xsimd
- {
- }
-
--#if defined(XSIMD_X86_INSTR_SET_AVAILABLE)
-+#if XSIMD_X86_INSTR_SET > XSIMD_INSTR_SET_NOT_AVAILABLE
-
- template <>
- inline void prefetch<int32_t>(const int32_t* address)
-diff --git a/include/xsimd/types/xsimd_types_include.hpp b/include/xsimd/types/xsimd_types_include.hpp
-index 39f0a2d..965320c 100644
---- a/include/xsimd/types/xsimd_types_include.hpp
-+++ b/include/xsimd/types/xsimd_types_include.hpp
-@@ -67,7 +67,7 @@
- #include "xsimd_neon_complex.hpp"
- #endif
-
--#if XSIMD_ARM_INSTR_SET == XSIMD_VERSION_NUMBER_NOT_AVAILABLE && XSIMD_X86_INSTR_SET == XSIMD_VERSION_NUMBER_NOT_AVAILABLE
-+#if !defined(XSIMD_INSTR_SET_AVAILABLE)
- #if defined(XSIMD_ENABLE_FALLBACK)
- #warning "No SIMD instructions enabled, using fallback mode."
- #else
-diff --git a/test/xsimd_algorithms.cpp b/test/xsimd_algorithms.cpp
-index 75f4e8c..07a4ff1 100644
---- a/test/xsimd_algorithms.cpp
-+++ b/test/xsimd_algorithms.cpp
-@@ -32,12 +32,20 @@ struct unary_functor
- }
- };
-
-+#ifdef XSIMD_DEFAULT_ALIGNMENT
-+template <class T>
-+using test_allocator_type = xsimd::aligned_allocator<T, XSIMD_DEFAULT_ALIGNMENT>;
-+#else
-+template <class T>
-+using test_allocator_type = std::allocator<T>;
-+#endif
-+
- TEST(xsimd, binary_transform)
- {
- std::vector<double> expected(93);
-
- std::vector<double> a(93, 123), b(93, 123), c(93);
-- std::vector<double, xsimd::aligned_allocator<double, XSIMD_DEFAULT_ALIGNMENT>> aa(93, 123), ba(93, 123), ca(93);
-+ std::vector<double, test_allocator_type<double>> aa(93, 123), ba(93, 123), ca(93);
-
- std::transform(a.begin(), a.end(), b.begin(), expected.begin(),
- binary_functor{});
-@@ -83,7 +91,7 @@ TEST(xsimd, unary_transform)
- {
- std::vector<double> expected(93);
- std::vector<double> a(93, 123), c(93);
-- std::vector<double, xsimd::aligned_allocator<double, XSIMD_DEFAULT_ALIGNMENT>> aa(93, 123), ca(93);
-+ std::vector<double, test_allocator_type<double>> aa(93, 123), ca(93);
-
- std::transform(a.begin(), a.end(), expected.begin(),
- unary_functor{});
-@@ -112,7 +120,7 @@ TEST(xsimd, unary_transform)
- class xsimd_reduce : public ::testing::Test
- {
- public:
-- using aligned_vec_t = std::vector<double, xsimd::aligned_allocator<double, XSIMD_DEFAULT_ALIGNMENT>>;
-+ using aligned_vec_t = std::vector<double, test_allocator_type<double>>;
-
- static constexpr std::size_t num_elements = 4 * xsimd::simd_traits<double>::size;
- static constexpr std::size_t small_num = xsimd::simd_traits<double>::size - 1;
-@@ -211,11 +219,10 @@ TEST_F(xsimd_reduce, using_custom_binary_function)
- }
- }
-
-+#if XSIMD_X86_INSTR_SET > XSIMD_VERSION_NUMBER_NOT_AVAILABLE || XSIMD_ARM_INSTR_SET > XSIMD_VERSION_NUMBER_NOT_AVAILABLE
- TEST(xsimd, iterator)
- {
-- std::vector<float, xsimd::aligned_allocator<float, XSIMD_DEFAULT_ALIGNMENT>> a(10 * 16, 0.2);
-- std::vector<float, xsimd::aligned_allocator<float, XSIMD_DEFAULT_ALIGNMENT>> b(1000, 2.);
-- std::vector<float, xsimd::aligned_allocator<float, XSIMD_DEFAULT_ALIGNMENT>> c(1000, 3.);
-+ std::vector<float, test_allocator_type<float>> a(10 * 16, 0.2), b(1000, 2.), c(1000, 3.);
-
- std::iota(a.begin(), a.end(), 0.f);
- std::vector<float> a_cpy(a.begin(), a.end());
-@@ -245,7 +252,7 @@ TEST(xsimd, iterator)
- }
-
- #ifdef XSIMD_BATCH_DOUBLE_SIZE
-- std::vector<std::complex<double>, xsimd::aligned_allocator<std::complex<double>, XSIMD_DEFAULT_ALIGNMENT>> ca(10 * 16, std::complex<double>(0.2));
-+ std::vector<std::complex<double>, test_allocator_type<std::complex<double>>> ca(10 * 16, std::complex<double>(0.2));
- using cbatch_type = typename xsimd::simd_traits<std::complex<double>>::type;
- auto cbegin = xsimd::aligned_iterator<cbatch_type>(&ca[0]);
- auto cend = xsimd::aligned_iterator<cbatch_type>(&ca[0] + a.size());
-@@ -262,3 +269,4 @@ TEST(xsimd, iterator)
- #endif
-
- }
-+#endif
-diff --git a/test/xsimd_api_test.cpp b/test/xsimd_api_test.cpp
-index 74fbcbb..f224214 100644
---- a/test/xsimd_api_test.cpp
-+++ b/test/xsimd_api_test.cpp
-@@ -36,7 +36,7 @@ namespace xsimd
- }
- }
-
--#if XSIMD_X86_INSTR_SET_AVAILABLE > XSIMD_VERSION_NUMBER_NOT_AVAILABLE
-+#if XSIMD_X86_INSTR_SET > XSIMD_VERSION_NUMBER_NOT_AVAILABLE
- TEST(xsimd, complex_return_type)
- {
- using cf_type = std::complex<float>;
-diff --git a/test/xsimd_basic_math_test.cpp b/test/xsimd_basic_math_test.cpp
-index cd62bc0..b192f1b 100644
---- a/test/xsimd_basic_math_test.cpp
-+++ b/test/xsimd_basic_math_test.cpp
-@@ -11,6 +11,8 @@
-
- #include "gtest/gtest.h"
-
-+#ifdef XSIMD_INSTR_SET_AVAILABLE
-+
- #include "xsimd/math/xsimd_basic_math.hpp"
- #include "xsimd/memory/xsimd_aligned_allocator.hpp"
- #include "xsimd/types/xsimd_types_include.hpp"
-@@ -105,4 +107,5 @@ TEST(xsimd, fallback_double_basic_math)
- bool res = xsimd::test_basic_math<double, 3, 32>(out, "fallback double");
- EXPECT_TRUE(res);
- }
--#endif
-\ No newline at end of file
-+#endif
-+#endif // XSIMD_INSTR_SET_AVAILABLE
-diff --git a/test/xsimd_error_gamma_test.cpp b/test/xsimd_error_gamma_test.cpp
-index 8241ef3..c70904b 100644
---- a/test/xsimd_error_gamma_test.cpp
-+++ b/test/xsimd_error_gamma_test.cpp
-@@ -11,6 +11,8 @@
-
- #include "gtest/gtest.h"
-
-+#ifdef XSIMD_INSTR_SET_AVAILABLE
-+
- #include "xsimd/math/xsimd_error.hpp"
- #include "xsimd/math/xsimd_gamma.hpp"
- #include "xsimd/memory/xsimd_aligned_allocator.hpp"
-@@ -106,4 +108,5 @@ TEST(xsimd, fallback_double_error_gamma)
- bool res = xsimd::test_error_gamma<double, 3, 32>(out, "fallback double");
- EXPECT_TRUE(res);
- }
--#endif
-\ No newline at end of file
-+#endif
-+#endif // XSIMD_INSTR_SET_AVAILABLE
-diff --git a/test/xsimd_exponential_test.cpp b/test/xsimd_exponential_test.cpp
-index 7a6f4b3..43ec983 100644
---- a/test/xsimd_exponential_test.cpp
-+++ b/test/xsimd_exponential_test.cpp
-@@ -11,6 +11,8 @@
-
- #include "gtest/gtest.h"
-
-+#ifdef XSIMD_INSTR_SET_AVAILABLE
-+
- #include "xsimd/math/xsimd_exponential.hpp"
- #include "xsimd/math/xsimd_logarithm.hpp"
- #include "xsimd/memory/xsimd_aligned_allocator.hpp"
-@@ -106,4 +108,5 @@ TEST(xsimd, fallback_double_exponential)
- bool res = xsimd::test_exponential<double, 3, 32>(out, "fallback double");
- EXPECT_TRUE(res);
- }
--#endif
-\ No newline at end of file
-+#endif
-+#endif // XSIMD_INSTR_SET_AVAILABLE
-diff --git a/test/xsimd_fp_manipulation_test.cpp b/test/xsimd_fp_manipulation_test.cpp
-index c2d7f67..d19ed3e 100644
---- a/test/xsimd_fp_manipulation_test.cpp
-+++ b/test/xsimd_fp_manipulation_test.cpp
-@@ -11,6 +11,8 @@
-
- #include "gtest/gtest.h"
-
-+#ifdef XSIMD_INSTR_SET_AVAILABLE
-+
- #include "xsimd/math/xsimd_fp_manipulation.hpp"
- #include "xsimd/memory/xsimd_aligned_allocator.hpp"
- #include "xsimd/types/xsimd_types_include.hpp"
-@@ -105,4 +107,5 @@ TEST(xsimd, fallback_double_fp_manipulation)
- bool res = xsimd::test_fp_manipulation<double, 3, 32>(out, "fallback double");
- EXPECT_TRUE(res);
- }
--#endif
-\ No newline at end of file
-+#endif
-+#endif // XSIMD_INSTR_SET_AVAILABLE
-diff --git a/test/xsimd_hyperbolic_test.cpp b/test/xsimd_hyperbolic_test.cpp
-index 23f2506..9a76ec4 100644
---- a/test/xsimd_hyperbolic_test.cpp
-+++ b/test/xsimd_hyperbolic_test.cpp
-@@ -11,6 +11,8 @@
-
- #include "gtest/gtest.h"
-
-+#ifdef XSIMD_INSTR_SET_AVAILABLE
-+
- #include "xsimd/math/xsimd_hyperbolic.hpp"
- #include "xsimd/memory/xsimd_aligned_allocator.hpp"
- #include "xsimd/types/xsimd_types_include.hpp"
-@@ -105,4 +107,5 @@ TEST(xsimd, fallback_double_hyperbolic)
- bool res = xsimd::test_hyperbolic<double, 3, 32>(out, "fallback double");
- EXPECT_TRUE(res);
- }
--#endif
-\ No newline at end of file
-+#endif
-+#endif // XSIMD_INSTR_SET_AVAILABLE
-diff --git a/test/xsimd_interface_test.cpp b/test/xsimd_interface_test.cpp
-index ebbfe44..976b04a 100644
---- a/test/xsimd_interface_test.cpp
-+++ b/test/xsimd_interface_test.cpp
-@@ -12,6 +12,8 @@
-
- #include "gtest/gtest.h"
-
-+#ifdef XSIMD_INSTR_SET_AVAILABLE
-+
- #include "xsimd/xsimd.hpp"
-
- namespace xsimd
-@@ -109,3 +111,4 @@ namespace xsimd
- EXPECT_EQ(t.ivec, t.ires);
- }
- }
-+#endif // XSIMD_INSTR_SET_AVAILABLE
-diff --git a/test/xsimd_memory_test.cpp b/test/xsimd_memory_test.cpp
-index 754c5ec..1e48762 100644
---- a/test/xsimd_memory_test.cpp
-+++ b/test/xsimd_memory_test.cpp
-@@ -11,6 +11,8 @@
-
- #include "gtest/gtest.h"
-
-+#ifdef XSIMD_INSTR_SET_AVAILABLE
-+
- #include "xsimd/memory/xsimd_alignment.hpp"
-
- namespace xsimd
-@@ -31,3 +33,4 @@ namespace xsimd
- EXPECT_TRUE((std::is_same<mock_align, unaligned_mode>::value));
- }
- }
-+#endif // XSIMD_INSTR_SET_AVAILABLE
-diff --git a/test/xsimd_power_test.cpp b/test/xsimd_power_test.cpp
-index 99475c6..3b6376a 100644
---- a/test/xsimd_power_test.cpp
-+++ b/test/xsimd_power_test.cpp
-@@ -11,6 +11,8 @@
-
- #include "gtest/gtest.h"
-
-+#ifdef XSIMD_INSTR_SET_AVAILABLE
-+
- #include "xsimd/math/xsimd_power.hpp"
- #include "xsimd/memory/xsimd_aligned_allocator.hpp"
- #include "xsimd/types/xsimd_types_include.hpp"
-@@ -105,4 +107,5 @@ TEST(xsimd, fallback_double_power)
- bool res = xsimd::test_power<double, 3, 32>(out, "fallback double");
- EXPECT_TRUE(res);
- }
--#endif
-\ No newline at end of file
-+#endif
-+#endif // XSIMD_INSTR_SET_AVAILABLE
-diff --git a/test/xsimd_rounding_test.cpp b/test/xsimd_rounding_test.cpp
-index 420ca3a..7fca3e4 100644
---- a/test/xsimd_rounding_test.cpp
-+++ b/test/xsimd_rounding_test.cpp
-@@ -11,6 +11,8 @@
-
- #include "gtest/gtest.h"
-
-+#ifdef XSIMD_INSTR_SET_AVAILABLE
-+
- #include "xsimd/math/xsimd_rounding.hpp"
- #include "xsimd/memory/xsimd_aligned_allocator.hpp"
- #include "xsimd/types/xsimd_types_include.hpp"
-@@ -105,4 +107,5 @@ TEST(xsimd, fallback_double_rounding)
- bool res = xsimd::test_rounding<double, 3, 32>(out, "fallback double");
- EXPECT_TRUE(res);
- }
--#endif
-\ No newline at end of file
-+#endif
-+#endif // XSIMD_INSTR_SET_AVAILABLE
-diff --git a/test/xsimd_trigonometric_test.cpp b/test/xsimd_trigonometric_test.cpp
-index 2fba7f9..9998711 100644
---- a/test/xsimd_trigonometric_test.cpp
-+++ b/test/xsimd_trigonometric_test.cpp
-@@ -11,6 +11,8 @@
-
- #include "gtest/gtest.h"
-
-+#ifdef XSIMD_INSTR_SET_AVAILABLE
-+
- #include "xsimd/math/xsimd_trigonometric.hpp"
- #include "xsimd/memory/xsimd_aligned_allocator.hpp"
- #include "xsimd/types/xsimd_types_include.hpp"
-@@ -105,4 +107,5 @@ TEST(xsimd, fallback_double_trigonometric)
- bool res = xsimd::test_trigonometric<double, 3, 32>(out, "fallback double");
- EXPECT_TRUE(res);
- }
--#endif
-\ No newline at end of file
-+#endif
-+#endif // XSIMD_INSTR_SET_AVAILABLE
---
-2.21.0
-
diff --git a/296.patch b/296.patch
deleted file mode 100644
index 34ebe16..0000000
--- a/296.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-From e98a72f68cb68f388d3c509b4ced69318194b575 Mon Sep 17 00:00:00 2001
-From: Johan Mabille <johan.mabille(a)gmail.com>
-Date: Thu, 4 Jul 2019 15:50:03 +0200
-Subject: [PATCH] Fixed flags for ppc architecture
-
----
- test/CMakeLists.txt | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
-index b14a588..52c5a08 100644
---- a/test/CMakeLists.txt
-+++ b/test/CMakeLists.txt
-@@ -45,6 +45,8 @@ if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID MATCHES "GNU"
- include_directories(/usr/${ARM_ARCH_DIRECTORY}/include/c++/${ARM_GCC_VER}/)
- include_directories(/usr/${ARM_ARCH_DIRECTORY}/include/)
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=${TARGET_ARCH} -Wunused-parameter -Wextra -Wreorder -std=c++11")
-+ elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "^ppc64")
-+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -fPIC -mcpu=${TARGET_ARCH} -mtune=${TARGET_ARCH} -Wunused-parameter -Wextra -Wreorder -std=c++11")
- elseif(NOT WIN32)
- CHECK_CXX_COMPILER_FLAG("-std=c++11" HAS_CPP11_FLAG)
- if (ENABLE_XTL_COMPLEX)
diff --git a/sources b/sources
index 6586919..3b5bec0 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (xsimd-7.2.3.tar.gz) = fb34eeb585f6820499734f10f03a4efd0d9a9b4be56f9bee21f3564eb92be56e7abe7682e476fafaff4733939f33f91cb4ab9209140b19f7b740538853433532
+SHA512 (xsimd-7.4.6.tar.gz) = 70d41848ce63bcf56072349ff587fe93806bbe66b8c50d33f732565905e13daf2b9238402f46f5c0346c21378d39215e3408e7d71274e9009bcaecc53212404e
diff --git a/xsimd.spec b/xsimd.spec
index 0c04124..7a61f8e 100644
--- a/xsimd.spec
+++ b/xsimd.spec
@@ -1,22 +1,21 @@
Name: xsimd
-Version: 7.2.3
-Release: 4%{?dist}
+Version: 7.4.6
+Release: 1%{?dist}
Summary: C++ wrappers for SIMD intrinsics
License: BSD
URL: https://xsimd.readthedocs.io/
%global github https://github.com/QuantStack/xsimd
Source0: %{github}/archive/%{version}/%{name}-%{version}.tar.gz
-# Workaround for armv7hl build failures
-# https://github.com/QuantStack/xsimd/pull/292 rebased
-Patch1: 292.patch
-# Workaround for ppc64le build failures
-Patch2: %{github}/pull/296.patch
-
BuildRequires: cmake
BuildRequires: gcc-c++
BuildRequires: gtest-devel
+%ifarch %{arm}
+# Only used for testing, as it's a header-only package.
+%global optflags %(echo %{optflags} -mfpu=neon)
+%endif
+
# there is no actual arched content - this is a header only library
%global debug_package %{nil}
@@ -45,26 +44,30 @@ Provides: %{name}-static = %{version}-%{release}
%autosetup -p1
%build
-%cmake -DBUILD_TESTS=ON \
-%ifarch armv7l armv7hl armv7hnl
--DXSIMD_FORCE_ARM_INSTR_SET=70000000 \
-%endif
-.
+%cmake -DBUILD_TESTS=ON .
+
%make_build
%install
%make_install
%check
+# Explicitly not supported upstream for simd mode. Still valuable for scalar mode layer.
+%ifnarch ppc64le s390x
%make_build xtest
+%endif
%files devel
%doc README.md
%license LICENSE
%{_includedir}/%{name}/
%{_libdir}/cmake/%{name}/
+%{_libdir}/pkgconfig/%{name}.pc
%changelog
+* Thu Jan 16 2020 sguelton(a)redhat.com - 7.4.6-1
+- Update to latest version
+
* Sat Jul 27 2019 Fedora Release Engineering <releng(a)fedoraproject.org> - 7.2.3-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
4 years, 2 months
Architecture specific change in rpms/opencv.git
by githook-noreply@fedoraproject.org
The package rpms/opencv.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/opencv.git/commit/?id=dcd968ae997....
Change:
+%ifarch ppc64le
Thanks.
Full change:
============
commit dcd968ae9973755bd9d772328cfcffae00d473c9
Author: Nicolas Chauvet <kwizart(a)gmail.com>
Date: Tue Jan 28 08:49:09 2020 +0100
Disable intrinsincs for ppc64le
Upstream report
https://github.com/opencv/opencv/issues/16448
diff --git a/opencv.spec b/opencv.spec
index 036ba89..d304a83 100644
--- a/opencv.spec
+++ b/opencv.spec
@@ -291,6 +291,9 @@ popd
%ifarch x86_64 %{ix86}
-DCPU_BASELINE=SSE2 \
%endif
+%ifarch ppc64le
+ -DCV_ENABLE_INTRINSICS=OFF \
+%endif
-DENABLE_PRECOMPILED_HEADERS=OFF \
-DCMAKE_BUILD_TYPE=ReleaseWithDebInfo \
%{?with_java: -DBUILD_opencv_java=ON \
4 years, 2 months