On Wed, Feb 12, 2020 at 04:05:38PM -0500, George Koehler wrote:
> This is the everything diff: it includes the clang diff that I sent to
> tech@, plus the major version bumps for libLLVM libc++ libc++abi.
>
> - distrib/sets/lists: put the new versions in the base sets.
> - gnu/llvm/tools/clang: -msvr4-struct-return
> - gnu/usr.bin/clang/libLLVM, lib/libcxx, lib/libcxxabi: new versions
I think this is good to go.
I built through the ABI change with this diff using the directions
George posted earlier:
> To update from source, you must build clang before you build the
> new versions of base libraries.
> First, change major=2 to major=1 in
> /usr/src/gnu/usr.bin/clang/libLLVM/shlib_version.
>
> Then build clang:
>
> # cd /usr/src/gnu/usr.bin/clang
> # make obj
> # make
> # make install
>
> Then change major=1 back to major=2 in
> /usr/src/gnu/usr.bin/clang/libLLVM/shlib_version.
> Then build userland (including clang again).
Then I built a new snapshot and sysupgraded to that snapshot, all
without incident. The snapshot is in my home dir on cvs
(snapshots/macppc) if anyone wants to avoid the build. I checked the
tarballs and the right versions of the bumped libs are all there.
ok mortimer@
>
> Index: distrib/sets/lists/base/md.amd64
> ===================================================================
> RCS file: /cvs/src/distrib/sets/lists/base/md.amd64,v
> retrieving revision 1.875
> diff -u -p -r1.875 md.amd64
> --- distrib/sets/lists/base/md.amd64 30 Dec 2019 02:20:33 -0000 1.875
> +++ distrib/sets/lists/base/md.amd64 12 Feb 2020 20:52:32 -0000
> @@ -81,9 +81,9 @@
> ./usr/lib/gcc-lib/amd64-unknown-openbsd6.6/4.2.1/collect2
> ./usr/lib/gcc-lib/amd64-unknown-openbsd6.6/4.2.1/libgcc.a
> ./usr/lib/gcc-lib/amd64-unknown-openbsd6.6/4.2.1/specs
> -./usr/lib/libLLVM.so.1.0
> -./usr/lib/libc++.so.3.0
> -./usr/lib/libc++abi.so.1.0
> +./usr/lib/libLLVM.so.2.0
> +./usr/lib/libc++.so.4.0
> +./usr/lib/libc++abi.so.2.0
> ./usr/lib/libcompiler_rt.a
> ./usr/lib/libstdc++.so.57.0
> ./usr/libdata/perl5/amd64-openbsd
> Index: distrib/sets/lists/base/md.arm64
> ===================================================================
> RCS file: /cvs/src/distrib/sets/lists/base/md.arm64,v
> retrieving revision 1.22
> diff -u -p -r1.22 md.arm64
> --- distrib/sets/lists/base/md.arm64 30 Dec 2019 02:20:34 -0000 1.22
> +++ distrib/sets/lists/base/md.arm64 12 Feb 2020 20:52:32 -0000
> @@ -37,9 +37,9 @@
> ./usr/lib/crtbeginS.o
> ./usr/lib/crtend.o
> ./usr/lib/crtendS.o
> -./usr/lib/libLLVM.so.1.0
> -./usr/lib/libc++.so.3.0
> -./usr/lib/libc++abi.so.1.0
> +./usr/lib/libLLVM.so.2.0
> +./usr/lib/libc++.so.4.0
> +./usr/lib/libc++abi.so.2.0
> ./usr/lib/libcompiler_rt.a
> ./usr/libdata/perl5/aarch64-openbsd
> ./usr/libdata/perl5/aarch64-openbsd/.packlist
> Index: distrib/sets/lists/base/md.armv7
> ===================================================================
> RCS file: /cvs/src/distrib/sets/lists/base/md.armv7,v
> retrieving revision 1.284
> diff -u -p -r1.284 md.armv7
> --- distrib/sets/lists/base/md.armv7 30 Dec 2019 02:20:34 -0000 1.284
> +++ distrib/sets/lists/base/md.armv7 12 Feb 2020 20:52:32 -0000
> @@ -37,9 +37,9 @@
> ./usr/lib/crtbeginS.o
> ./usr/lib/crtend.o
> ./usr/lib/crtendS.o
> -./usr/lib/libLLVM.so.1.0
> -./usr/lib/libc++.so.3.0
> -./usr/lib/libc++abi.so.1.0
> +./usr/lib/libLLVM.so.2.0
> +./usr/lib/libc++.so.4.0
> +./usr/lib/libc++abi.so.2.0
> ./usr/lib/libcompiler_rt.a
> ./usr/libdata/perl5/arm-openbsd
> ./usr/libdata/perl5/arm-openbsd/.packlist
> Index: distrib/sets/lists/base/md.i386
> ===================================================================
> RCS file: /cvs/src/distrib/sets/lists/base/md.i386,v
> retrieving revision 1.1254
> diff -u -p -r1.1254 md.i386
> --- distrib/sets/lists/base/md.i386 30 Dec 2019 02:20:34 -0000 1.1254
> +++ distrib/sets/lists/base/md.i386 12 Feb 2020 20:52:32 -0000
> @@ -78,9 +78,9 @@
> ./usr/lib/crtbeginS.o
> ./usr/lib/crtend.o
> ./usr/lib/crtendS.o
> -./usr/lib/libLLVM.so.1.0
> -./usr/lib/libc++.so.3.0
> -./usr/lib/libc++abi.so.1.0
> +./usr/lib/libLLVM.so.2.0
> +./usr/lib/libc++.so.4.0
> +./usr/lib/libc++abi.so.2.0
> ./usr/lib/libcompiler_rt.a
> ./usr/libdata/perl5/i386-openbsd
> ./usr/libdata/perl5/i386-openbsd/.packlist
> Index: distrib/sets/lists/base/md.loongson
> ===================================================================
> RCS file: /cvs/src/distrib/sets/lists/base/md.loongson,v
> retrieving revision 1.456
> diff -u -p -r1.456 md.loongson
> --- distrib/sets/lists/base/md.loongson 30 Dec 2019 02:20:34 -0000
> 1.456
> +++ distrib/sets/lists/base/md.loongson 12 Feb 2020 20:52:32 -0000
> @@ -48,9 +48,9 @@
> ./usr/lib/gcc-lib/mips64el-unknown-openbsd6.6/4.2.1/collect2
> ./usr/lib/gcc-lib/mips64el-unknown-openbsd6.6/4.2.1/libgcc.a
> ./usr/lib/gcc-lib/mips64el-unknown-openbsd6.6/4.2.1/specs
> -./usr/lib/libLLVM.so.1.0
> -./usr/lib/libc++.so.3.0
> -./usr/lib/libc++abi.so.1.0
> +./usr/lib/libLLVM.so.2.0
> +./usr/lib/libc++.so.4.0
> +./usr/lib/libc++abi.so.2.0
> ./usr/lib/libcompiler_rt.a
> ./usr/lib/libstdc++.so.57.0
> ./usr/libdata/perl5/mips64el-openbsd
> Index: distrib/sets/lists/base/md.macppc
> ===================================================================
> RCS file: /cvs/src/distrib/sets/lists/base/md.macppc,v
> retrieving revision 1.1023
> diff -u -p -r1.1023 md.macppc
> --- distrib/sets/lists/base/md.macppc 30 Dec 2019 02:20:34 -0000 1.1023
> +++ distrib/sets/lists/base/md.macppc 12 Feb 2020 20:52:32 -0000
> @@ -78,9 +78,9 @@
> ./usr/lib/gcc-lib/powerpc-unknown-openbsd6.6/4.2.1/collect2
> ./usr/lib/gcc-lib/powerpc-unknown-openbsd6.6/4.2.1/libgcc.a
> ./usr/lib/gcc-lib/powerpc-unknown-openbsd6.6/4.2.1/specs
> -./usr/lib/libLLVM.so.1.0
> -./usr/lib/libc++.so.3.0
> -./usr/lib/libc++abi.so.1.0
> +./usr/lib/libLLVM.so.2.0
> +./usr/lib/libc++.so.4.0
> +./usr/lib/libc++abi.so.2.0
> ./usr/lib/libcompiler_rt.a
> ./usr/lib/libstdc++.so.57.0
> ./usr/libdata/perl5/powerpc-openbsd
> Index: distrib/sets/lists/base/md.octeon
> ===================================================================
> RCS file: /cvs/src/distrib/sets/lists/base/md.octeon,v
> retrieving revision 1.307
> diff -u -p -r1.307 md.octeon
> --- distrib/sets/lists/base/md.octeon 30 Dec 2019 02:20:34 -0000 1.307
> +++ distrib/sets/lists/base/md.octeon 12 Feb 2020 20:52:32 -0000
> @@ -46,9 +46,9 @@
> ./usr/lib/gcc-lib/mips64-unknown-openbsd6.6/4.2.1/collect2
> ./usr/lib/gcc-lib/mips64-unknown-openbsd6.6/4.2.1/libgcc.a
> ./usr/lib/gcc-lib/mips64-unknown-openbsd6.6/4.2.1/specs
> -./usr/lib/libLLVM.so.1.0
> -./usr/lib/libc++.so.3.0
> -./usr/lib/libc++abi.so.1.0
> +./usr/lib/libLLVM.so.2.0
> +./usr/lib/libc++.so.4.0
> +./usr/lib/libc++abi.so.2.0
> ./usr/lib/libcompiler_rt.a
> ./usr/lib/libstdc++.so.57.0
> ./usr/libdata/perl5/mips64-openbsd
> Index: distrib/sets/lists/base/md.sgi
> ===================================================================
> RCS file: /cvs/src/distrib/sets/lists/base/md.sgi,v
> retrieving revision 1.836
> diff -u -p -r1.836 md.sgi
> --- distrib/sets/lists/base/md.sgi 30 Dec 2019 02:20:34 -0000 1.836
> +++ distrib/sets/lists/base/md.sgi 12 Feb 2020 20:52:32 -0000
> @@ -77,9 +77,9 @@
> ./usr/lib/gcc-lib/mips64-unknown-openbsd6.6/4.2.1/collect2
> ./usr/lib/gcc-lib/mips64-unknown-openbsd6.6/4.2.1/libgcc.a
> ./usr/lib/gcc-lib/mips64-unknown-openbsd6.6/4.2.1/specs
> -./usr/lib/libLLVM.so.1.0
> -./usr/lib/libc++.so.3.0
> -./usr/lib/libc++abi.so.1.0
> +./usr/lib/libLLVM.so.2.0
> +./usr/lib/libc++.so.4.0
> +./usr/lib/libc++abi.so.2.0
> ./usr/lib/libcompiler_rt.a
> ./usr/lib/libstdc++.so.57.0
> ./usr/libdata/perl5/mips64-openbsd
> Index: distrib/sets/lists/base/md.sparc64
> ===================================================================
> RCS file: /cvs/src/distrib/sets/lists/base/md.sparc64,v
> retrieving revision 1.1020
> diff -u -p -r1.1020 md.sparc64
> --- distrib/sets/lists/base/md.sparc64 30 Dec 2019 02:20:34 -0000
> 1.1020
> +++ distrib/sets/lists/base/md.sparc64 12 Feb 2020 20:52:32 -0000
> @@ -79,9 +79,9 @@
> ./usr/lib/gcc-lib/sparc64-unknown-openbsd6.6/4.2.1/collect2
> ./usr/lib/gcc-lib/sparc64-unknown-openbsd6.6/4.2.1/libgcc.a
> ./usr/lib/gcc-lib/sparc64-unknown-openbsd6.6/4.2.1/specs
> -./usr/lib/libLLVM.so.1.0
> -./usr/lib/libc++.so.3.0
> -./usr/lib/libc++abi.so.1.0
> +./usr/lib/libLLVM.so.2.0
> +./usr/lib/libc++.so.4.0
> +./usr/lib/libc++abi.so.2.0
> ./usr/lib/libcompiler_rt.a
> ./usr/lib/libstdc++.so.57.0
> ./usr/libdata/perl5/sparc64-openbsd
> Index: gnu/llvm/tools/clang/include/clang/Driver/Options.td
> ===================================================================
> RCS file: /cvs/src/gnu/llvm/tools/clang/include/clang/Driver/Options.td,v
> retrieving revision 1.11
> diff -u -p -r1.11 Options.td
> --- gnu/llvm/tools/clang/include/clang/Driver/Options.td 23 Jun 2019
> 22:05:15 -0000 1.11
> +++ gnu/llvm/tools/clang/include/clang/Driver/Options.td 12 Feb 2020
> 20:52:35 -0000
> @@ -2238,6 +2238,12 @@ def mlongcall: Flag<["-"], "mlongcall">,
> Group<m_ppc_Features_Group>;
> def mno_longcall : Flag<["-"], "mno-longcall">,
> Group<m_ppc_Features_Group>;
> +def maix_struct_return : Flag<["-"], "maix-struct-return">,
> + Group<m_Group>, Flags<[CC1Option]>,
> + HelpText<"Return all structs in memory (PPC32 only)">;
> +def msvr4_struct_return : Flag<["-"], "msvr4-struct-return">,
> + Group<m_Group>, Flags<[CC1Option]>,
> + HelpText<"Return small structs in registers (PPC32 only)">;
>
> def mvx : Flag<["-"], "mvx">, Group<m_Group>;
> def mno_vx : Flag<["-"], "mno-vx">, Group<m_Group>;
> Index: gnu/llvm/tools/clang/lib/CodeGen/TargetInfo.cpp
> ===================================================================
> RCS file: /cvs/src/gnu/llvm/tools/clang/lib/CodeGen/TargetInfo.cpp,v
> retrieving revision 1.1.1.7
> diff -u -p -r1.1.1.7 TargetInfo.cpp
> --- gnu/llvm/tools/clang/lib/CodeGen/TargetInfo.cpp 23 Jun 2019 21:37:39
> -0000 1.1.1.7
> +++ gnu/llvm/tools/clang/lib/CodeGen/TargetInfo.cpp 12 Feb 2020 20:52:35
> -0000
> @@ -4092,12 +4092,24 @@ namespace {
> /// PPC32_SVR4_ABIInfo - The 32-bit PowerPC ELF (SVR4) ABI information.
> class PPC32_SVR4_ABIInfo : public DefaultABIInfo {
> bool IsSoftFloatABI;
> + bool IsRetSmallStructInRegABI;
>
> CharUnits getParamTypeAlignment(QualType Ty) const;
>
> public:
> - PPC32_SVR4_ABIInfo(CodeGen::CodeGenTypes &CGT, bool SoftFloatABI)
> - : DefaultABIInfo(CGT), IsSoftFloatABI(SoftFloatABI) {}
> + PPC32_SVR4_ABIInfo(CodeGen::CodeGenTypes &CGT, bool SoftFloatABI,
> + bool RetSmallStructInRegABI)
> + : DefaultABIInfo(CGT), IsSoftFloatABI(SoftFloatABI),
> + IsRetSmallStructInRegABI(RetSmallStructInRegABI) {}
> +
> + ABIArgInfo classifyReturnType(QualType RetTy) const;
> +
> + void computeInfo(CGFunctionInfo &FI) const override {
> + if (!getCXXABI().classifyReturnType(FI))
> + FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
> + for (auto &I : FI.arguments())
> + I.info = classifyArgumentType(I.type);
> + }
>
> Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
> QualType Ty) const override;
> @@ -4105,8 +4117,13 @@ public:
>
> class PPC32TargetCodeGenInfo : public TargetCodeGenInfo {
> public:
> - PPC32TargetCodeGenInfo(CodeGenTypes &CGT, bool SoftFloatABI)
> - : TargetCodeGenInfo(new PPC32_SVR4_ABIInfo(CGT, SoftFloatABI)) {}
> + PPC32TargetCodeGenInfo(CodeGenTypes &CGT, bool SoftFloatABI,
> + bool RetSmallStructInRegABI)
> + : TargetCodeGenInfo(new PPC32_SVR4_ABIInfo(CGT, SoftFloatABI,
> + RetSmallStructInRegABI)) {}
> +
> + static bool isStructReturnInRegABI(const llvm::Triple &Triple,
> + const CodeGenOptions &Opts);
>
> int getDwarfEHStackPointer(CodeGen::CodeGenModule &M) const override {
> // This is recovered from gcc output.
> @@ -4142,6 +4159,34 @@ CharUnits PPC32_SVR4_ABIInfo::getParamTy
> return CharUnits::fromQuantity(4);
> }
>
> +ABIArgInfo PPC32_SVR4_ABIInfo::classifyReturnType(QualType RetTy) const {
> + uint64_t Size;
> +
> + // -msvr4-struct-return puts small aggregates in GPR3 and GPR4.
> + if (isAggregateTypeForABI(RetTy) && IsRetSmallStructInRegABI &&
> + (Size = getContext().getTypeSize(RetTy)) <= 64) {
> + // System V ABI (1995), page 3-22, specified:
> + // > A structure or union whose size is less than or equal to 8 bytes
> + // > shall be returned in r3 and r4, as if it were first stored in the
> + // > 8-byte aligned memory area and then the low addressed word were
> + // > loaded into r3 and the high-addressed word into r4. Bits beyond
> + // > the last member of the structure or union are not defined.
> + //
> + // GCC for big-endian PPC32 inserts the pad before the first member,
> + // not "beyond the last member" of the struct. To stay compatible
> + // with GCC, we coerce the struct to an integer of the same size.
> + // LLVM will extend it and return i32 in r3, or i64 in r3:r4.
> + if (Size == 0)
> + return ABIArgInfo::getIgnore();
> + else {
> + llvm::Type *CoerceTy = llvm::Type::getIntNTy(getVMContext(), Size);
> + return ABIArgInfo::getDirect(CoerceTy);
> + }
> + }
> +
> + return DefaultABIInfo::classifyReturnType(RetTy);
> +}
> +
> // TODO: this implementation is now likely redundant with
> // DefaultABIInfo::EmitVAArg.
> Address PPC32_SVR4_ABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAList,
> @@ -4299,6 +4344,25 @@ Address PPC32_SVR4_ABIInfo::EmitVAArg(Co
> return Result;
> }
>
> +bool PPC32TargetCodeGenInfo::isStructReturnInRegABI(
> + const llvm::Triple &Triple, const CodeGenOptions &Opts) {
> + assert(Triple.getArch() == llvm::Triple::ppc);
> +
> + switch (Opts.getStructReturnConvention()) {
> + case CodeGenOptions::SRCK_Default:
> + break;
> + case CodeGenOptions::SRCK_OnStack: // -maix-struct-return
> + return false;
> + case CodeGenOptions::SRCK_InRegs: // -msvr4-struct-return
> + return true;
> + }
> +
> + if (Triple.isOSBinFormatELF() && !Triple.isOSLinux())
> + return true;
> +
> + return false;
> +}
> +
> bool
> PPC32TargetCodeGenInfo::initDwarfEHRegSizeTable(CodeGen::CodeGenFunction
> &CGF,
> llvm::Value *Address) const {
> @@ -9330,9 +9394,13 @@ const TargetCodeGenInfo &CodeGenModule::
> return SetCGInfo(new ARMTargetCodeGenInfo(Types, Kind));
> }
>
> - case llvm::Triple::ppc:
> + case llvm::Triple::ppc: {
> + bool RetSmallStructInRegABI =
> + PPC32TargetCodeGenInfo::isStructReturnInRegABI(Triple, CodeGenOpts);
> return SetCGInfo(
> - new PPC32TargetCodeGenInfo(Types, CodeGenOpts.FloatABI == "soft"));
> + new PPC32TargetCodeGenInfo(Types, CodeGenOpts.FloatABI == "soft",
> + RetSmallStructInRegABI));
> + }
> case llvm::Triple::ppc64:
> if (Triple.isOSBinFormatELF()) {
> PPC64_SVR4_ABIInfo::ABIKind Kind = PPC64_SVR4_ABIInfo::ELFv1;
> Index: gnu/llvm/tools/clang/lib/Driver/ToolChains/Clang.cpp
> ===================================================================
> RCS file: /cvs/src/gnu/llvm/tools/clang/lib/Driver/ToolChains/Clang.cpp,v
> retrieving revision 1.20
> diff -u -p -r1.20 Clang.cpp
> --- gnu/llvm/tools/clang/lib/Driver/ToolChains/Clang.cpp 25 Oct 2019
> 00:40:56 -0000 1.20
> +++ gnu/llvm/tools/clang/lib/Driver/ToolChains/Clang.cpp 12 Feb 2020
> 20:52:35 -0000
> @@ -3870,6 +3870,19 @@ void Clang::ConstructJob(Compilation &C,
> CmdArgs.push_back(A->getValue());
> }
>
> + if (Arg *A = Args.getLastArg(options::OPT_maix_struct_return,
> + options::OPT_msvr4_struct_return)) {
> + if (TC.getArch() != llvm::Triple::ppc) {
> + D.Diag(diag::err_drv_unsupported_opt_for_target)
> + << A->getSpelling() << RawTriple.str();
> + } else if (A->getOption().matches(options::OPT_maix_struct_return)) {
> + CmdArgs.push_back("-maix-struct-return");
> + } else {
> + assert(A->getOption().matches(options::OPT_msvr4_struct_return));
> + CmdArgs.push_back("-msvr4-struct-return");
> + }
> + }
> +
> if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
> options::OPT_freg_struct_return)) {
> if (TC.getArch() != llvm::Triple::x86) {
> Index: gnu/llvm/tools/clang/lib/Frontend/CompilerInvocation.cpp
> ===================================================================
> RCS file: /cvs/src/gnu/llvm/tools/clang/lib/Frontend/CompilerInvocation.cpp,v
> retrieving revision 1.4
> diff -u -p -r1.4 CompilerInvocation.cpp
> --- gnu/llvm/tools/clang/lib/Frontend/CompilerInvocation.cpp 23 Jun 2019
> 22:05:15 -0000 1.4
> +++ gnu/llvm/tools/clang/lib/Frontend/CompilerInvocation.cpp 12 Feb 2020
> 20:52:35 -0000
> @@ -1199,11 +1199,18 @@ static bool ParseCodeGenArgs(CodeGenOpti
> Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) <<
> Val;
> }
>
> - if (Arg *A = Args.getLastArg(OPT_fpcc_struct_return,
> OPT_freg_struct_return)) {
> - if (A->getOption().matches(OPT_fpcc_struct_return)) {
> + // X86_32 has -fppc-struct-return and -freg-struct-return.
> + // PPC32 has -maix-struct-return and -msvr4-struct-return.
> + if (Arg *A =
> + Args.getLastArg(OPT_fpcc_struct_return, OPT_freg_struct_return,
> + OPT_maix_struct_return, OPT_msvr4_struct_return)) {
> + const Option &O = A->getOption();
> + if (O.matches(OPT_fpcc_struct_return) ||
> + O.matches(OPT_maix_struct_return)) {
> Opts.setStructReturnConvention(CodeGenOptions::SRCK_OnStack);
> } else {
> - assert(A->getOption().matches(OPT_freg_struct_return));
> + assert(O.matches(OPT_freg_struct_return) ||
> + O.matches(OPT_msvr4_struct_return));
> Opts.setStructReturnConvention(CodeGenOptions::SRCK_InRegs);
> }
> }
> Index: gnu/usr.bin/clang/libLLVM/shlib_version
> ===================================================================
> RCS file: /cvs/src/gnu/usr.bin/clang/libLLVM/shlib_version,v
> retrieving revision 1.2
> diff -u -p -r1.2 shlib_version
> --- gnu/usr.bin/clang/libLLVM/shlib_version 23 Jun 2019 22:07:38 -0000
> 1.2
> +++ gnu/usr.bin/clang/libLLVM/shlib_version 12 Feb 2020 20:52:41 -0000
> @@ -1,2 +1,2 @@
> -major=1
> +major=2
> minor=0
> Index: lib/libcxx/shlib_version
> ===================================================================
> RCS file: /cvs/src/lib/libcxx/shlib_version,v
> retrieving revision 1.6
> diff -u -p -r1.6 shlib_version
> --- lib/libcxx/shlib_version 17 Jun 2019 22:28:47 -0000 1.6
> +++ lib/libcxx/shlib_version 12 Feb 2020 20:52:46 -0000
> @@ -1,2 +1,2 @@
> -major=3
> +major=4
> minor=0
> Index: lib/libcxxabi/shlib_version
> ===================================================================
> RCS file: /cvs/src/lib/libcxxabi/shlib_version,v
> retrieving revision 1.4
> diff -u -p -r1.4 shlib_version
> --- lib/libcxxabi/shlib_version 17 Jun 2019 22:28:51 -0000 1.4
> +++ lib/libcxxabi/shlib_version 12 Feb 2020 20:52:46 -0000
> @@ -1,3 +1,3 @@
> # Don't forget to give libc++ the same type of bump!
> -major=1
> +major=2
> minor=0