Skip to content

Commit bd5fc55

Browse files
Enable -fcas-emit-casid-file to llvm backend.
This change enables -fcas-emit-casid-file to the llvm backend and allows emission of a .casid file when -fcas-backend and -fcas-backend-mode=native or -fcas-backend-mode=verify is used
1 parent 142e1b1 commit bd5fc55

File tree

7 files changed

+71
-29
lines changed

7 files changed

+71
-29
lines changed

clang/test/CAS/cas-emit-casid.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// RUN: rm -rf %t && mkdir -p %t
2+
// RUN: %clang -c -Xclang -fcas-backend -Xclang -fcas-path -Xclang %t/cas -Xclang -fcas-backend-mode=native -Xclang -fcas-emit-casid-file %s -o %t/test.o
3+
// RUN: cat %t/test.o.casid | FileCheck %s --check-prefix=NATIVE_FILENAME
4+
// NATIVE_FILENAME: CASID:Jllvmcas://{{.*}}
5+
//
6+
// RUN: rm -rf %t && mkdir -p %t
7+
// RUN: %clang -c -Xclang -fcas-backend -Xclang -fcas-path -Xclang %t/cas -Xclang -fcas-backend-mode=verify -Xclang -fcas-emit-casid-file %s -o %t/test.o
8+
// RUN: cat %t/test.o.casid | FileCheck %s --check-prefix=VERIFY_FILENAME
9+
// VERIFY_FILENAME: CASID:Jllvmcas://{{.*}}
10+
//
11+
// RUN: rm -rf %t && mkdir -p %t
12+
// RUN: %clang -c -Xclang -fcas-backend -Xclang -fcas-path -Xclang %t/cas -Xclang -fcas-backend-mode=casid -Xclang -fcas-emit-casid-file %s -o %t/test.o
13+
// RUN: not cat %t/test.o.casid
14+
//
15+
// RUN: rm -rf %t && mkdir -p %t
16+
// RUN: %clang -c -Xclang -fcas-backend -Xclang -fcas-path -Xclang %t/cas -Xclang -fcas-backend-mode=native -Xclang -fcas-emit-casid-file %s -o -
17+
// RUN: not cat %t/test.o.casid
18+
//
19+
// RUN: rm -rf %t && mkdir -p %t
20+
// RUN: %clang -c -Xclang -fcas-backend -Xclang -fcas-path -Xclang %t/cas -Xclang -fcas-backend-mode=verify -Xclang -fcas-emit-casid-file %s -o -
21+
// RUN: not cat %t/test.o.casid
22+
//
23+
// RUN: rm -rf %t && mkdir -p %t
24+
// RUN: %clang -c -Xclang -fcas-backend -Xclang -fcas-path -Xclang %t/cas -Xclang -fcas-backend-mode=casid -Xclang -fcas-emit-casid-file %s -o -
25+
// RUN: not cat %t/test.o.casid
26+
27+
void test(void) {}
28+
29+
int test1(void) {
30+
return 0;
31+
}

llvm/include/llvm/MC/MCAsmBackend.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,8 @@ class MCAsmBackend {
9090
const llvm::MCAsmLayout &, cas::ObjectStore &, raw_ostream *)>
9191
CreateFromMcAssembler,
9292
std::function<Error(cas::ObjectProxy, cas::ObjectStore &, raw_ostream &)>
93-
SerializeObjectFile) const;
93+
SerializeObjectFile,
94+
raw_pwrite_stream *CasIDOS = nullptr) const;
9495
// END MCCAS
9596

9697

llvm/include/llvm/MC/MCMachOCASWriter.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ class MachOCASWriter : public MCObjectWriter {
5252
CreateFromMcAssembler,
5353
std::function<Error(cas::ObjectProxy, cas::ObjectStore &, raw_ostream &)>
5454
SerializeObjectFile,
55-
std::optional<MCTargetOptions::ResultCallBackTy> CallBack);
55+
std::optional<MCTargetOptions::ResultCallBackTy> CallBack,
56+
raw_pwrite_stream *CasIDOS = nullptr);
5657

5758
void recordRelocation(MCAssembler &Asm, const MCAsmLayout &Layout,
5859
const MCFragment *Fragment, const MCFixup &Fixup,
@@ -122,6 +123,7 @@ class MachOCASWriter : public MCObjectWriter {
122123

123124
private:
124125
raw_pwrite_stream &OS;
126+
raw_pwrite_stream *CasIDOS;
125127

126128
SmallString<512> InternalBuffer;
127129
raw_svector_ostream InternalOS;
@@ -157,7 +159,8 @@ std::unique_ptr<MCObjectWriter> createMachOCASWriter(
157159
CreateFromMcAssembler,
158160
std::function<Error(cas::ObjectProxy, cas::ObjectStore &, raw_ostream &)>
159161
SerializeObjectFile,
160-
std::optional<MCTargetOptions::ResultCallBackTy> CallBack = std::nullopt);
162+
std::optional<MCTargetOptions::ResultCallBackTy> CallBack = std::nullopt,
163+
raw_pwrite_stream *CasIDOS = nullptr);
161164

162165
} // end namespace llvm
163166

llvm/include/llvm/Target/TargetMachine.h

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,8 @@ class TargetMachine {
377377
addPassesToEmitFile(PassManagerBase &, raw_pwrite_stream &,
378378
raw_pwrite_stream *, CodeGenFileType,
379379
bool /*DisableVerify*/ = true,
380-
MachineModuleInfoWrapperPass *MMIWP = nullptr) {
380+
MachineModuleInfoWrapperPass *MMIWP = nullptr,
381+
raw_pwrite_stream *CasIDOS = nullptr) {
381382
return true;
382383
}
383384

@@ -443,11 +444,11 @@ class LLVMTargetMachine : public TargetMachine {
443444
/// emitted. Typically this will involve several steps of code generation.
444445
/// \p MMIWP is an optional parameter that, if set to non-nullptr,
445446
/// will be used to set the MachineModuloInfo for this PM.
446-
bool
447-
addPassesToEmitFile(PassManagerBase &PM, raw_pwrite_stream &Out,
448-
raw_pwrite_stream *DwoOut, CodeGenFileType FileType,
449-
bool DisableVerify = true,
450-
MachineModuleInfoWrapperPass *MMIWP = nullptr) override;
447+
bool addPassesToEmitFile(PassManagerBase &PM, raw_pwrite_stream &Out,
448+
raw_pwrite_stream *DwoOut, CodeGenFileType FileType,
449+
bool DisableVerify = true,
450+
MachineModuleInfoWrapperPass *MMIWP = nullptr,
451+
raw_pwrite_stream *CasIDOS = nullptr) override;
451452

452453
virtual Error buildCodeGenPipeline(ModulePassManager &,
453454
MachineFunctionPassManager &,
@@ -482,11 +483,12 @@ class LLVMTargetMachine : public TargetMachine {
482483
/// machine code from the MI representation.
483484
bool addAsmPrinter(PassManagerBase &PM, raw_pwrite_stream &Out,
484485
raw_pwrite_stream *DwoOut, CodeGenFileType FileType,
485-
MCContext &Context);
486+
MCContext &Context, raw_pwrite_stream *CasIDOS = nullptr);
486487

487488
Expected<std::unique_ptr<MCStreamer>>
488489
createMCStreamer(raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut,
489-
CodeGenFileType FileType, MCContext &Ctx);
490+
CodeGenFileType FileType, MCContext &Ctx,
491+
raw_pwrite_stream *CasIDOS = nullptr);
490492

491493
/// True if the target uses physical regs (as nearly all targets do). False
492494
/// for stack machines such as WebAssembly and other virtual-register

llvm/lib/CodeGen/LLVMTargetMachine.cpp

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -124,13 +124,11 @@ addPassesToGenerateCode(LLVMTargetMachine &TM, PassManagerBase &PM,
124124
return PassConfig;
125125
}
126126

127-
bool LLVMTargetMachine::addAsmPrinter(PassManagerBase &PM,
128-
raw_pwrite_stream &Out,
129-
raw_pwrite_stream *DwoOut,
130-
CodeGenFileType FileType,
131-
MCContext &Context) {
127+
bool LLVMTargetMachine::addAsmPrinter(
128+
PassManagerBase &PM, raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut,
129+
CodeGenFileType FileType, MCContext &Context, raw_pwrite_stream *CasIDOS) {
132130
Expected<std::unique_ptr<MCStreamer>> MCStreamerOrErr =
133-
createMCStreamer(Out, DwoOut, FileType, Context);
131+
createMCStreamer(Out, DwoOut, FileType, Context, CasIDOS);
134132
if (auto Err = MCStreamerOrErr.takeError())
135133
return true;
136134

@@ -146,7 +144,7 @@ bool LLVMTargetMachine::addAsmPrinter(PassManagerBase &PM,
146144

147145
Expected<std::unique_ptr<MCStreamer>> LLVMTargetMachine::createMCStreamer(
148146
raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut, CodeGenFileType FileType,
149-
MCContext &Context) {
147+
MCContext &Context, raw_pwrite_stream *CasIDOS) {
150148
if (Options.MCOptions.MCSaveTempLabels)
151149
Context.setAllowTemporaryLabels(false);
152150

@@ -228,7 +226,7 @@ Expected<std::unique_ptr<MCStreamer>> LLVMTargetMachine::createMCStreamer(
228226
CASBackendWriter = MAB->createCASObjectWriter(
229227
Out, getTargetTriple(), *Options.MCOptions.CAS, Options.MCOptions,
230228
Options.MCOptions.CASObjMode, CreateFromMcAssembler,
231-
SerializeObjectFile);
229+
SerializeObjectFile, CasIDOS);
232230
}
233231
// END MCCAS
234232
AsmStreamer.reset(getTarget().createMCObjectStreamer(
@@ -254,7 +252,7 @@ Expected<std::unique_ptr<MCStreamer>> LLVMTargetMachine::createMCStreamer(
254252
bool LLVMTargetMachine::addPassesToEmitFile(
255253
PassManagerBase &PM, raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut,
256254
CodeGenFileType FileType, bool DisableVerify,
257-
MachineModuleInfoWrapperPass *MMIWP) {
255+
MachineModuleInfoWrapperPass *MMIWP, raw_pwrite_stream *CasIDOS) {
258256
// Add common CodeGen passes.
259257
if (!MMIWP)
260258
MMIWP = new MachineModuleInfoWrapperPass(this);
@@ -264,7 +262,8 @@ bool LLVMTargetMachine::addPassesToEmitFile(
264262
return true;
265263

266264
if (TargetPassConfig::willCompleteCodeGenPipeline()) {
267-
if (addAsmPrinter(PM, Out, DwoOut, FileType, MMIWP->getMMI().getContext()))
265+
if (addAsmPrinter(PM, Out, DwoOut, FileType, MMIWP->getMMI().getContext(),
266+
CasIDOS))
268267
return true;
269268
} else {
270269
// MIR printing is redundant with -filetype=null.

llvm/lib/MC/MCAsmBackend.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,14 +69,15 @@ std::unique_ptr<MCObjectWriter> MCAsmBackend::createCASObjectWriter(
6969
cas::ObjectStore &, raw_ostream *)>
7070
CreateFromMcAssembler,
7171
std::function<Error(cas::ObjectProxy, cas::ObjectStore &, raw_ostream &)>
72-
SerializeObjectFile) const {
72+
SerializeObjectFile,
73+
raw_pwrite_stream *CasIDOS) const {
7374
auto TW = createObjectTargetWriter();
7475
switch (TW->getFormat()) {
7576
case Triple::MachO:
7677
return createMachOCASWriter(cast<MCMachObjectTargetWriter>(std::move(TW)),
7778
TT, CAS, Mode, OS, Endian == support::little,
7879
CreateFromMcAssembler, SerializeObjectFile,
79-
MCOpts.ResultCallBack);
80+
MCOpts.ResultCallBack, CasIDOS);
8081
default:
8182
llvm_unreachable("unexpected object format");
8283
}

llvm/lib/MC/MachOCASWriter.cpp

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,10 @@ MachOCASWriter::MachOCASWriter(
5252
CreateFromMcAssembler,
5353
std::function<Error(cas::ObjectProxy, cas::ObjectStore &, raw_ostream &)>
5454
SerializeObjectFile,
55-
std::optional<MCTargetOptions::ResultCallBackTy> ResultCallBack)
55+
std::optional<MCTargetOptions::ResultCallBackTy> ResultCallBack,
56+
raw_pwrite_stream *CasIDOS)
5657
: Target(TT), CAS(CAS), Mode(Mode), ResultCallBack(ResultCallBack), OS(OS),
57-
InternalOS(InternalBuffer),
58+
CasIDOS(CasIDOS), InternalOS(InternalBuffer),
5859
MOW(std::move(MOTW), InternalOS, IsLittleEndian),
5960
CreateFromMcAssembler(CreateFromMcAssembler),
6061
SerializeObjectFile(SerializeObjectFile) {
@@ -114,6 +115,9 @@ uint64_t MachOCASWriter::writeObject(MCAssembler &Asm,
114115
}
115116
}
116117

118+
if (CasIDOS)
119+
writeCASIDBuffer(CASObj.getID(), *CasIDOS);
120+
117121
return OS.tell() - StartOffset;
118122
}
119123

@@ -127,8 +131,9 @@ std::unique_ptr<MCObjectWriter> llvm::createMachOCASWriter(
127131
CreateFromMcAssembler,
128132
std::function<Error(cas::ObjectProxy, cas::ObjectStore &, raw_ostream &)>
129133
SerializeObjectFile,
130-
std::optional<MCTargetOptions::ResultCallBackTy> ResultCallBack) {
131-
return std::make_unique<MachOCASWriter>(std::move(MOTW), TT, CAS, Mode, OS,
132-
IsLittleEndian, CreateFromMcAssembler,
133-
SerializeObjectFile, ResultCallBack);
134+
std::optional<MCTargetOptions::ResultCallBackTy> ResultCallBack,
135+
raw_pwrite_stream *CasIDOS) {
136+
return std::make_unique<MachOCASWriter>(
137+
std::move(MOTW), TT, CAS, Mode, OS, IsLittleEndian, CreateFromMcAssembler,
138+
SerializeObjectFile, ResultCallBack, CasIDOS);
134139
}

0 commit comments

Comments
 (0)