Date: Thursday, February 24, 2022 @ 09:48:53 Author: foutrelis Revision: 438061
upgpkg: clang 13.0.1-2: fix CFI in C++17 mode Fixes Chromium 99 which enabled -std=c++17 (https://crbug.com/1273966). Added: clang/trunk/strip-exception-specifications-in-CFI-type-names.patch Modified: clang/trunk/PKGBUILD --------------------------------------------------------+ PKGBUILD | 5 + strip-exception-specifications-in-CFI-type-names.patch | 59 +++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) Modified: PKGBUILD =================================================================== --- PKGBUILD 2022-02-24 09:32:18 UTC (rev 438060) +++ PKGBUILD 2022-02-24 09:48:53 UTC (rev 438061) @@ -3,7 +3,7 @@ pkgname=clang pkgver=13.0.1 -pkgrel=1 +pkgrel=2 pkgdesc="C language family frontend for LLVM" arch=('x86_64') url="https://clang.llvm.org/" @@ -21,6 +21,7 @@ $_source_base/clang-tools-extra-$pkgver.src.tar.xz{,.sig} $_source_base/llvm-$pkgver.src.tar.xz{,.sig} fix-scan-build-py-executable-lookup-path.patch + strip-exception-specifications-in-CFI-type-names.patch enable-SSP-and-PIE-by-default.patch) sha256sums=('787a9e2d99f5c8720aa1773e4be009461cd30d3bd40fdd24591e473467c917c9' 'SKIP' @@ -29,6 +30,7 @@ 'ec6b80d82c384acad2dc192903a6cf2cdbaffb889b84bfb98da9d71e630fc834' 'SKIP' '578b960121c42b8db80566dcb51558409d04455b618cdd608e41b35ded36c13e' + '3f4a2784a4c2b2df13e03beb0b66d5805c520f2b9f16ff76e0557daeb284c8fa' '67706047fc93a2e79185d344bdac48219ce042c55ddb9b9397bc98db2153ba58') validpgpkeys+=('B6C8F98282B944E3B0D5C2530FC3042E345AD05D') # Hans Wennborg <h...@chromium.org> validpgpkeys+=('474E22316ABF4785A88C6E8EA2C794A986419D8A') # Tom Stellard <tstel...@redhat.com> @@ -62,6 +64,7 @@ patch -Np2 -i ../enable-SSP-and-PIE-by-default.patch patch -Np2 -i ../fix-scan-build-py-executable-lookup-path.patch + patch -Np2 -i ../strip-exception-specifications-in-CFI-type-names.patch # Attempt to convert script to Python 3 2to3 -wn --no-diffs \ Added: strip-exception-specifications-in-CFI-type-names.patch =================================================================== --- strip-exception-specifications-in-CFI-type-names.patch (rev 0) +++ strip-exception-specifications-in-CFI-type-names.patch 2022-02-24 09:48:53 UTC (rev 438061) @@ -0,0 +1,59 @@ +From 0a14674f276b598d23353290635fc62f93e9ab30 Mon Sep 17 00:00:00 2001 +From: Peter Collingbourne <pe...@pcc.me.uk> +Date: Fri, 3 Dec 2021 14:48:57 -0500 +Subject: [PATCH] CodeGen: Strip exception specifications from function types + in CFI type names. + +With C++17 the exception specification has been made part of the +function type, and therefore part of mangled type names. + +However, it's valid to convert function pointers with an exception +specification to function pointers with the same argument and return +types but without an exception specification, which means that e.g. a +function of type "void () noexcept" can be called through a pointer +of type "void ()". We must therefore consider the two types to be +compatible for CFI purposes. + +We can do this by stripping the exception specification before mangling +the type name, which is what this patch does. + +Differential Revision: https://reviews.llvm.org/D115015 +--- + clang/lib/CodeGen/CodeGenModule.cpp | 5 +++++ + clang/test/CodeGenCXX/cfi-icall-noexcept.cpp | 11 +++++++++++ + 2 files changed, 16 insertions(+) + create mode 100644 clang/test/CodeGenCXX/cfi-icall-noexcept.cpp + +diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp +index 9ba1a5c25e81a..39044617d6774 100644 +--- a/clang/lib/CodeGen/CodeGenModule.cpp ++++ b/clang/lib/CodeGen/CodeGenModule.cpp +@@ -6398,6 +6398,11 @@ void CodeGenModule::EmitOMPThreadPrivateDecl(const OMPThreadPrivateDecl *D) { + llvm::Metadata * + CodeGenModule::CreateMetadataIdentifierImpl(QualType T, MetadataTypeMap &Map, + StringRef Suffix) { ++ if (auto *FnType = T->getAs<FunctionProtoType>()) ++ T = getContext().getFunctionType( ++ FnType->getReturnType(), FnType->getParamTypes(), ++ FnType->getExtProtoInfo().withExceptionSpec(EST_None)); ++ + llvm::Metadata *&InternalId = Map[T.getCanonicalType()]; + if (InternalId) + return InternalId; +diff --git a/clang/test/CodeGenCXX/cfi-icall-noexcept.cpp b/clang/test/CodeGenCXX/cfi-icall-noexcept.cpp +new file mode 100644 +index 0000000000000..eabc4862b4c52 +--- /dev/null ++++ b/clang/test/CodeGenCXX/cfi-icall-noexcept.cpp +@@ -0,0 +1,11 @@ ++// RUN: %clang_cc1 -triple x86_64-unknown-linux -fsanitize=cfi-icall -emit-llvm -std=c++17 -o - %s | FileCheck %s ++ ++// Tests that exception specifiers are stripped when forming the ++// mangled CFI type name. ++ ++void f() noexcept {} ++ ++// CHECK: define{{.*}} void @_Z1fv({{.*}} !type [[TS1:![0-9]+]] !type [[TS2:![0-9]+]] ++ ++// CHECK: [[TS1]] = !{i64 0, !"_ZTSFvvE"} ++// CHECK: [[TS2]] = !{i64 0, !"_ZTSFvvE.generalized"}