Skip to content

Commit 3895466

Browse files
committed
accept 'clang++ -c a.pch -o a.o' to create PCH's object file
This way should be the same like with a.pcm for modules. An alternative way is 'clang++ -c empty.cpp -include-pch a.pch -o a.o -Xclang -building-pch-with-obj', which is what clang-cl's /Yc does internally. Differential Revision: https://reviews.llvm.org/D83716
1 parent 706a435 commit 3895466

File tree

4 files changed

+47
-8
lines changed

4 files changed

+47
-8
lines changed

clang/lib/Driver/Types.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ bool types::isAcceptedByClang(ID Id) {
141141
case TY_CXXHeader: case TY_PP_CXXHeader:
142142
case TY_ObjCXXHeader: case TY_PP_ObjCXXHeader:
143143
case TY_CXXModule: case TY_PP_CXXModule:
144-
case TY_AST: case TY_ModuleFile:
144+
case TY_AST: case TY_ModuleFile: case TY_PCH:
145145
case TY_LLVM_IR: case TY_LLVM_BC:
146146
return true;
147147
}

clang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2022,8 +2022,9 @@ static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,
20222022
// FIXME: Supporting '<lang>-header-cpp-output' would be useful.
20232023
bool Preprocessed = XValue.consume_back("-cpp-output");
20242024
bool ModuleMap = XValue.consume_back("-module-map");
2025-
IsHeaderFile =
2026-
!Preprocessed && !ModuleMap && XValue.consume_back("-header");
2025+
IsHeaderFile = !Preprocessed && !ModuleMap &&
2026+
XValue != "precompiled-header" &&
2027+
XValue.consume_back("-header");
20272028

20282029
// Principal languages.
20292030
DashX = llvm::StringSwitch<InputKind>(XValue)
@@ -2050,7 +2051,7 @@ static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,
20502051
DashX = llvm::StringSwitch<InputKind>(XValue)
20512052
.Case("cpp-output", InputKind(Language::C).getPreprocessed())
20522053
.Case("assembler-with-cpp", Language::Asm)
2053-
.Cases("ast", "pcm",
2054+
.Cases("ast", "pcm", "precompiled-header",
20542055
InputKind(Language::Unknown, InputKind::Precompiled))
20552056
.Case("ir", Language::LLVM_IR)
20562057
.Default(Language::Unknown);

clang/test/Driver/pch-codegen.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// RUN: rm -rf %t
2+
// RUN: mkdir -p %t
3+
4+
// Create PCH without codegen.
5+
// RUN: %clang -x c++-header %S/../Modules/Inputs/codegen-flags/foo.h -o %t/foo-cg.pch -### 2>&1 | FileCheck %s -check-prefix=CHECK-PCH-CREATE
6+
// CHECK-PCH-CREATE: -emit-pch
7+
// CHECK-PCH-CREATE-NOT: -fmodules-codegen
8+
// CHECK-PCH-CREATE-NOT: -fmodules-debuginfo
9+
10+
// Create PCH with -fmodules-codegen.
11+
// RUN: %clang -x c++-header -Xclang -fmodules-codegen %S/../Modules/Inputs/codegen-flags/foo.h -o %t/foo-cg.pch -### 2>&1 | FileCheck %s -check-prefix=CHECK-PCH-CODEGEN-CREATE
12+
// CHECK-PCH-CODEGEN-CREATE: -emit-pch
13+
// CHECK-PCH-CODEGEN-CREATE: -fmodules-codegen
14+
// CHECK-PCH-CODEGEN-CREATE: "-x" "c++-header"
15+
// CHECK-PCH-CODEGEN-CREATE-NOT: -fmodules-debuginfo
16+
17+
// Create PCH with -fmodules-debuginfo.
18+
// RUN: %clang -x c++-header -Xclang -fmodules-debuginfo %S/../Modules/Inputs/codegen-flags/foo.h -g -o %t/foo-di.pch -### 2>&1 | FileCheck %s -check-prefix=CHECK-PCH-DEBUGINFO-CREATE
19+
// CHECK-PCH-DEBUGINFO-CREATE: -emit-pch
20+
// CHECK-PCH-DEBUGINFO-CREATE: -fmodules-debuginfo
21+
// CHECK-PCH-DEBUGINFO-CREATE: "-x" "c++-header"
22+
// CHECK-PCH-DEBUGINFO-CREATE-NOT: -fmodules-codegen
23+
24+
// Create PCH's object file for -fmodules-codegen.
25+
// RUN: touch %t/foo-cg.pch
26+
// RUN: %clang -c %t/foo-cg.pch -o %t/foo-cg.o -### 2>&1 | FileCheck %s -check-prefix=CHECK-PCH-CODEGEN-OBJ
27+
// CHECK-PCH-CODEGEN-OBJ: -emit-obj
28+
// CHECK-PCH-CODEGEN-OBJ: "-main-file-name" "foo-cg.pch"
29+
// CHECK-PCH-CODEGEN-OBJ: "-o" "{{.*}}foo-cg.o"
30+
// CHECK-PCH-CODEGEN-OBJ: "-x" "precompiled-header"
31+
32+
// Create PCH's object file for -fmodules-debuginfo.
33+
// RUN: touch %t/foo-di.pch
34+
// RUN: %clang -c %t/foo-di.pch -g -o %t/foo-di.o -### 2>&1 | FileCheck %s -check-prefix=CHECK-PCH-DEBUGINFO-OBJ
35+
// CHECK-PCH-DEBUGINFO-OBJ: -emit-obj
36+
// CHECK-PCH-DEBUGINFO-OBJ: "-main-file-name" "foo-di.pch"
37+
// CHECK-PCH-DEBUGINFO-OBJ: "-o" "{{.*}}foo-di.o"
38+
// CHECK-PCH-DEBUGINFO-OBJ: "-x" "precompiled-header"

clang/test/PCH/codegen.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
// RUN: %clang_cc1 -triple=x86_64-linux-gnu -fmodules-codegen -x c++-header -building-pch-with-obj -emit-pch %S/../Modules/Inputs/codegen-flags/foo.h -o %t/foo-cg.pch
1010
// RUN: %clang_cc1 -triple=x86_64-linux-gnu -fmodules-debuginfo -x c++-header -building-pch-with-obj -emit-pch %S/../Modules/Inputs/codegen-flags/foo.h -o %t/foo-di.pch
1111

12-
// RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -debug-info-kind=limited -o - %s -include-pch %t/foo-cg.pch -building-pch-with-obj -fmodules-codegen | FileCheck --check-prefix=CG %s
13-
// RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -debug-info-kind=limited -o - %s -include-pch %t/foo-di.pch -building-pch-with-obj -fmodules-debuginfo | FileCheck --check-prefix=DI %s
12+
// RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -debug-info-kind=limited -o - -x precompiled-header %t/foo-cg.pch | FileCheck --check-prefix=CG %s
13+
// RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -debug-info-kind=limited -o - -x precompiled-header %t/foo-di.pch | FileCheck --check-prefix=DI %s
1414

1515
// RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -debug-info-kind=limited -o - -include-pch %t/foo-cg.pch %S/../Modules/Inputs/codegen-flags/use.cpp | FileCheck --check-prefix=CG-USE %s
1616
// RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -debug-info-kind=limited -o - -include-pch %t/foo-di.pch %S/../Modules/Inputs/codegen-flags/use.cpp | FileCheck --check-prefix=DI-USE %s
@@ -20,8 +20,8 @@
2020
// RUN: %clang_cc1 -triple=x86_64-linux-gnu -fmodules-codegen -x c++-header -building-pch-with-obj -emit-pch -fpch-instantiate-templates %S/../Modules/Inputs/codegen-flags/foo.h -o %t/foo-cg.pch
2121
// RUN: %clang_cc1 -triple=x86_64-linux-gnu -fmodules-debuginfo -x c++-header -building-pch-with-obj -emit-pch -fpch-instantiate-templates %S/../Modules/Inputs/codegen-flags/foo.h -o %t/foo-di.pch
2222

23-
// RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -debug-info-kind=limited -o - %s -include-pch %t/foo-cg.pch -building-pch-with-obj -fmodules-codegen | FileCheck --check-prefix=CG %s
24-
// RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -debug-info-kind=limited -o - %s -include-pch %t/foo-di.pch -building-pch-with-obj -fmodules-debuginfo | FileCheck --check-prefix=DI %s
23+
// RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -debug-info-kind=limited -o - -x precompiled-header %t/foo-cg.pch | FileCheck --check-prefix=CG %s
24+
// RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -debug-info-kind=limited -o - -x precompiled-header %t/foo-di.pch | FileCheck --check-prefix=DI %s
2525

2626
// RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -debug-info-kind=limited -o - -include-pch %t/foo-cg.pch %S/../Modules/Inputs/codegen-flags/use.cpp | FileCheck --check-prefix=CG-USE %s
2727
// RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -debug-info-kind=limited -o - -include-pch %t/foo-di.pch %S/../Modules/Inputs/codegen-flags/use.cpp | FileCheck --check-prefix=DI-USE %s

0 commit comments

Comments
 (0)