[clang] [SystemZ][z/OS] Implement #pragma export (PR #141671)
Mikael Holmen via cfe-commits
cfe-commits at lists.llvm.org
Mon Jan 26 05:17:26 PST 2026
================
@@ -4133,6 +4217,44 @@ void PragmaMaxTokensTotalHandler::HandlePragma(Preprocessor &PP,
PP.overrideMaxTokens(MaxTokens, Loc);
}
+static void zOSPragmaHandlerHelper(Preprocessor &PP, Token &Tok,
+ tok::TokenKind TokKind) {
+ Token AnnotTok;
+ AnnotTok.startToken();
+ AnnotTok.setKind(TokKind);
+ AnnotTok.setLocation(Tok.getLocation());
+ AnnotTok.setAnnotationEndLoc(Tok.getLocation());
+ SmallVector<Token, 8> TokenVector;
+ // Suck up all of the tokens before the eod.
+ for (; Tok.isNot(tok::eod); PP.Lex(Tok)) {
+ TokenVector.push_back(Tok);
+ AnnotTok.setAnnotationEndLoc(Tok.getLocation());
+ }
+ // Add a sentinel EoF token to the end of the list.
+ Token EoF;
+ EoF.startToken();
+ EoF.setKind(tok::eof);
+ EoF.setLocation(Tok.getLocation());
+ TokenVector.push_back(EoF);
+ // We must allocate this array with new because EnterTokenStream is going to
+ // delete it later.
+ markAsReinjectedForRelexing(TokenVector);
+ auto TokenArray = std::make_unique<Token[]>(TokenVector.size());
----------------
mikaelholmen wrote:
Hello @perry-ca
If I build clang with ASAN and run e.g. the new pragma-export-failing.cpp testcase, I get a
```
==539280==ERROR: LeakSanitizer: detected memory leaks
```
complaint pointing back to this line:
```
Direct leak of 120 byte(s) in 1 object(s) allocated from:
#0 0x55f29681aded in operator new[](unsigned long)
#1 0x55f2a351b7cb in make_unique<clang::Token[], 0>
#2 0x55f2a351b7cb in zOSPragmaHandlerHelper /repo/llvm-project/llvm/build-all-asan/../../clang/lib/Parse/ParsePragma.cpp:4242:21
#3 0x55f2a351b7cb in (anonymous namespace)::PragmaExportHandler::HandlePragma(clang::Preprocessor&, clang::PragmaIntroducer, clang::Token&) /repo/llvm-project/llvm/build-all-asan/../../clang/lib/Parse/ParsePragma.cpp:4255:3
#4 0x55f2a6be10a8 in clang::PragmaNamespace::HandlePragma(clang::Preprocessor&, clang::PragmaIntroducer, clang::Token&) /repo/llvm-project/llvm/build-all-asan/../../clang/lib/Lex/Pragma.cpp:120:12
#5 0x55f2a6be155c in clang::Preprocessor::HandlePragmaDirective(clang::PragmaIntroducer) /repo/llvm-project/llvm/build-all-asan/../../clang/lib/Lex/Pragma.cpp:174:19
#6 0x55f2a6b7fdd8 in clang::Preprocessor::HandleDirective(clang::Token&) /repo/llvm-project/llvm/build-all-asan/../../clang/lib/Lex/PPDirectives.cpp:1458:14
#7 0x55f2a6aefbe2 in clang::Lexer::LexTokenInternal(clang::Token&, bool) /repo/llvm-project/llvm/build-all-asan/../../clang/lib/Lex/Lexer.cpp:4539:7
#8 0x55f2a6ae7870 in clang::Lexer::Lex(clang::Token&) /repo/llvm-project/llvm/build-all-asan/../../clang/lib/Lex/Lexer.cpp:3739:24
#9 0x55f2a6c12edb in clang::Preprocessor::Lex(clang::Token&) /repo/llvm-project/llvm/build-all-asan/../../clang/lib/Lex/Preprocessor.cpp:905:11
#10 0x55f2a6b68caa in clang::Preprocessor::CachingLex(clang::Token&) /repo/llvm-project/llvm/build-all-asan/../../clang/lib/Lex/PPCaching.cpp:91:3
#11 0x55f2a6b693d8 in clang::Preprocessor::CLK_CachingLexer(clang::Preprocessor&, clang::Token&) /repo/llvm-project/llvm/build-all-asan/../../clang/include/clang/Lex/Preprocessor.h:3199:7
#12 0x55f2a6c12edb in clang::Preprocessor::Lex(clang::Token&) /repo/llvm-project/llvm/build-all-asan/../../clang/lib/Lex/Preprocessor.cpp:905:11
#13 0x55f2a34b69c7 in clang::Parser::ConsumeBrace() /repo/llvm-project/llvm/build-all-asan/../../clang/include/clang/Parse/Parser.h:670:8
#14 0x55f2a359d4c0 in consumeOpen /repo/llvm-project/llvm/build-all-asan/../../clang/include/clang/Parse/RAIIObjectsForParser.h:471:17
#15 0x55f2a359d4c0 in clang::Parser::ParseCXXMemberSpecification(clang::SourceLocation, clang::SourceLocation, clang::ParsedAttributes&, unsigned int, clang::Decl*) /repo/llvm-project/llvm/build-all-asan/../../clang/lib/Parse/ParseDeclCXX.cpp:3648:5
#16 0x55f2a3596958 in clang::Parser::ParseClassSpecifier(clang::tok::TokenKind, clang::SourceLocation, clang::DeclSpec&, clang::Parser::ParsedTemplateInfo&, clang::AccessSpecifier, bool, clang::Parser::DeclSpecContext, clang::ParsedAttributes&) /repo/llvm-project/llvm/build-all-asan/../../clang/lib/Parse/ParseDeclCXX.cpp:2170:7
#17 0x55f2a35f22d8 in clang::Parser::ParseDeclarationSpecifiers(clang::DeclSpec&, clang::Parser::ParsedTemplateInfo&, clang::AccessSpecifier, clang::Parser::DeclSpecContext, clang::Parser::LateParsedAttrList*, clang::ImplicitTypenameContext) /repo/llvm-project/llvm/build-all-asan/../../clang/lib/Parse/ParseDecl.cpp:4465:7
#18 0x55f2a36732fb in ParseDeclarationSpecifiers /repo/llvm-project/llvm/build-all-asan/../../clang/include/clang/Parse/Parser.h:1843:12
#19 0x55f2a36732fb in clang::Parser::ParseDeclarationAfterTemplate(clang::DeclaratorContext, clang::Parser::ParsedTemplateInfo&, clang::ParsingDeclRAIIObject&, clang::SourceLocation&, clang::ParsedAttributes&, clang::AccessSpecifier) /repo/llvm-project/llvm/build-all-asan/../../clang/lib/Parse/ParseTemplate.cpp:201:3
#20 0x55f2a3670f13 in clang::Parser::ParseTemplateDeclarationOrSpecialization(clang::DeclaratorContext, clang::SourceLocation&, clang::ParsedAttributes&, clang::AccessSpecifier) /repo/llvm-project/llvm/build-all-asan/../../clang/lib/Parse/ParseTemplate.cpp:147:10
#21 0x55f2a366fa31 in clang::Parser::ParseDeclarationStartingWithTemplate(clang::DeclaratorContext, clang::SourceLocation&, clang::ParsedAttributes&) /repo/llvm-project/llvm/build-all-asan/../../clang/lib/Parse/ParseTemplate.cpp:43:10
#22 0x55f2a35e3282 in clang::Parser::ParseDeclaration(clang::DeclaratorContext, clang::SourceLocation&, clang::ParsedAttributes&, clang::ParsedAttributes&, clang::SourceLocation*) /repo/llvm-project/llvm/build-all-asan/../../clang/lib/Parse/ParseDecl.cpp:1889:12
#23 0x55f2a34c743a in clang::Parser::ParseExternalDeclaration(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec*) /repo/llvm-project/llvm/build-all-asan/../../clang/lib/Parse/Parser.cpp:912:14
#24 0x55f2a34c3871 in clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&, clang::Sema::ModuleImportState&) /repo/llvm-project/llvm/build-all-asan/../../clang/lib/Parse/Parser.cpp:706:12
#25 0x55f2a349eecd in clang::ParseAST(clang::Sema&, bool, bool) /repo/llvm-project/llvm/build-all-asan/../../clang/lib/Parse/ParseAST.cpp:170:20
#26 0x55f29fe2b633 in clang::FrontendAction::Execute() /repo/llvm-project/llvm/build-all-asan/../../clang/lib/Frontend/FrontendAction.cpp:1313:3
#27 0x55f29fcf9e38 in clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) /repo/llvm-project/llvm/build-all-asan/../../clang/lib/Frontend/CompilerInstance.cpp:1007:33
#28 0x55f2a00b90d7 in clang::ExecuteCompilerInvocation(clang::CompilerInstance*) /repo/llvm-project/llvm/build-all-asan/../../clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:310:25
#29 0x55f296827ef5 in cc1_main(llvm::ArrayRef<char const*>, char const*, void*) /repo/llvm-project/llvm/build-all-asan/../../clang/tools/driver/cc1_main.cpp:304:15
#30 0x55f29682027b in ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&, llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>) /repo/llvm-project/llvm/build-all-asan/../../clang/tools/driver/driver.cpp:226:12
#31 0x55f29681e5e2 in clang_main(int, char**, llvm::ToolContext const&) /repo/llvm-project/llvm/build-all-asan/../../clang/tools/driver/driver.cpp:274:12
#32 0x55f2968404ea in main /repo/llvm-project/llvm/build-all-asan/tools/clang/tools/driver/clang-driver.cpp:17:10
#33 0x7f48946607e4 in __libc_start_main (/lib64/libc.so.6+0x3a7e4) (BuildId: 8fcf28d58291e94e5ad7d614fd6d41ec26ab43bb)
SUMMARY: AddressSanitizer: 120 byte(s) leaked in 1 allocation(s).
```
Does that make sense?
https://github.com/llvm/llvm-project/pull/141671
More information about the cfe-commits
mailing list