This revision was automatically updated to reflect the committed changes. Closed by commit rG0dac639f285a: [Clang][Sema] Capturing section type conflicts on #pragma clang section (authored by pratlucas).
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D78572/new/ https://reviews.llvm.org/D78572 Files: clang/include/clang/AST/ASTContext.h clang/lib/Parse/ParsePragma.cpp clang/lib/Sema/SemaAttr.cpp clang/test/Sema/pragma-clang-section.c Index: clang/test/Sema/pragma-clang-section.c =================================================================== --- clang/test/Sema/pragma-clang-section.c +++ clang/test/Sema/pragma-clang-section.c @@ -1,5 +1,5 @@ // RUN: %clang_cc1 -fsyntax-only -verify %s -triple arm-none-eabi -#pragma clang section bss="mybss.1" data="mydata.1" rodata="myrodata.1" text="mytext.1" +#pragma clang section bss = "mybss.1" data = "mydata.1" rodata = "myrodata.1" text = "mytext.1" // expected-note 2 {{#pragma entered here}} #pragma clang section bss="" data="" rodata="" text="" #pragma clang section @@ -16,4 +16,10 @@ #pragma clang section text "text.2" // expected-error {{expected '=' following '#pragma clang section text'}} #pragma clang section relro "relro.2" // expected-error {{expected '=' following '#pragma clang section relro'}} #pragma clang section bss="" data="" rodata="" text="" more //expected-error {{expected one of [bss|data|rodata|text|relro] section kind in '#pragma clang section'}} + +#pragma clang section bss = "mybss.3" data = "mybss.3" // expected-error {{this causes a section type conflict with a prior #pragma section}} expected-note {{#pragma entered here}} expected-note {{#pragma entered here}} +#pragma clang section rodata = "mydata.1" // expected-error {{this causes a section type conflict with a prior #pragma section}} +#pragma clang section bss = "myrodata.1" // expected-error {{this causes a section type conflict with a prior #pragma section}} +#pragma clang section text = "mybss.3" // expected-error {{this causes a section type conflict with a prior #pragma section}} + int a; Index: clang/lib/Sema/SemaAttr.cpp =================================================================== --- clang/lib/Sema/SemaAttr.cpp +++ clang/lib/Sema/SemaAttr.cpp @@ -256,12 +256,15 @@ void Sema::ActOnPragmaClangSection(SourceLocation PragmaLoc, PragmaClangSectionAction Action, PragmaClangSectionKind SecKind, StringRef SecName) { PragmaClangSection *CSec; + int SectionFlags = ASTContext::PSF_Read; switch (SecKind) { case PragmaClangSectionKind::PCSK_BSS: CSec = &PragmaClangBSSSection; + SectionFlags |= ASTContext::PSF_Write | ASTContext::PSF_ZeroInit; break; case PragmaClangSectionKind::PCSK_Data: CSec = &PragmaClangDataSection; + SectionFlags |= ASTContext::PSF_Write; break; case PragmaClangSectionKind::PCSK_Rodata: CSec = &PragmaClangRodataSection; @@ -271,6 +274,7 @@ break; case PragmaClangSectionKind::PCSK_Text: CSec = &PragmaClangTextSection; + SectionFlags |= ASTContext::PSF_Execute; break; default: llvm_unreachable("invalid clang section kind"); @@ -281,6 +285,9 @@ return; } + if (UnifySection(SecName, SectionFlags, PragmaLoc)) + return; + CSec->Valid = true; CSec->SectionName = std::string(SecName); CSec->PragmaLocation = PragmaLoc; Index: clang/lib/Parse/ParsePragma.cpp =================================================================== --- clang/lib/Parse/ParsePragma.cpp +++ clang/lib/Parse/ParsePragma.cpp @@ -1873,6 +1873,7 @@ return; } + SourceLocation PragmaLocation = Tok.getLocation(); PP.Lex(Tok); // eat ['bss'|'data'|'rodata'|'text'] if (Tok.isNot(tok::equal)) { PP.Diag(Tok.getLocation(), diag::err_pragma_clang_section_expected_equal) << SecKind; @@ -1883,10 +1884,11 @@ if (!PP.LexStringLiteral(Tok, SecName, "pragma clang section", false)) return; - Actions.ActOnPragmaClangSection(Tok.getLocation(), - (SecName.size()? Sema::PragmaClangSectionAction::PCSA_Set : - Sema::PragmaClangSectionAction::PCSA_Clear), - SecKind, SecName); + Actions.ActOnPragmaClangSection( + PragmaLocation, + (SecName.size() ? Sema::PragmaClangSectionAction::PCSA_Set + : Sema::PragmaClangSectionAction::PCSA_Clear), + SecKind, SecName); } } Index: clang/include/clang/AST/ASTContext.h =================================================================== --- clang/include/clang/AST/ASTContext.h +++ clang/include/clang/AST/ASTContext.h @@ -2978,6 +2978,7 @@ PSF_Write = 0x2, PSF_Execute = 0x4, PSF_Implicit = 0x8, + PSF_ZeroInit = 0x10, PSF_Invalid = 0x80000000U, };
Index: clang/test/Sema/pragma-clang-section.c =================================================================== --- clang/test/Sema/pragma-clang-section.c +++ clang/test/Sema/pragma-clang-section.c @@ -1,5 +1,5 @@ // RUN: %clang_cc1 -fsyntax-only -verify %s -triple arm-none-eabi -#pragma clang section bss="mybss.1" data="mydata.1" rodata="myrodata.1" text="mytext.1" +#pragma clang section bss = "mybss.1" data = "mydata.1" rodata = "myrodata.1" text = "mytext.1" // expected-note 2 {{#pragma entered here}} #pragma clang section bss="" data="" rodata="" text="" #pragma clang section @@ -16,4 +16,10 @@ #pragma clang section text "text.2" // expected-error {{expected '=' following '#pragma clang section text'}} #pragma clang section relro "relro.2" // expected-error {{expected '=' following '#pragma clang section relro'}} #pragma clang section bss="" data="" rodata="" text="" more //expected-error {{expected one of [bss|data|rodata|text|relro] section kind in '#pragma clang section'}} + +#pragma clang section bss = "mybss.3" data = "mybss.3" // expected-error {{this causes a section type conflict with a prior #pragma section}} expected-note {{#pragma entered here}} expected-note {{#pragma entered here}} +#pragma clang section rodata = "mydata.1" // expected-error {{this causes a section type conflict with a prior #pragma section}} +#pragma clang section bss = "myrodata.1" // expected-error {{this causes a section type conflict with a prior #pragma section}} +#pragma clang section text = "mybss.3" // expected-error {{this causes a section type conflict with a prior #pragma section}} + int a; Index: clang/lib/Sema/SemaAttr.cpp =================================================================== --- clang/lib/Sema/SemaAttr.cpp +++ clang/lib/Sema/SemaAttr.cpp @@ -256,12 +256,15 @@ void Sema::ActOnPragmaClangSection(SourceLocation PragmaLoc, PragmaClangSectionAction Action, PragmaClangSectionKind SecKind, StringRef SecName) { PragmaClangSection *CSec; + int SectionFlags = ASTContext::PSF_Read; switch (SecKind) { case PragmaClangSectionKind::PCSK_BSS: CSec = &PragmaClangBSSSection; + SectionFlags |= ASTContext::PSF_Write | ASTContext::PSF_ZeroInit; break; case PragmaClangSectionKind::PCSK_Data: CSec = &PragmaClangDataSection; + SectionFlags |= ASTContext::PSF_Write; break; case PragmaClangSectionKind::PCSK_Rodata: CSec = &PragmaClangRodataSection; @@ -271,6 +274,7 @@ break; case PragmaClangSectionKind::PCSK_Text: CSec = &PragmaClangTextSection; + SectionFlags |= ASTContext::PSF_Execute; break; default: llvm_unreachable("invalid clang section kind"); @@ -281,6 +285,9 @@ return; } + if (UnifySection(SecName, SectionFlags, PragmaLoc)) + return; + CSec->Valid = true; CSec->SectionName = std::string(SecName); CSec->PragmaLocation = PragmaLoc; Index: clang/lib/Parse/ParsePragma.cpp =================================================================== --- clang/lib/Parse/ParsePragma.cpp +++ clang/lib/Parse/ParsePragma.cpp @@ -1873,6 +1873,7 @@ return; } + SourceLocation PragmaLocation = Tok.getLocation(); PP.Lex(Tok); // eat ['bss'|'data'|'rodata'|'text'] if (Tok.isNot(tok::equal)) { PP.Diag(Tok.getLocation(), diag::err_pragma_clang_section_expected_equal) << SecKind; @@ -1883,10 +1884,11 @@ if (!PP.LexStringLiteral(Tok, SecName, "pragma clang section", false)) return; - Actions.ActOnPragmaClangSection(Tok.getLocation(), - (SecName.size()? Sema::PragmaClangSectionAction::PCSA_Set : - Sema::PragmaClangSectionAction::PCSA_Clear), - SecKind, SecName); + Actions.ActOnPragmaClangSection( + PragmaLocation, + (SecName.size() ? Sema::PragmaClangSectionAction::PCSA_Set + : Sema::PragmaClangSectionAction::PCSA_Clear), + SecKind, SecName); } } Index: clang/include/clang/AST/ASTContext.h =================================================================== --- clang/include/clang/AST/ASTContext.h +++ clang/include/clang/AST/ASTContext.h @@ -2978,6 +2978,7 @@ PSF_Write = 0x2, PSF_Execute = 0x4, PSF_Implicit = 0x8, + PSF_ZeroInit = 0x10, PSF_Invalid = 0x80000000U, };
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits