@@ -39,15 +39,11 @@ using namespace llvm;
3939using namespace llvm ::dxil;
4040using namespace llvm ::mcdxbc;
4141
42- static cl::opt<std::string>
43- PdbFileName (" dx-pdb-file" ,
44- cl::desc (" Specify the PDB output file path for DirectX target" ),
45- cl::value_desc(" filename" ));
46- static cl::opt<std::string> PdbOutputDir (
47- " dx-pdb-dir" ,
48- cl::desc (" Specify the PDB output directory for DirectX target. The file "
49- " name is derived from the shader hash" ),
50- cl::value_desc(" directory" ));
42+ cl::opt<std::string> PdbDebugPath (
43+ " dx-Fd" ,
44+ cl::desc (" Write debug information to the given file, or automatically "
45+ " named file in directory when ending in '/'" ),
46+ cl::value_desc(" filename" ));
5147static cl::opt<bool > ShaderHashDependsOnSource (
5248 " dx-Zss" , cl::desc(" Compute Shader Hash considering source information" ));
5349extern cl::opt<bool > SourceInDebugModule;
@@ -151,9 +147,9 @@ void DXContainerGlobals::computeShaderHashAndDebugName(
151147 }
152148
153149 Digest.update (DXILConstant->getRawDataValues ());
154- MD5 ::MD5Result Result = Digest.final ();
150+ MD5 ::MD5Result MD5 = Digest.final ();
155151
156- memcpy (reinterpret_cast <void *>(&HashData.Digest ), Result .data (), 16 );
152+ memcpy (reinterpret_cast <void *>(&HashData.Digest ), MD5 .data (), 16 );
157153 if (sys::IsBigEndianHost)
158154 HashData.swapBytes ();
159155 StringRef Data (reinterpret_cast <char *>(&HashData), sizeof (dxbc::ShaderHash));
@@ -163,47 +159,41 @@ void DXContainerGlobals::computeShaderHashAndDebugName(
163159 Globals.emplace_back (
164160 buildContainerGlobal (M, ModuleConstant, " dx.hash" , " HASH" ));
165161
166- // Emit ILDN part in debug info mode.
167- // DXIL bitcode hash is used, which corresponds to DXC behavior with
168- // `/Zi /Qembed_debug /Zsb` flags.
169162 if (M.debug_compile_units ().empty ())
170163 return ;
171164
172- if (!PdbFileName.empty () && !PdbOutputDir.empty ())
173- report_fatal_error (
174- " --dx-pdb-file and --dx-pdb-dir are mutually exclusive options" );
175-
176165 SmallString<40 > DebugNameStr;
177- Digest.stringifyResult (Result , DebugNameStr);
166+ Digest.stringifyResult (MD5 , DebugNameStr);
178167 DebugNameStr += " .pdb" ;
168+ if (!PdbDebugPath.empty ()) {
169+ StringRef DebugFile = PdbDebugPath.getValue ();
170+ SmallString<256 > AbsoluteDebugName;
171+ if (sys::path::is_separator (DebugFile.back ())) {
172+ // If /Fd was specified as a directory, put the MD5.pdb file there.
173+ AbsoluteDebugName = DebugFile;
174+ sys::path::append (AbsoluteDebugName, DebugNameStr);
175+ } else {
176+ // Otherwise, use /Fd value as a user-provided PDB file name.
177+ DebugNameStr = DebugFile;
178+ AbsoluteDebugName = DebugNameStr;
179+ }
179180
180- mcdxbc::DebugName DebugName;
181- if (PdbFileName.empty ()) {
182- // Use the MD5 hash as the file name.
183- Digest.stringifyResult (Result, DebugNameStr);
184- DebugNameStr += " .pdb" ;
185- } else {
186- // Use user-provided PDB file name.
187- DebugNameStr = PdbFileName;
181+ // Pass PDB name to DXContainerPDBPass via PDBNAME section.
182+ addSection (M, Globals, AbsoluteDebugName, " dx.pdb.name" ,
183+ PdbFileNameSectionName);
184+ // Pass module hash to DXContainerPDBPass.
185+ Globals.emplace_back (buildContainerGlobal (
186+ M, ConstantDataArray::get (M.getContext (), ArrayRef (HashData.Digest )),
187+ " dx.pdb.hash" , ModuleHashSectionName));
188188 }
189- DebugName.setFilename (DebugNameStr);
190-
191- SmallString<256 > AbsoluteDebugName (PdbOutputDir);
192- sys::path::append (AbsoluteDebugName, DebugNameStr);
193189
190+ // Emit ILDN part in debug info mode.
191+ mcdxbc::DebugName DebugName;
192+ DebugName.setFilename (DebugNameStr);
194193 SmallString<64 > ILDNData;
195194 raw_svector_ostream OS (ILDNData);
196195 DebugName.write (OS );
197196 addSection (M, Globals, ILDNData, " dx.ildn" , " ILDN" );
198-
199- // TODO: Do not create PDB in embedded mode.
200- // Pass PDB name to DXContainerPDBPass via PDBNAME section.
201- addSection (M, Globals, AbsoluteDebugName, " dx.pdb.name" ,
202- PdbFileNameSectionName);
203- // Pass module hash to DXContainerPDBPass.
204- Globals.emplace_back (buildContainerGlobal (
205- M, ConstantDataArray::get (M.getContext (), ArrayRef (HashData.Digest )),
206- " dx.pdb.hash" , ModuleHashSectionName));
207197}
208198
209199GlobalVariable *DXContainerGlobals::buildContainerGlobal (
0 commit comments