Skip to content

Commit 5c6a146

Browse files
committed
[C++20][Modules][Driver][HU 1/N] Initial handling for -xc++-{system,user}-header.
This adds file types and handling for three input types, representing a C++20 header unit source: 1. When provided with a complete pathname for the header. 2. For a header to be looked up (by the frontend) in the user search paths 3. For a header to be looked up in the system search paths. We also add a pre-processed file type (although that is a single type, regardless of the original input type). These types may be specified with -xc++-{user,system,header-unit}-header xxxx. These types allow us to disambiguate header unit jobs from PCH ones, and thus we handle these differently from other header jobs in two ways: 1. The job construction is altered to build a C++20 header unit (rather than a PCH file, as would be the case for other headers). 2. When the type is "user" or "system" we defer checking for the file until the front end is run, since we need to look up the header in the relevant paths which are not known at this point. Differential Revision: https://reviews.llvm.org/D121588
1 parent 19a6dd3 commit 5c6a146

File tree

7 files changed

+49
-2
lines changed

7 files changed

+49
-2
lines changed

clang/include/clang/Driver/Types.def

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,11 @@ TYPE("objective-c-header-cpp-output", PP_ObjCHeader, INVALID, "mi", phases
6464
TYPE("objective-c-header", ObjCHeader, PP_ObjCHeader, "h", phases::Preprocess, phases::Precompile)
6565
TYPE("c++-header-cpp-output", PP_CXXHeader, INVALID, "ii", phases::Precompile)
6666
TYPE("c++-header", CXXHeader, PP_CXXHeader, "hh", phases::Preprocess, phases::Precompile)
67-
TYPE("objective-c++-header-cpp-output", PP_ObjCXXHeader, INVALID, "mii", phases::Precompile)
67+
TYPE("c++-header-unit-cpp-output", PP_CXXHeaderUnit,INVALID, "iih", phases::Precompile)
68+
TYPE("c++-header-unit-header", CXXHUHeader, PP_CXXHeaderUnit,"hh", phases::Preprocess, phases::Precompile)
69+
TYPE("c++-system-header", CXXSHeader, PP_CXXHeaderUnit,"hh", phases::Preprocess, phases::Precompile)
70+
TYPE("c++-user-header", CXXUHeader, PP_CXXHeaderUnit,"hh", phases::Preprocess, phases::Precompile)
71+
TYPE("objective-c++-header-cpp-output", PP_ObjCXXHeader, INVALID,"mii", phases::Precompile)
6872
TYPE("objective-c++-header", ObjCXXHeader, PP_ObjCXXHeader, "h", phases::Preprocess, phases::Precompile)
6973
TYPE("c++-module", CXXModule, PP_CXXModule, "cppm", phases::Preprocess, phases::Precompile, phases::Compile, phases::Backend, phases::Assemble, phases::Link)
7074
TYPE("c++-module-cpp-output", PP_CXXModule, INVALID, "iim", phases::Precompile, phases::Compile, phases::Backend, phases::Assemble, phases::Link)
@@ -89,6 +93,7 @@ TYPE("ast", AST, INVALID, "ast", phases
8993
TYPE("ifs", IFS, INVALID, "ifs", phases::IfsMerge)
9094
TYPE("ifs-cpp", IFS_CPP, INVALID, "ifs", phases::Compile, phases::IfsMerge)
9195
TYPE("pcm", ModuleFile, INVALID, "pcm", phases::Compile, phases::Backend, phases::Assemble, phases::Link)
96+
TYPE("header-unit", HeaderUnit, INVALID, "pcm", phases::Compile, phases::Backend, phases::Assemble, phases::Link)
9297
TYPE("plist", Plist, INVALID, "plist", phases::Compile, phases::Backend, phases::Assemble, phases::Link)
9398
TYPE("rewritten-objc", RewrittenObjC,INVALID, "cpp", phases::Compile, phases::Backend, phases::Assemble, phases::Link)
9499
TYPE("rewritten-legacy-objc", RewrittenLegacyObjC,INVALID, "cpp", phases::Compile, phases::Backend, phases::Assemble, phases::Link)

clang/lib/Driver/Driver.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2219,6 +2219,11 @@ bool Driver::DiagnoseInputExistence(const DerivedArgList &Args, StringRef Value,
22192219
if (Value == "-")
22202220
return true;
22212221

2222+
// If it's a header to be found in the system or user search path, then defer
2223+
// complaints about its absence until those searches can be done.
2224+
if (Ty == types::TY_CXXSHeader || Ty == types::TY_CXXUHeader)
2225+
return true;
2226+
22222227
if (getVFS().exists(Value))
22232228
return true;
22242229

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4609,6 +4609,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
46094609
CmdArgs.push_back(IsHeaderModulePrecompile
46104610
? "-emit-header-module"
46114611
: "-emit-module-interface");
4612+
else if (JA.getType() == types::TY_HeaderUnit)
4613+
CmdArgs.push_back("-emit-header-unit");
46124614
else
46134615
CmdArgs.push_back("-emit-pch");
46144616
} else if (isa<VerifyPCHJobAction>(JA)) {

clang/lib/Driver/Types.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,16 @@ static bool isPreprocessedModuleType(ID Id) {
6565
return Id == TY_CXXModule || Id == TY_PP_CXXModule;
6666
}
6767

68+
static bool isPreprocessedHeaderUnitType(ID Id) {
69+
return Id == TY_CXXSHeader || Id == TY_CXXUHeader || Id == TY_CXXHUHeader ||
70+
Id == TY_PP_CXXHeaderUnit;
71+
}
72+
6873
types::ID types::getPrecompiledType(ID Id) {
6974
if (isPreprocessedModuleType(Id))
7075
return TY_ModuleFile;
76+
if (isPreprocessedHeaderUnitType(Id))
77+
return TY_HeaderUnit;
7178
if (onlyPrecompileType(Id))
7279
return TY_PCH;
7380
return TY_INVALID;
@@ -139,6 +146,10 @@ bool types::isAcceptedByClang(ID Id) {
139146
case TY_CLHeader:
140147
case TY_ObjCHeader: case TY_PP_ObjCHeader:
141148
case TY_CXXHeader: case TY_PP_CXXHeader:
149+
case TY_CXXSHeader:
150+
case TY_CXXUHeader:
151+
case TY_CXXHUHeader:
152+
case TY_PP_CXXHeaderUnit:
142153
case TY_ObjCXXHeader: case TY_PP_ObjCXXHeader:
143154
case TY_CXXModule: case TY_PP_CXXModule:
144155
case TY_AST: case TY_ModuleFile: case TY_PCH:
@@ -210,6 +221,10 @@ bool types::isCXX(ID Id) {
210221
case TY_CXX: case TY_PP_CXX:
211222
case TY_ObjCXX: case TY_PP_ObjCXX: case TY_PP_ObjCXX_Alias:
212223
case TY_CXXHeader: case TY_PP_CXXHeader:
224+
case TY_CXXSHeader:
225+
case TY_CXXUHeader:
226+
case TY_CXXHUHeader:
227+
case TY_PP_CXXHeaderUnit:
213228
case TY_ObjCXXHeader: case TY_PP_ObjCXXHeader:
214229
case TY_CXXModule: case TY_PP_CXXModule:
215230
case TY_CUDA: case TY_PP_CUDA: case TY_CUDA_DEVICE:
@@ -323,6 +338,7 @@ types::ID types::lookupTypeForExtension(llvm::StringRef Ext) {
323338
.Case("hpp", TY_CXXHeader)
324339
.Case("hxx", TY_CXXHeader)
325340
.Case("iim", TY_PP_CXXModule)
341+
.Case("iih", TY_PP_CXXHeaderUnit)
326342
.Case("lib", TY_Object)
327343
.Case("mii", TY_PP_ObjCXX)
328344
.Case("obj", TY_Object)

clang/lib/Frontend/FrontendOptions.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ InputKind FrontendOptions::getInputKindForExtension(StringRef Extension) {
2727
.Cases("C", "cc", "cp", Language::CXX)
2828
.Cases("cpp", "CPP", "c++", "cxx", "hpp", "hxx", Language::CXX)
2929
.Case("cppm", Language::CXX)
30-
.Case("iim", InputKind(Language::CXX).getPreprocessed())
30+
.Cases("iim", "iih", InputKind(Language::CXX).getPreprocessed())
3131
.Case("cl", Language::OpenCL)
3232
.Case("clcpp", Language::OpenCLCXX)
3333
.Cases("cu", "cuh", Language::CUDA)

clang/test/Driver/Inputs/header-unit-01.hh

Whitespace-only changes.
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// RUN: %clang -### -std=c++20 -xc++-user-header foo.h 2>&1 | \
2+
// RUN: FileCheck -check-prefix=CHECK-USER %s
3+
4+
// RUN: %clang -### -std=c++20 -xc++-system-header vector 2>&1 | \
5+
// RUN: FileCheck -check-prefix=CHECK-SYSTEM %s
6+
7+
// RUN: %clang -### -std=c++20 \
8+
// RUN: -xc++-header-unit-header %/S/Inputs/header-unit-01.hh 2>&1 | \
9+
// RUN: FileCheck -check-prefix=CHECK-ABS %s -DTDIR=%/S/Inputs
10+
11+
// CHECK-USER: "-emit-header-unit"
12+
// CHECK-USER-SAME: "-o" "foo.pcm"
13+
// CHECK-USER-SAME: "-x" "c++-user-header" "foo.h"
14+
// CHECK-SYSTEM: "-emit-header-unit"
15+
// CHECK-SYSTEM-SAME: "-o" "vector.pcm"
16+
// CHECK-SYSTEM-SAME: "-x" "c++-system-header" "vector"
17+
// CHECK-ABS: "-emit-header-unit"
18+
// CHECK-ABS-SAME: "-o" "header-unit-01.pcm"
19+
// CHECK-ABS-SAME: "-x" "c++-header-unit-header" "[[TDIR]]/header-unit-01.hh"

0 commit comments

Comments
 (0)