r186714 - Create calling convention AttributedType sugar nodes
David Dean
david_dean at apple.com
Fri Jul 19 13:30:10 PDT 2013
Reid,
After this change, the compiler is crashing when running one of the tests on this bot:
http://lab.llvm.org:8013/builders/clang-x86_64-darwin11-nobootstrap-RAincremental/builds/4672
******************** TEST 'Clang :: SemaTemplate/instantiate-function-params.cpp' FAILED ********************
Script:
--
/Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin11-nobootstrap-RAincremental/clang-build/Release+Asserts/bin/clang -cc1 -internal-isystem /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin11-nobootstrap-RAincremental/clang-build/Release+Asserts/bin/../lib/clang/3.4/include -fsyntax-only -verify /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin11-nobootstrap-RAincremental/clang.src/test/SemaTemplate/instantiate-function-params.cpp
--
Exit Code: 139
Command Output (stderr):
--
0 clang 0x0000000107bcd058 llvm::sys::PrintStackTrace(__sFILE*) + 40
1 clang 0x0000000107bcd5a4 _ZL13SignalHandleri + 644
2 libsystem_c.dylib 0x00007fff94461cfa _sigtramp + 26
3 libsystem_c.dylib 0x00007fff9442a00e szone_malloc_should_clear + 1115
4 clang 0x00000001067de96c clang::TemplateDeclInstantiator::SubstFunctionType(clang::FunctionDecl*, llvm::SmallVectorImpl<clang::ParmVarDecl*>&) + 236
5 clang 0x00000001067dc0f7 clang::TemplateDeclInstantiator::VisitCXXMethodDecl(clang::CXXMethodDecl*, clang::TemplateParameterList*, bool) + 807
6 clang 0x00000001067b87f5 clang::Sema::InstantiateClass(clang::SourceLocation, clang::CXXRecordDecl*, clang::CXXRecordDecl*, clang::MultiLevelTemplateArgumentList const&, clang::TemplateSpecializationKind, bool) + 1189
7 clang 0x00000001067ba1a5 clang::Sema::InstantiateClassTemplateSpecialization(clang::SourceLocation, clang::ClassTemplateSpecializationDecl*, clang::TemplateSpecializationKind, bool) + 1749
8 clang 0x0000000106809df8 clang::Sema::RequireCompleteTypeImpl(clang::SourceLocation, clang::QualType, clang::Sema::TypeDiagnoser&) + 968
9 clang 0x0000000106809955 clang::Sema::RequireCompleteType(clang::SourceLocation, clang::QualType, clang::Sema::TypeDiagnoser&) + 21
10 clang 0x00000001067fe385 clang::Sema::RequireCompleteType(clang::SourceLocation, clang::QualType, unsigned int) + 37
11 clang 0x0000000106514b10 clang::Sema::CheckParmsForFunctionDef(clang::ParmVarDecl* const*, clang::ParmVarDecl* const*, bool) + 176
12 clang 0x000000010658866c clang::Sema::ActOnStartOfFunctionDef(clang::Scope*, clang::Decl*) + 1580
13 clang 0x00000001064af1f3 clang::Parser::ParseFunctionDefinition(clang::ParsingDeclarator&, clang::Parser::ParsedTemplateInfo const&, clang::Parser::LateParsedAttrList*) + 1715
14 clang 0x0000000106442c17 clang::Parser::ParseDeclGroup(clang::ParsingDeclSpec&, unsigned int, bool, clang::SourceLocation*, clang::Parser::ForRangeInit*) + 1319
15 clang 0x00000001064ae9c6 clang::Parser::ParseDeclOrFunctionDefInternal(clang::Parser::ParsedAttributesWithRange&, clang::ParsingDeclSpec&, clang::AccessSpecifier) + 646
16 clang 0x00000001064ae417 clang::Parser::ParseDeclarationOrFunctionDefinition(clang::Parser::ParsedAttributesWithRange&, clang::ParsingDeclSpec*, clang::AccessSpecifier) + 359
17 clang 0x00000001064ad847 clang::Parser::ParseExternalDeclaration(clang::Parser::ParsedAttributesWithRange&, clang::ParsingDeclSpec*) + 2615
18 clang 0x00000001064534a8 clang::Parser::ParseInnerNamespace(std::vector<clang::SourceLocation, std::allocator<clang::SourceLocation> >&, std::vector<clang::IdentifierInfo*, std::allocator<clang::IdentifierInfo*> >&, std::vector<clang::SourceLocation, std::allocator<clang::SourceLocation> >&, unsigned int, clang::SourceLocation&, clang::ParsedAttributes&, clang::BalancedDelimiterTracker&) + 472
19 clang 0x0000000106452a7c clang::Parser::ParseNamespace(unsigned int, clang::SourceLocation&, clang::SourceLocation) + 4332
20 clang 0x000000010643f30c clang::Parser::ParseDeclaration(llvm::SmallVector<clang::Stmt*, 32u>&, unsigned int, clang::SourceLocation&, clang::Parser::ParsedAttributesWithRange&) + 428
21 clang 0x00000001064ad3fd clang::Parser::ParseExternalDeclaration(clang::Parser::ParsedAttributesWithRange&, clang::ParsingDeclSpec*) + 1517
22 clang 0x00000001064acd8e clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&) + 318
23 clang 0x00000001064323d6 clang::ParseAST(clang::Sema&, bool, bool) + 438
24 clang 0x000000010618d017 clang::FrontendAction::Execute() + 119
25 clang 0x000000010616658d clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) + 973
26 clang 0x000000010612d45f clang::ExecuteCompilerInvocation(clang::CompilerInstance*) + 3471
27 clang 0x000000010612497a cc1_main(char const**, char const**, char const*, void*) + 826
28 clang 0x000000010612b580 main + 9504
29 clang 0x0000000106124634 start + 52
30 clang 0x0000000000000007 start + 4193106439
Stack dump:
0. Program arguments: /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin11-nobootstrap-RAincremental/clang-build/Release+Asserts/bin/clang -cc1 -internal-isystem /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin11-nobootstrap-RAincremental/clang-build/Release+Asserts/bin/../lib/clang/3.4/include -fsyntax-only -verify /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin11-nobootstrap-RAincremental/clang.src/test/SemaTemplate/instantiate-function-params.cpp
1. /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin11-nobootstrap-RAincremental/clang.src/test/SemaTemplate/instantiate-function-params.cpp:91:20: current parser token '{'
2. /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin11-nobootstrap-RAincremental/clang.src/test/SemaTemplate/instantiate-function-params.cpp:80:1: parsing namespace 'InstantiateFunctionTypedef'
/Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin11-nobootstrap-RAincremental/clang-build/tools/clang/test/SemaTemplate/Output/instantiate-function-params.cpp.script: line 1: 14172 Segmentation fault: 11 /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin11-nobootstrap-RAincremental/clang-build/Release+Asserts/bin/clang -cc1 -internal-isystem /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin11-nobootstrap-RAincremental/clang-build/Release+Asserts/bin/../lib/clang/3.4/include -fsyntax-only -verify /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin11-nobootstrap-RAincremental/clang.src/test/SemaTemplate/instantiate-function-params.cpp
--
********************
On 19 Jul 2013, at 12:51 PM, Reid Kleckner <reid at kleckner.net> wrote:
> Author: rnk
> Date: Fri Jul 19 14:51:03 2013
> New Revision: 186714
>
> URL: http://llvm.org/viewvc/llvm-project?rev=186714&view=rev
> Log:
> Create calling convention AttributedType sugar nodes
>
> Canonical types are unchanged. The type printer had to be changed to
> avoid printing any non-default implicit calling convention as well as
> the calling convention attribute.
>
> Reviewers: rjmccall
>
> Differential Revision: http://llvm-reviews.chandlerc.com/D1132
>
> Modified:
> cfe/trunk/include/clang/AST/Type.h
> cfe/trunk/lib/AST/Type.cpp
> cfe/trunk/lib/AST/TypePrinter.cpp
> cfe/trunk/lib/Sema/SemaType.cpp
> cfe/trunk/test/SemaTemplate/instantiate-function-params.cpp
>
> Modified: cfe/trunk/include/clang/AST/Type.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Type.h?rev=186714&r1=186713&r2=186714&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/Type.h (original)
> +++ cfe/trunk/include/clang/AST/Type.h Fri Jul 19 14:51:03 2013
> @@ -3360,9 +3360,10 @@ public:
> attr_objc_gc,
> attr_objc_ownership,
> attr_pcs,
> + attr_pcs_vfp,
>
> FirstEnumOperandKind = attr_objc_gc,
> - LastEnumOperandKind = attr_pcs,
> + LastEnumOperandKind = attr_pcs_vfp,
>
> // No operand.
> attr_noreturn,
> @@ -3406,16 +3407,9 @@ public:
> bool isSugared() const { return true; }
> QualType desugar() const { return getEquivalentType(); }
>
> - bool isMSTypeSpec() const {
> - switch (getAttrKind()) {
> - default: return false;
> - case attr_ptr32:
> - case attr_ptr64:
> - case attr_sptr:
> - case attr_uptr:
> - return true;
> - }
> - }
> + bool isMSTypeSpec() const;
> +
> + bool isCallingConv() const;
>
> void Profile(llvm::FoldingSetNodeID &ID) {
> Profile(ID, getAttrKind(), ModifiedType, EquivalentType);
>
> Modified: cfe/trunk/lib/AST/Type.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Type.cpp?rev=186714&r1=186713&r2=186714&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/Type.cpp (original)
> +++ cfe/trunk/lib/AST/Type.cpp Fri Jul 19 14:51:03 2013
> @@ -1842,6 +1842,47 @@ bool TagType::isBeingDefined() const {
> return getDecl()->isBeingDefined();
> }
>
> +bool AttributedType::isMSTypeSpec() const {
> + switch (getAttrKind()) {
> + default: return false;
> + case attr_ptr32:
> + case attr_ptr64:
> + case attr_sptr:
> + case attr_uptr:
> + return true;
> + }
> + llvm_unreachable("invalid attr kind");
> +}
> +
> +bool AttributedType::isCallingConv() const {
> + switch (getAttrKind()) {
> + case attr_ptr32:
> + case attr_ptr64:
> + case attr_sptr:
> + case attr_uptr:
> + case attr_address_space:
> + case attr_regparm:
> + case attr_vector_size:
> + case attr_neon_vector_type:
> + case attr_neon_polyvector_type:
> + case attr_objc_gc:
> + case attr_objc_ownership:
> + case attr_noreturn:
> + return false;
> + case attr_pcs:
> + case attr_pcs_vfp:
> + case attr_cdecl:
> + case attr_fastcall:
> + case attr_stdcall:
> + case attr_thiscall:
> + case attr_pascal:
> + case attr_pnaclcall:
> + case attr_inteloclbicc:
> + return true;
> + }
> + llvm_unreachable("invalid attr kind");
> +}
> +
> CXXRecordDecl *InjectedClassNameType::getDecl() const {
> return cast<CXXRecordDecl>(getInterestingTagDecl(Decl));
> }
>
> Modified: cfe/trunk/lib/AST/TypePrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/TypePrinter.cpp?rev=186714&r1=186713&r2=186714&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/TypePrinter.cpp (original)
> +++ cfe/trunk/lib/AST/TypePrinter.cpp Fri Jul 19 14:51:03 2013
> @@ -81,10 +81,11 @@ namespace {
> class TypePrinter {
> PrintingPolicy Policy;
> bool HasEmptyPlaceHolder;
> + bool InsideCCAttribute;
>
> public:
> explicit TypePrinter(const PrintingPolicy &Policy)
> - : Policy(Policy), HasEmptyPlaceHolder(false) { }
> + : Policy(Policy), HasEmptyPlaceHolder(false), InsideCCAttribute(false) { }
>
> void print(const Type *ty, Qualifiers qs, raw_ostream &OS,
> StringRef PlaceHolder);
> @@ -630,36 +631,40 @@ void TypePrinter::printFunctionProtoAfte
> OS << ')';
>
> FunctionType::ExtInfo Info = T->getExtInfo();
> - switch(Info.getCC()) {
> - case CC_Default: break;
> - case CC_C:
> - OS << " __attribute__((cdecl))";
> - break;
> - case CC_X86StdCall:
> - OS << " __attribute__((stdcall))";
> - break;
> - case CC_X86FastCall:
> - OS << " __attribute__((fastcall))";
> - break;
> - case CC_X86ThisCall:
> - OS << " __attribute__((thiscall))";
> - break;
> - case CC_X86Pascal:
> - OS << " __attribute__((pascal))";
> - break;
> - case CC_AAPCS:
> - OS << " __attribute__((pcs(\"aapcs\")))";
> - break;
> - case CC_AAPCS_VFP:
> - OS << " __attribute__((pcs(\"aapcs-vfp\")))";
> - break;
> - case CC_PnaclCall:
> - OS << " __attribute__((pnaclcall))";
> - break;
> - case CC_IntelOclBicc:
> - OS << " __attribute__((intel_ocl_bicc))";
> - break;
> +
> + if (!InsideCCAttribute) {
> + switch (Info.getCC()) {
> + case CC_Default: break;
> + case CC_C:
> + OS << " __attribute__((cdecl))";
> + break;
> + case CC_X86StdCall:
> + OS << " __attribute__((stdcall))";
> + break;
> + case CC_X86FastCall:
> + OS << " __attribute__((fastcall))";
> + break;
> + case CC_X86ThisCall:
> + OS << " __attribute__((thiscall))";
> + break;
> + case CC_X86Pascal:
> + OS << " __attribute__((pascal))";
> + break;
> + case CC_AAPCS:
> + OS << " __attribute__((pcs(\"aapcs\")))";
> + break;
> + case CC_AAPCS_VFP:
> + OS << " __attribute__((pcs(\"aapcs-vfp\")))";
> + break;
> + case CC_PnaclCall:
> + OS << " __attribute__((pnaclcall))";
> + break;
> + case CC_IntelOclBicc:
> + OS << " __attribute__((intel_ocl_bicc))";
> + break;
> + }
> }
> +
> if (Info.getNoReturn())
> OS << " __attribute__((noreturn))";
> if (Info.getRegParm())
> @@ -1089,7 +1094,7 @@ void TypePrinter::printAttributedBefore(
> case AttributedType::attr_ptr64: OS << " __ptr64"; break;
> case AttributedType::attr_sptr: OS << " __sptr"; break;
> case AttributedType::attr_uptr: OS << " __uptr"; break;
> -}
> + }
> spaceBeforePlaceHolder(OS);
> }
> }
> @@ -1105,6 +1110,12 @@ void TypePrinter::printAttributedAfter(c
> if (T->isMSTypeSpec())
> return;
>
> + // If this is a calling convention attribute, don't print the implicit CC from
> + // the modified type.
> + SaveAndRestore<bool> MaybeSuppressCC(InsideCCAttribute, T->isCallingConv());
> +
> + printAfter(T->getModifiedType(), OS);
> +
> OS << " __attribute__((";
> switch (T->getAttrKind()) {
> default: llvm_unreachable("This attribute should have been handled already");
>
> Modified: cfe/trunk/lib/Sema/SemaType.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaType.cpp?rev=186714&r1=186713&r2=186714&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaType.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaType.cpp Fri Jul 19 14:51:03 2013
> @@ -546,12 +546,7 @@ distributeFunctionTypeAttrToInnermost(Ty
> return true;
> }
>
> - if (handleFunctionTypeAttr(state, attr, declSpecType)) {
> - spliceAttrOutOfList(attr, attrList);
> - return true;
> - }
> -
> - return false;
> + return handleFunctionTypeAttr(state, attr, declSpecType);
> }
>
> /// A function type attribute was written in the decl spec. Try to
> @@ -3345,6 +3340,7 @@ static AttributeList::Kind getAttrListKi
> case AttributedType::attr_pascal:
> return AttributeList::AT_Pascal;
> case AttributedType::attr_pcs:
> + case AttributedType::attr_pcs_vfp:
> return AttributeList::AT_Pcs;
> case AttributedType::attr_pnaclcall:
> return AttributeList::AT_PnaclCall;
> @@ -4302,6 +4298,36 @@ static bool handleMSPointerTypeQualifier
> return false;
> }
>
> +static AttributedType::Kind getCCTypeAttrKind(AttributeList &Attr) {
> + assert(!Attr.isInvalid());
> + switch (Attr.getKind()) {
> + default:
> + llvm_unreachable("not a calling convention attribute");
> + case AttributeList::AT_CDecl:
> + return AttributedType::attr_cdecl;
> + case AttributeList::AT_FastCall:
> + return AttributedType::attr_fastcall;
> + case AttributeList::AT_StdCall:
> + return AttributedType::attr_stdcall;
> + case AttributeList::AT_ThisCall:
> + return AttributedType::attr_thiscall;
> + case AttributeList::AT_Pascal:
> + return AttributedType::attr_pascal;
> + case AttributeList::AT_Pcs: {
> + // We know attr is valid so it can only have one of two strings args.
> + StringLiteral *Str = cast<StringLiteral>(Attr.getArg(0));
> + return llvm::StringSwitch<AttributedType::Kind>(Str->getString())
> + .Case("aapcs", AttributedType::attr_pcs)
> + .Case("aapcs-vfp", AttributedType::attr_pcs_vfp);
> + }
> + case AttributeList::AT_PnaclCall:
> + return AttributedType::attr_pnaclcall;
> + case AttributeList::AT_IntelOclBicc:
> + return AttributedType::attr_inteloclbicc;
> + }
> + llvm_unreachable("unexpected attribute kind!");
> +}
> +
> /// Process an individual function attribute. Returns true to
> /// indicate that the attribute was handled, false if it wasn't.
> static bool handleFunctionTypeAttr(TypeProcessingState &state,
> @@ -4421,8 +4447,13 @@ static bool handleFunctionTypeAttr(TypeP
> }
> }
>
> + // Modify the CC from the wrapped function type, wrap it all back, and then
> + // wrap the whole thing in an AttributedType as written. The modified type
> + // might have a different CC if we ignored the attribute.
> FunctionType::ExtInfo EI = unwrapped.get()->getExtInfo().withCallingConv(CC);
> - type = unwrapped.wrap(S, S.Context.adjustFunctionType(unwrapped.get(), EI));
> + QualType Equivalent =
> + unwrapped.wrap(S, S.Context.adjustFunctionType(unwrapped.get(), EI));
> + type = S.Context.getAttributedType(getCCTypeAttrKind(attr), type, Equivalent);
> return true;
> }
>
>
> Modified: cfe/trunk/test/SemaTemplate/instantiate-function-params.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/instantiate-function-params.cpp?rev=186714&r1=186713&r2=186714&view=diff
> ==============================================================================
> --- cfe/trunk/test/SemaTemplate/instantiate-function-params.cpp (original)
> +++ cfe/trunk/test/SemaTemplate/instantiate-function-params.cpp Fri Jul 19 14:51:03 2013
> @@ -82,9 +82,15 @@ namespace InstantiateFunctionTypedef {
> struct X {
> typedef int functype(int, int);
> functype func;
> +
> + typedef int stdfunctype(int, int) __attribute__((stdcall));
> + __attribute__((stdcall)) functype stdfunc1;
> + stdfunctype stdfunc2;
> };
>
> void f(X<int> x) {
> (void)x.func(1, 2);
> + (void)x.stdfunc1(1, 2);
> + (void)x.stdfunc2(1, 2);
> }
> }
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
-David
More information about the cfe-commits
mailing list