Skip to content

Commit 142e1b1

Browse files
Add -fcas-emit-casid-file to emit a .casid file
With -fcas-emit-casid-file, a .casid file will be emitted next to the object file only when -fcas-backend-mode=native, or -fcas-backend-mode=verify is used and the output is directed to a file, rather than stdout.
1 parent d580cf1 commit 142e1b1

File tree

5 files changed

+52
-19
lines changed

5 files changed

+52
-19
lines changed

clang/include/clang/Basic/CodeGenOptions.def

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,9 @@ ENUM_CODEGENOPT(ZeroCallUsedRegs, llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind,
516516
/// Whether to use CASID backend.
517517
CODEGENOPT(UseCASBackend, 1, 0)
518518

519+
/// Whether to emit a .casid File.
520+
CODEGENOPT(EmitCASIDFile, 1, 0)
521+
519522
/// The CASObjectFormat used when CAS output is used.
520523
ENUM_CODEGENOPT(CASObjMode, llvm::CASBackendMode,
521524
2, llvm::CASBackendMode::Native)

clang/include/clang/CodeGen/BackendUtil.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ namespace clang {
4848
const CASOptions &CASOpts, // MCCAS
4949
StringRef TDesc, llvm::Module *M, BackendAction Action,
5050
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS,
51-
std::unique_ptr<raw_pwrite_stream> OS);
51+
std::unique_ptr<raw_pwrite_stream> OS,
52+
std::unique_ptr<raw_pwrite_stream> CasidOS = nullptr);
5253

5354
void EmbedBitcode(llvm::Module *M, const CodeGenOptions &CGOpts,
5455
llvm::MemoryBufferRef Buf);

clang/include/clang/Driver/Options.td

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7855,6 +7855,11 @@ defm cas_backend : BoolFOption<"cas-backend",
78557855
PosFlag<SetTrue, [], [ClangOption], "Enable using CASBackend for object file output">,
78567856
NegFlag<SetFalse>>;
78577857

7858+
defm cas_emit_casid_file : BoolFOption<"cas-emit-casid-file",
7859+
CodeGenOpts<"EmitCASIDFile">, DefaultFalse,
7860+
PosFlag<SetTrue, [], [], "Emit .casid file next to object file when using cas backend">,
7861+
NegFlag<SetFalse>>;
7862+
78587863
def fcas_backend_mode : Joined<["-"], "fcas-backend-mode=">,
78597864
Group<f_Group>, MetaVarName<"<native|casid|verify>">,
78607865
HelpText<"CASBackendMode for output kind">,

clang/lib/CodeGen/BackendUtil.cpp

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,8 @@ class EmitAssemblyHelper {
144144
///
145145
/// \return True on success.
146146
bool AddEmitPasses(legacy::PassManager &CodeGenPasses, BackendAction Action,
147-
raw_pwrite_stream &OS, raw_pwrite_stream *DwoOS);
147+
raw_pwrite_stream &OS, raw_pwrite_stream *DwoOS,
148+
raw_pwrite_stream *CasIDOS = nullptr);
148149

149150
std::unique_ptr<llvm::ToolOutputFile> openOutputFile(StringRef Path) {
150151
std::error_code EC;
@@ -163,7 +164,8 @@ class EmitAssemblyHelper {
163164
std::unique_ptr<llvm::ToolOutputFile> &ThinLinkOS);
164165
void RunCodegenPipeline(BackendAction Action,
165166
std::unique_ptr<raw_pwrite_stream> &OS,
166-
std::unique_ptr<llvm::ToolOutputFile> &DwoOS);
167+
std::unique_ptr<llvm::ToolOutputFile> &DwoOS,
168+
std::unique_ptr<raw_pwrite_stream> &CasIDOS);
167169

168170
/// Check whether we should emit a module summary for regular LTO.
169171
/// The module summary should be emitted by default for regular LTO
@@ -198,8 +200,8 @@ class EmitAssemblyHelper {
198200
std::unique_ptr<TargetMachine> TM;
199201

200202
// Emit output using the new pass manager for the optimization pipeline.
201-
void EmitAssembly(BackendAction Action,
202-
std::unique_ptr<raw_pwrite_stream> OS);
203+
void EmitAssembly(BackendAction Action, std::unique_ptr<raw_pwrite_stream> OS,
204+
std::unique_ptr<raw_pwrite_stream> CasIDOS = nullptr);
203205
};
204206
}
205207

@@ -590,7 +592,8 @@ void EmitAssemblyHelper::CreateTargetMachine(bool MustCreateTM) {
590592
bool EmitAssemblyHelper::AddEmitPasses(legacy::PassManager &CodeGenPasses,
591593
BackendAction Action,
592594
raw_pwrite_stream &OS,
593-
raw_pwrite_stream *DwoOS) {
595+
raw_pwrite_stream *DwoOS,
596+
raw_pwrite_stream *CasIDOS) {
594597
// Add LibraryInfo.
595598
std::unique_ptr<TargetLibraryInfoImpl> TLII(
596599
createTLII(TargetTriple, CodeGenOpts));
@@ -607,7 +610,8 @@ bool EmitAssemblyHelper::AddEmitPasses(legacy::PassManager &CodeGenPasses,
607610
CodeGenPasses.add(createObjCARCContractPass());
608611

609612
if (TM->addPassesToEmitFile(CodeGenPasses, OS, DwoOS, CGFT,
610-
/*DisableVerify=*/!CodeGenOpts.VerifyModule)) {
613+
/*DisableVerify=*/!CodeGenOpts.VerifyModule,
614+
nullptr, CasIDOS)) {
611615
Diags.Report(diag::err_fe_unable_to_interface_with_target);
612616
return false;
613617
}
@@ -1127,7 +1131,8 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
11271131

11281132
void EmitAssemblyHelper::RunCodegenPipeline(
11291133
BackendAction Action, std::unique_ptr<raw_pwrite_stream> &OS,
1130-
std::unique_ptr<llvm::ToolOutputFile> &DwoOS) {
1134+
std::unique_ptr<llvm::ToolOutputFile> &DwoOS,
1135+
std::unique_ptr<raw_pwrite_stream> &CasIDOS) {
11311136
// We still use the legacy PM to run the codegen pipeline since the new PM
11321137
// does not work with the codegen pipeline.
11331138
// FIXME: make the new PM work with the codegen pipeline.
@@ -1146,7 +1151,7 @@ void EmitAssemblyHelper::RunCodegenPipeline(
11461151
return;
11471152
}
11481153
if (!AddEmitPasses(CodeGenPasses, Action, *OS,
1149-
DwoOS ? &DwoOS->os() : nullptr))
1154+
DwoOS ? &DwoOS->os() : nullptr, CasIDOS.get()))
11501155
// FIXME: Should we handle this error differently?
11511156
return;
11521157
break;
@@ -1161,8 +1166,9 @@ void EmitAssemblyHelper::RunCodegenPipeline(
11611166
}
11621167
}
11631168

1164-
void EmitAssemblyHelper::EmitAssembly(BackendAction Action,
1165-
std::unique_ptr<raw_pwrite_stream> OS) {
1169+
void EmitAssemblyHelper::EmitAssembly(
1170+
BackendAction Action, std::unique_ptr<raw_pwrite_stream> OS,
1171+
std::unique_ptr<raw_pwrite_stream> CasIDOS) {
11661172
TimeRegion Region(CodeGenOpts.TimePasses ? &CodeGenerationTime : nullptr);
11671173
setCommandLineOpts(CodeGenOpts);
11681174

@@ -1179,7 +1185,7 @@ void EmitAssemblyHelper::EmitAssembly(BackendAction Action,
11791185

11801186
std::unique_ptr<llvm::ToolOutputFile> ThinLinkOS, DwoOS;
11811187
RunOptimizationPipeline(Action, OS, ThinLinkOS);
1182-
RunCodegenPipeline(Action, OS, DwoOS);
1188+
RunCodegenPipeline(Action, OS, DwoOS, CasIDOS);
11831189

11841190
if (ThinLinkOS)
11851191
ThinLinkOS->keep();
@@ -1302,7 +1308,8 @@ void clang::EmitBackendOutput(DiagnosticsEngine &Diags,
13021308
const CASOptions &CASOpts, // MCCAS
13031309
StringRef TDesc, Module *M, BackendAction Action,
13041310
IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS,
1305-
std::unique_ptr<raw_pwrite_stream> OS) {
1311+
std::unique_ptr<raw_pwrite_stream> OS,
1312+
std::unique_ptr<raw_pwrite_stream> CasIDOS) {
13061313

13071314
llvm::TimeTraceScope TimeScope("Backend");
13081315

@@ -1348,7 +1355,7 @@ void clang::EmitBackendOutput(DiagnosticsEngine &Diags,
13481355
EmitAssemblyHelper AsmHelper(Diags, HeaderOpts, CGOpts, TOpts, LOpts,
13491356
CASOpts, // MCCAS
13501357
M, VFS);
1351-
AsmHelper.EmitAssembly(Action, std::move(OS));
1358+
AsmHelper.EmitAssembly(Action, std::move(OS), std::move(CasIDOS));
13521359

13531360
// Verify clang's TargetInfo DataLayout against the LLVM TargetMachine's
13541361
// DataLayout.

clang/lib/CodeGen/CodeGenAction.cpp

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ namespace clang {
116116
const LangOptions &LangOpts;
117117
const CASOptions &CASOpts; // MCCAS
118118
std::unique_ptr<raw_pwrite_stream> AsmOutStream;
119+
std::unique_ptr<raw_pwrite_stream> CasIDStream;
119120
ASTContext *Context;
120121
IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS;
121122

@@ -160,11 +161,13 @@ namespace clang {
160161
const std::string &InFile,
161162
SmallVector<LinkModule, 4> LinkModules,
162163
std::unique_ptr<raw_pwrite_stream> OS, LLVMContext &C,
163-
CoverageSourceInfo *CoverageInfo = nullptr)
164+
CoverageSourceInfo *CoverageInfo = nullptr,
165+
std::unique_ptr<raw_pwrite_stream> CasIDOS = nullptr)
164166
: Diags(Diags), Action(Action), HeaderSearchOpts(HeaderSearchOpts),
165167
CodeGenOpts(CodeGenOpts), TargetOpts(TargetOpts), LangOpts(LangOpts),
166168
CASOpts(CASOpts), // MCCAS
167-
AsmOutStream(std::move(OS)), Context(nullptr), FS(VFS),
169+
AsmOutStream(std::move(OS)), CasIDStream(std::move(CasIDOS)),
170+
Context(nullptr), FS(VFS),
168171
LLVMIRGeneration("irgen", "LLVM IR Generation Time"),
169172
LLVMIRGenerationRefCount(0),
170173
Gen(CreateLLVMCodeGen(Diags, InFile, std::move(VFS), HeaderSearchOpts,
@@ -393,7 +396,8 @@ namespace clang {
393396
EmitBackendOutput(Diags, HeaderSearchOpts, CodeGenOpts, TargetOpts,
394397
LangOpts, CASOpts, // MCCAS
395398
C.getTargetInfo().getDataLayoutString(), getModule(),
396-
Action, FS, std::move(AsmOutStream));
399+
Action, FS, std::move(AsmOutStream),
400+
std::move(CasIDStream));
397401

398402
Ctx.setDiagnosticHandler(std::move(OldDiagnosticHandler));
399403

@@ -1079,8 +1083,20 @@ std::unique_ptr<ASTConsumer>
10791083
CodeGenAction::CreateASTConsumer(CompilerInstance &CI, StringRef InFile) {
10801084
BackendAction BA = static_cast<BackendAction>(Act);
10811085
std::unique_ptr<raw_pwrite_stream> OS = CI.takeOutputStream();
1082-
if (!OS)
1086+
std::unique_ptr<raw_pwrite_stream> CasIDOS = nullptr;
1087+
if (!OS) {
10831088
OS = GetOutputStream(CI, InFile, BA);
1089+
auto OutputFile = StringRef(CI.getFrontendOpts().OutputFile);
1090+
if (CI.getCodeGenOpts().UseCASBackend &&
1091+
CI.getCodeGenOpts().EmitCASIDFile &&
1092+
CI.getCodeGenOpts().getCASObjMode() != llvm::CASBackendMode::CASID &&
1093+
BA == Backend_EmitObj && OutputFile != "-") {
1094+
std::string OutputPathCASIDFile = std::string(OutputFile);
1095+
OutputPathCASIDFile.append(".casid");
1096+
CasIDOS = CI.createOutputFile(OutputPathCASIDFile, true, true,
1097+
CI.getFrontendOpts().UseTemporary, false);
1098+
}
1099+
}
10841100

10851101
if (BA != Backend_EmitNothing && !OS)
10861102
return nullptr;
@@ -1101,7 +1117,8 @@ CodeGenAction::CreateASTConsumer(CompilerInstance &CI, StringRef InFile) {
11011117
CI.getTargetOpts(), CI.getLangOpts(),
11021118
CI.getCASOpts(), // MCCAS
11031119
std::string(InFile), std::move(LinkModules), std::move(OS), *VMContext,
1104-
CoverageInfo));
1120+
CoverageInfo, std::move(CasIDOS)));
1121+
11051122
BEConsumer = Result.get();
11061123

11071124
// Enable generating macro debug info only when debug info is not disabled and

0 commit comments

Comments
 (0)