summarylogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--D18035-add-gcc-abi_tag-support-mangler-part.patch199
-rw-r--r--PKGBUILD2
2 files changed, 101 insertions, 100 deletions
diff --git a/D18035-add-gcc-abi_tag-support-mangler-part.patch b/D18035-add-gcc-abi_tag-support-mangler-part.patch
index 7fe4ac815adb..8bc9db4f013b 100644
--- a/D18035-add-gcc-abi_tag-support-mangler-part.patch
+++ b/D18035-add-gcc-abi_tag-support-mangler-part.patch
@@ -2,16 +2,20 @@ Index: lib/AST/ItaniumMangle.cpp
===================================================================
--- lib/AST/ItaniumMangle.cpp
+++ lib/AST/ItaniumMangle.cpp
-@@ -214,6 +214,8 @@
+@@ -214,6 +214,12 @@
class CXXNameMangler {
ItaniumMangleContextImpl &Context;
raw_ostream &Out;
+ bool NullOut = false;
++ /// In the "DisableDerivedAbiTags" mode derived ABI tags are not calculated.
++ /// This mode is used when mangler creates another mangler recursively to
++ /// calculate ABI tags for the function return value or the variable type.
++ /// Also it is required to avoid infinite recursion in some cases.
+ bool DisableDerivedAbiTags = false;
/// The "structor" is the top-level declaration being mangled, if
/// that's not a template specialization; otherwise it's the pattern
-@@ -263,15 +265,176 @@
+@@ -263,27 +269,190 @@
} FunctionTypeDepth;
@@ -74,20 +78,20 @@ Index: lib/AST/ItaniumMangle.cpp
+ std::set<StringRef> EmittedAbiTags;
+
+ AbiTagState *&LinkHead;
-+ AbiTagState *Parent{ nullptr };
++ AbiTagState *Parent = nullptr;
+
-+ bool LinkActive{ false };
++ bool LinkActive = false;
+
+ public:
-+ explicit AbiTagState(AbiTagState *&linkHead) : LinkHead(linkHead) {
++ explicit AbiTagState(AbiTagState *&Head) : LinkHead(Head) {
+ Parent = LinkHead;
+ LinkHead = this;
+ LinkActive = true;
+ }
+
+ // no copy, no move
-+ AbiTagState(AbiTagState const &) = delete;
-+ AbiTagState &operator=(AbiTagState const &) = delete;
++ AbiTagState(const AbiTagState &) = delete;
++ AbiTagState &operator=(const AbiTagState &) = delete;
+
+ ~AbiTagState() { pop(); }
+
@@ -110,10 +114,7 @@ Index: lib/AST/ItaniumMangle.cpp
+ const AbiTagList *AdditionalAbiTags) {
+ ND = cast<NamedDecl>(ND->getCanonicalDecl());
+
-+ if (dyn_cast<FunctionDecl>(ND) || dyn_cast<VarDecl>(ND)) {
-+ // assert(AdditionalAbiTags && "function and variables need a list of
-+ // additional abi tags");
-+ } else {
++ if (!isa<FunctionDecl>(ND) && !isa<VarDecl>(ND)) {
+ assert(
+ !AdditionalAbiTags &&
+ "only function and variables need a list of additional abi tags");
@@ -123,7 +124,7 @@ Index: lib/AST/ItaniumMangle.cpp
+ UsedAbiTags.insert(Tag);
+ }
+ }
-+ // don't emit abi tags for namespaces
++ // Don't emit abi tags for namespaces.
+ return;
+ }
+ }
@@ -174,7 +175,7 @@ Index: lib/AST/ItaniumMangle.cpp
+ };
+
+ AbiTagState *AbiTags = nullptr;
-+ AbiTagState AbiTagsRoot{ AbiTags };
++ AbiTagState AbiTagsRoot;
+
llvm::DenseMap<uintptr_t, unsigned> Substitutions;
@@ -187,23 +188,30 @@ Index: lib/AST/ItaniumMangle.cpp
- SeqID(0) {
+ const NamedDecl *D = nullptr, bool NullOut_ = false)
+ : Context(C), Out(Out_), NullOut(NullOut_), Structor(getStructor(D)),
-+ StructorType(0), SeqID(0) {
++ StructorType(0), SeqID(0), AbiTagsRoot(AbiTags) {
// These can't be mangled without a ctor type or dtor type.
assert(!D || (!isa<CXXDestructorDecl>(D) &&
!isa<CXXConstructorDecl>(D)));
-@@ -285,6 +448,11 @@
+ }
+ CXXNameMangler(ItaniumMangleContextImpl &C, raw_ostream &Out_,
+ const CXXConstructorDecl *D, CXXCtorType Type)
: Context(C), Out(Out_), Structor(getStructor(D)), StructorType(Type),
- SeqID(0) { }
-
+- SeqID(0) { }
++ SeqID(0), AbiTagsRoot(AbiTags) { }
+ CXXNameMangler(ItaniumMangleContextImpl &C, raw_ostream &Out_,
+ const CXXDestructorDecl *D, CXXDtorType Type)
+ : Context(C), Out(Out_), Structor(getStructor(D)), StructorType(Type),
+- SeqID(0) { }
++ SeqID(0), AbiTagsRoot(AbiTags) { }
++
+ CXXNameMangler(CXXNameMangler &Outer, llvm::raw_null_ostream &Out_)
+ : Context(Outer.Context), Out(Out_), NullOut(true),
+ Structor(Outer.Structor), StructorType(Outer.StructorType),
-+ SeqID(Outer.SeqID) {}
-+
++ SeqID(Outer.SeqID), AbiTagsRoot(AbiTags) {}
+
#if MANGLE_CHECKER
~CXXNameMangler() {
- if (Out.str()[0] == '\01')
-@@ -298,14 +466,18 @@
+@@ -298,14 +467,18 @@
#endif
raw_ostream &getStream() { return Out; }
@@ -224,7 +232,7 @@ Index: lib/AST/ItaniumMangle.cpp
void mangleType(QualType T);
void mangleNameOrStandardSubstitution(const NamedDecl *ND);
-@@ -336,31 +508,53 @@
+@@ -336,31 +509,53 @@
DeclarationName name,
unsigned KnownArity = UnknownArity);
@@ -290,7 +298,7 @@ Index: lib/AST/ItaniumMangle.cpp
void mangleTemplatePrefix(TemplateName Template);
bool mangleUnresolvedTypeOrSimpleId(QualType DestroyedType,
StringRef Prefix = "");
-@@ -411,6 +605,15 @@
+@@ -411,6 +606,15 @@
void mangleTemplateParameter(unsigned Index);
void mangleFunctionParam(const ParmVarDecl *parm);
@@ -306,7 +314,7 @@ Index: lib/AST/ItaniumMangle.cpp
};
}
-@@ -454,13 +657,22 @@
+@@ -454,13 +658,20 @@
while (!DC->isNamespace() && !DC->isTranslationUnit())
DC = getEffectiveParentContext(DC);
if (DC->isTranslationUnit() && D->getFormalLinkage() != InternalLinkage &&
@@ -321,15 +329,13 @@ Index: lib/AST/ItaniumMangle.cpp
+void CXXNameMangler::writeAbiTags(const NamedDecl *ND,
+ const AbiTagList *AdditionalAbiTags) {
+ assert(AbiTags && "require AbiTagState");
-+ if (AbiTags)
-+ AbiTags->write(Out, ND,
-+ DisableDerivedAbiTags ? nullptr : AdditionalAbiTags);
++ AbiTags->write(Out, ND, DisableDerivedAbiTags ? nullptr : AdditionalAbiTags);
+}
+
void CXXNameMangler::mangle(const NamedDecl *D) {
// <mangled-name> ::= _Z <encoding>
// ::= <data name>
-@@ -476,14 +688,31 @@
+@@ -476,14 +687,31 @@
mangleName(cast<FieldDecl>(D));
}
@@ -348,7 +354,7 @@ Index: lib/AST/ItaniumMangle.cpp
+ }
+
+ // <encoding> ::= <function name> <bare-function-type>
-
++
+ if (ExcludeUnqualifiedName) {
+ // running makeAdditionalTagsForFunction would loop, don't need it here
+ // anyway
@@ -361,12 +367,12 @@ Index: lib/AST/ItaniumMangle.cpp
+
+ mangleFunctionEncodingBareType(FD);
+}
-+
+
+void CXXNameMangler::mangleFunctionEncodingBareType(const FunctionDecl *FD) {
if (FD->hasAttr<EnableIfAttr>()) {
FunctionTypeDepthState Saved = FunctionTypeDepth.push();
Out << "Ua9enable_ifI";
-@@ -587,7 +816,24 @@
+@@ -587,7 +815,24 @@
return nullptr;
}
@@ -376,7 +382,7 @@ Index: lib/AST/ItaniumMangle.cpp
+void CXXNameMangler::mangleName(const NamedDecl *ND,
+ bool ExcludeUnqualifiedName) {
+ if (!ExcludeUnqualifiedName) {
-+ if (const VarDecl *VD = dyn_cast<VarDecl>(ND)) {
++ if (const auto *VD = dyn_cast<VarDecl>(ND)) {
+ AbiTagList VariableAdditionalAbiTags = makeAdditionalTagsForVariable(VD);
+ mangleNameWithAbiTags(VD, &VariableAdditionalAbiTags,
+ ExcludeUnqualifiedName);
@@ -392,7 +398,7 @@ Index: lib/AST/ItaniumMangle.cpp
// <name> ::= <nested-name>
// ::= <unscoped-name>
// ::= <unscoped-template-name> <template-args>
-@@ -603,7 +849,7 @@
+@@ -603,7 +848,7 @@
while (!DC->isNamespace() && !DC->isTranslationUnit())
DC = getEffectiveParentContext(DC);
else if (GetLocalClassDecl(ND)) {
@@ -401,7 +407,7 @@ Index: lib/AST/ItaniumMangle.cpp
return;
}
-@@ -613,76 +859,93 @@
+@@ -613,76 +858,93 @@
// Check if we have a template.
const TemplateArgumentList *TemplateArgs = nullptr;
if (const TemplateDecl *TD = isTemplate(ND, TemplateArgs)) {
@@ -513,7 +519,7 @@ Index: lib/AST/ItaniumMangle.cpp
addSubstitution(Template);
}
-@@ -841,14 +1104,16 @@
+@@ -841,14 +1103,16 @@
else
Out << "sr";
mangleSourceName(qualifier->getAsNamespace()->getIdentifier());
@@ -530,7 +536,7 @@ Index: lib/AST/ItaniumMangle.cpp
break;
case NestedNameSpecifier::TypeSpec:
-@@ -883,6 +1148,7 @@
+@@ -883,6 +1147,7 @@
Out << "sr";
mangleSourceName(qualifier->getAsIdentifier());
@@ -538,7 +544,7 @@ Index: lib/AST/ItaniumMangle.cpp
break;
}
-@@ -928,7 +1194,8 @@
+@@ -928,7 +1193,8 @@
void CXXNameMangler::mangleUnqualifiedName(const NamedDecl *ND,
DeclarationName Name,
@@ -548,7 +554,7 @@ Index: lib/AST/ItaniumMangle.cpp
unsigned Arity = KnownArity;
// <unqualified-name> ::= <operator-name>
// ::= <ctor-dtor-name>
-@@ -947,6 +1214,7 @@
+@@ -947,6 +1213,7 @@
Out << 'L';
mangleSourceName(II);
@@ -556,7 +562,7 @@ Index: lib/AST/ItaniumMangle.cpp
break;
}
-@@ -986,6 +1254,7 @@
+@@ -986,6 +1253,7 @@
assert(FD->getIdentifier() && "Data member name isn't an identifier!");
mangleSourceName(FD->getIdentifier());
@@ -564,7 +570,7 @@ Index: lib/AST/ItaniumMangle.cpp
break;
}
-@@ -1006,6 +1275,10 @@
+@@ -1006,6 +1274,10 @@
assert(D->getDeclName().getAsIdentifierInfo() &&
"Typedef was not named!");
mangleSourceName(D->getDeclName().getAsIdentifierInfo());
@@ -575,7 +581,7 @@ Index: lib/AST/ItaniumMangle.cpp
break;
}
-@@ -1015,6 +1288,8 @@
+@@ -1015,6 +1287,8 @@
// <lambda-sig> ::= <parameter-type>+ # Parameter types or 'v' for 'void'.
if (const CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(TD)) {
if (Record->isLambda() && Record->getLambdaManglingNumber()) {
@@ -584,7 +590,7 @@ Index: lib/AST/ItaniumMangle.cpp
mangleLambda(Record);
break;
}
-@@ -1026,11 +1301,13 @@
+@@ -1026,11 +1300,13 @@
if (UnnamedMangle > 1)
Out << UnnamedMangle - 2;
Out << '_';
@@ -600,7 +606,7 @@ Index: lib/AST/ItaniumMangle.cpp
// Mangle it as a source name in the form
// [n] $_<id>
-@@ -1058,6 +1335,7 @@
+@@ -1058,6 +1334,7 @@
// Otherwise, use the complete constructor name. This is relevant if a
// class with a constructor is declared within a constructor.
mangleCXXCtorType(Ctor_Complete);
@@ -608,7 +614,7 @@ Index: lib/AST/ItaniumMangle.cpp
break;
case DeclarationName::CXXDestructorName:
-@@ -1069,6 +1347,7 @@
+@@ -1069,6 +1346,7 @@
// Otherwise, use the complete destructor name. This is relevant if a
// class with a destructor is declared within a destructor.
mangleCXXDtorType(Dtor_Complete);
@@ -616,7 +622,7 @@ Index: lib/AST/ItaniumMangle.cpp
break;
case DeclarationName::CXXOperatorName:
-@@ -1084,6 +1363,7 @@
+@@ -1084,6 +1362,7 @@
case DeclarationName::CXXConversionFunctionName:
case DeclarationName::CXXLiteralOperatorName:
mangleOperatorName(Name, Arity);
@@ -624,7 +630,7 @@ Index: lib/AST/ItaniumMangle.cpp
break;
case DeclarationName::CXXUsingDirective:
-@@ -1100,7 +1380,9 @@
+@@ -1100,7 +1379,9 @@
void CXXNameMangler::mangleNestedName(const NamedDecl *ND,
const DeclContext *DC,
@@ -635,7 +641,7 @@ Index: lib/AST/ItaniumMangle.cpp
// <nested-name>
// ::= N [<CV-qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E
// ::= N [<CV-qualifiers>] [<ref-qualifier>] <template-prefix>
-@@ -1120,30 +1402,36 @@
+@@ -1120,30 +1401,36 @@
// Check if we have a template.
const TemplateArgumentList *TemplateArgs = nullptr;
if (const TemplateDecl *TD = isTemplate(ND, TemplateArgs)) {
@@ -676,7 +682,7 @@ Index: lib/AST/ItaniumMangle.cpp
// <local-name> := Z <function encoding> E <entity name> [<discriminator>]
// := Z <function encoding> E s [<discriminator>]
// <local-name> := Z <function encoding> E d [ <parameter number> ]
-@@ -1155,15 +1443,26 @@
+@@ -1155,15 +1442,26 @@
Out << 'Z';
@@ -687,7 +693,7 @@ Index: lib/AST/ItaniumMangle.cpp
- else
- mangleFunctionEncoding(cast<FunctionDecl>(DC));
+ {
-+ AbiTagState localAbiTags(AbiTags);
++ AbiTagState LocalAbiTags(AbiTags);
+
+ if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(DC))
+ mangleObjCMethodName(MD);
@@ -698,18 +704,18 @@ Index: lib/AST/ItaniumMangle.cpp
+
+ // Implicit ABI tags (from namespace) are not available in the following
+ // entity; reset to actually emitted tags, which are available.
-+ localAbiTags.setUsedAbiTags(localAbiTags.getEmittedAbiTags());
++ LocalAbiTags.setUsedAbiTags(LocalAbiTags.getEmittedAbiTags());
+ }
Out << 'E';
-+ // GCC 5.3.0 doesn't emit derived abi tags for but that seems to be a bug
-+ // that is fixed in trunk.
++ // GCC 5.3.0 doesn't emit derived ABI tags for local names but that seems to
++ // be a bug that is fixed in trunk.
+
if (RD) {
// The parameter number is omitted for the last parameter, 0 for the
// second-to-last parameter, 1 for the third-to-last parameter, etc. The
-@@ -1188,13 +1487,17 @@
+@@ -1188,13 +1486,17 @@
// Mangle the name relative to the closest enclosing function.
// equality ok because RD derived from ND above
if (D == RD) {
@@ -730,7 +736,7 @@ Index: lib/AST/ItaniumMangle.cpp
}
} else if (const BlockDecl *BD = dyn_cast<BlockDecl>(D)) {
// Mangle a block in a default parameter; see above explanation for
-@@ -1211,30 +1514,37 @@
+@@ -1211,30 +1513,37 @@
}
}
@@ -781,7 +787,7 @@ Index: lib/AST/ItaniumMangle.cpp
return;
}
manglePrefix(getEffectiveDeclContext(Block));
-@@ -1245,10 +1555,11 @@
+@@ -1245,10 +1554,11 @@
if (Decl *Context = Block->getBlockManglingContextDecl()) {
if ((isa<VarDecl>(Context) || isa<FieldDecl>(Context)) &&
Context->getDeclContext()->isRecord()) {
@@ -796,7 +802,7 @@ Index: lib/AST/ItaniumMangle.cpp
}
}
}
-@@ -1281,7 +1592,7 @@
+@@ -1281,7 +1591,7 @@
if (const IdentifierInfo *Name
= cast<NamedDecl>(Context)->getIdentifier()) {
mangleSourceName(Name);
@@ -805,7 +811,7 @@ Index: lib/AST/ItaniumMangle.cpp
}
}
}
-@@ -1364,11 +1675,11 @@
+@@ -1364,11 +1674,11 @@
// Check if we have a template.
const TemplateArgumentList *TemplateArgs = nullptr;
if (const TemplateDecl *TD = isTemplate(ND, TemplateArgs)) {
@@ -819,7 +825,7 @@ Index: lib/AST/ItaniumMangle.cpp
}
addSubstitution(ND);
-@@ -1379,27 +1690,30 @@
+@@ -1379,27 +1689,30 @@
// ::= <template-param>
// ::= <substitution>
if (TemplateDecl *TD = Template.getAsTemplateDecl())
@@ -856,7 +862,7 @@ Index: lib/AST/ItaniumMangle.cpp
// <template-prefix> ::= <prefix> <template unqualified-name>
// ::= <template-param>
// ::= <substitution>
-@@ -1414,7 +1728,8 @@
+@@ -1414,7 +1727,8 @@
mangleTemplateParameter(TTP->getIndex());
} else {
manglePrefix(getEffectiveDeclContext(ND), NoFunction);
@@ -866,7 +872,7 @@ Index: lib/AST/ItaniumMangle.cpp
}
addSubstitution(ND);
-@@ -1458,6 +1773,7 @@
+@@ -1458,6 +1772,7 @@
// <name> ::= <nested-name>
mangleUnresolvedPrefix(Dependent->getQualifier());
mangleSourceName(Dependent->getIdentifier());
@@ -874,7 +880,7 @@ Index: lib/AST/ItaniumMangle.cpp
break;
}
-@@ -1550,16 +1866,19 @@
+@@ -1550,16 +1865,19 @@
case Type::Typedef:
mangleSourceName(cast<TypedefType>(Ty)->getDecl()->getIdentifier());
@@ -894,7 +900,7 @@ Index: lib/AST/ItaniumMangle.cpp
break;
case Type::TemplateSpecialization: {
-@@ -1578,6 +1897,7 @@
+@@ -1578,6 +1896,7 @@
goto unresolvedType;
mangleSourceName(TD->getIdentifier());
@@ -902,7 +908,7 @@ Index: lib/AST/ItaniumMangle.cpp
break;
}
-@@ -1609,16 +1929,19 @@
+@@ -1609,16 +1928,19 @@
case Type::InjectedClassName:
mangleSourceName(
cast<InjectedClassNameType>(Ty)->getDecl()->getIdentifier());
@@ -922,7 +928,7 @@ Index: lib/AST/ItaniumMangle.cpp
mangleTemplateArgs(DTST->getArgs(), DTST->getNumArgs());
break;
}
-@@ -2081,7 +2404,9 @@
+@@ -2081,7 +2403,9 @@
case BuiltinType::Id:
#include "clang/AST/BuiltinTypes.def"
case BuiltinType::Dependent:
@@ -933,7 +939,7 @@ Index: lib/AST/ItaniumMangle.cpp
case BuiltinType::ObjCId:
Out << "11objc_object";
break;
-@@ -2641,7 +2966,11 @@
+@@ -2641,7 +2965,11 @@
void CXXNameMangler::mangleType(const TemplateSpecializationType *T) {
if (TemplateDecl *TD = T->getTemplateName().getAsTemplateDecl()) {
@@ -946,7 +952,7 @@ Index: lib/AST/ItaniumMangle.cpp
} else {
if (mangleSubstitution(QualType(T, 0)))
return;
-@@ -2967,12 +3296,14 @@
+@@ -2967,12 +3295,14 @@
case Expr::PseudoObjectExprClass:
case Expr::AtomicExprClass:
{
@@ -967,7 +973,7 @@ Index: lib/AST/ItaniumMangle.cpp
break;
}
-@@ -4115,6 +4446,97 @@
+@@ -4115,6 +4445,97 @@
Substitutions[Ptr] = SeqID++;
}
@@ -1065,12 +1071,12 @@ Index: lib/AST/ItaniumMangle.cpp
//
/// Mangles the name of the declaration D and emits that name to the given
-@@ -4216,6 +4638,8 @@
+@@ -4216,6 +4637,8 @@
// <special-name> ::= GV <object name> # Guard variable for one-time
// # initialization
CXXNameMangler Mangler(*this, Out);
-+ // GCC 5.3.0 doesn't emit derived abi tags for but that seems to be a bug
-+ // that is fixed in trunk.
++ // GCC 5.3.0 doesn't emit derived ABI tags for local names but that seems to
++ // be a bug that is fixed in trunk.
Mangler.getStream() << "_ZGV";
Mangler.mangleName(D);
}
@@ -1093,8 +1099,8 @@ Index: test/CodeGenCXX/mangle-abi-tag.cpp
===================================================================
--- /dev/null
+++ test/CodeGenCXX/mangle-abi-tag.cpp
-@@ -0,0 +1,124 @@
-+// RUN: %clang_cc1 %s -emit-llvm -triple %itanium_abi_triple -o - | FileCheck %s
+@@ -0,0 +1,137 @@
++// RUN: %clang_cc1 %s -emit-llvm -triple %itanium_abi_triple -std=c++11 -o - | FileCheck %s
+
+struct __attribute__((abi_tag("A", "B"))) A { };
+
@@ -1158,10 +1164,10 @@ Index: test/CodeGenCXX/mangle-abi-tag.cpp
+// CHECK: @_ZTI3A10B1AB1B =
+
+// Local variables from f9.
-+// f9()::L::foo[abi:C][abi:D]()::a[abi:A][abi:B]
-+// CHECK-DAG: @_ZZZ2f9vEN1L3fooB1CB1DEvE1aB1AB1B =
-+// guard variable for f9()::L::foo[abi:C][abi:D]()::a[abi:A][abi:B]
-+// CHECK-DAG: @_ZGVZZ2f9vEN1L3fooB1CB1DEvE1aB1AB1B =
++// f11()::L::foo[abi:C][abi:D]()::a[abi:A][abi:B]
++// CHECK-DAG: @_ZZZ3f11vEN1L3fooB1CB1DEvE1aB1AB1B =
++// guard variable for f11()::L::foo[abi:C][abi:D]()::a[abi:A][abi:B]
++// CHECK-DAG: @_ZGVZZ3f11vEN1L3fooB1CB1DEvE1aB1AB1B =
+
+__attribute__ ((abi_tag("C", "D")))
+void* f1() {
@@ -1204,7 +1210,19 @@ Index: test/CodeGenCXX/mangle-abi-tag.cpp
+}
+// CHECK: define {{.*}} @_Z2f8P1EB1CB1DI1AB1AB1BE(
+
-+inline void f9() {
++inline namespace Names1 __attribute__((__abi_tag__)) {
++ class C1 {};
++}
++C1 f9() { return C1(); }
++// CHECK: @_Z2f9B6Names1v()
++
++inline namespace Names2 __attribute__((__abi_tag__("Tag1", "Tag2"))) {
++ class C2 {};
++}
++C2 f10() { return C2(); }
++// CHECK: @_Z3f10B4Tag1B4Tag2v()
++
++inline void f11() {
+ struct L {
+ static E<int>* foo() {
+ static A10 a;
@@ -1213,11 +1231,12 @@ Index: test/CodeGenCXX/mangle-abi-tag.cpp
+ };
+ L::foo();
+}
-+void f9_test() {
-+ f9();
++void f11_test() {
++ f11();
+}
-+// f9()::L::foo[abi:C][abi:D]()
-+// CHECK: define linkonce_odr %struct.E* @_ZZ2f9vEN1L3fooB1CB1DEv(
++// f11()::L::foo[abi:C][abi:D]()
++// CHECK: define linkonce_odr %struct.E* @_ZZ3f11vEN1L3fooB1CB1DEv(
++
Index: test/SemaCXX/attr-abi-tag-syntax.cpp
===================================================================
--- test/SemaCXX/attr-abi-tag-syntax.cpp
@@ -1251,21 +1270,3 @@ Index: test/SemaCXX/attr-abi-tag-syntax.cpp
// expected-error@-1 {{cannot add 'abi_tag' attribute in a redeclaration}}
-// FIXME: remove this warning as soon as attribute fully supported.
-// expected-warning@-3 {{'abi_tag' attribute ignored}}
-Index: test/SemaCXX/attr-abi-tag.cpp
-===================================================================
---- /dev/null
-+++ test/SemaCXX/attr-abi-tag.cpp
-@@ -0,0 +1,13 @@
-+// RUN: %clang_cc1 -x c++ -std=c++11 -triple x86_64-unknown-linux -emit-llvm < %s | FileCheck %s
-+
-+// CHECK: @_Z5Func1B6Names1v()
-+inline namespace Names1 __attribute__((__abi_tag__)) {
-+ class C1 {};
-+}
-+C1 Func1() { return C1(); }
-+
-+// CHECK: @_Z5Func2B4Tag1B4Tag2v()
-+inline namespace Names2 __attribute__((__abi_tag__("Tag1", "Tag2"))) {
-+ class C2 {};
-+}
-+C2 Func2() { return C2(); }
diff --git a/PKGBUILD b/PKGBUILD
index d22f23a52406..094982452934 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -56,7 +56,7 @@ sha256sums=(
'SKIP'
'SKIP'
'597dc5968c695bbdbb0eac9e8eb5117fcd2773bc91edf5ec103ecffffab8bc48'
- '3c325633f544db6ac3a2207cf5f49250d2d029cd12fe9ee6388fbb6b3edadf09'
+ '9c2d61afb25868616e68cb874d682e19a4152349ffd23b033af445e21af7c688'
)
#