================
@@ -189,6 +193,109 @@ findAssociatedResourceDeclForStruct(ASTContext &AST,
const MemberExpr *ME) {
return nullptr;
}
+void addSourceInfo(CodeGenModule &CGM, llvm::Module &M) {
+ auto &SM = CGM.getContext().getSourceManager();
+ auto &Macros = CGM.getPreprocessorOpts().Macros;
+ auto &Ctx = M.getContext();
+
+ // Names and content of shader source code files.
+ llvm::NamedMDNode *DXContents =
+ M.getOrInsertNamedMetadata("dx.source.contents");
+ auto addFile = [&](const std::pair<StringRef, StringRef> &NameContent) {
+ llvm::MDTuple *FileInfo =
+ llvm::MDNode::get(Ctx, {llvm::MDString::get(Ctx, NameContent.first),
+ llvm::MDString::get(Ctx, NameContent.second)});
+ DXContents->addOperand(FileInfo);
+ };
+
+ bool Invalid = false;
+ const SrcMgr::SLocEntry *MainLocEntry =
+ &SM.getSLocEntry(SM.getMainFileID(), &Invalid);
+ assert(!Invalid && "Main file SLocEntry must not be invalid!");
+ const SrcMgr::ContentCache &MainCCEntry =
+ MainLocEntry->getFile().getContentCache();
+
+ SmallVector<std::pair<std::string, StringRef>> Files;
+ std::optional<SmallString<256>> MainFileName;
+ Files.reserve(SM.local_sloc_entry_size());
+ for (unsigned I : llvm::seq(SM.local_sloc_entry_size())) {
+ const SrcMgr::SLocEntry &LocEntry = SM.getLocalSLocEntry(I);
+ if (!LocEntry.isFile())
+ continue;
+
+ const SrcMgr::FileInfo &FInfo = LocEntry.getFile();
+ if (isSystem(FInfo.getFileCharacteristic()))
+ continue;
+
+ const SrcMgr::ContentCache &CCEntry = FInfo.getContentCache();
+ OptionalFileEntryRef FEntry = CCEntry.OrigEntry;
+ if (!FEntry)
+ continue;
+
+ llvm::SmallString<256> Path = FEntry->getName();
+ llvm::sys::path::native(Path);
+ std::optional<llvm::MemoryBufferRef> Buffer = CCEntry.getBufferOrNone(
+ SM.getDiagnostics(), SM.getFileManager(), SourceLocation());
+ if (!Buffer) {
+ unsigned ID = SM.getDiagnostics().getCustomDiagID(
+ clang::DiagnosticsEngine::Warning,
+ "failed to embed source for \"%0\" into dx.source.contents");
+ SM.getDiagnostics().Report(ID) << Path;
+ continue;
+ }
+
+ if (&MainCCEntry != &CCEntry) {
+ Files.emplace_back(Path, Buffer->getBuffer());
+ } else {
+ // Main file should be at first position.
+ addFile(std::make_pair(Path, Buffer->getBuffer()));
+ MainFileName.emplace(Path);
+ }
+ }
+ assert(MainFileName && "Main file not found.");
+
+ // Files other that main one should be sorted by name.
+ llvm::sort(Files);
+#ifndef NDEBUG
+ for (unsigned I = 1; I < Files.size(); ++I)
+ assert((Files[I - 1].first != Files[I].first) &&
+ "duplicate files in dx.source.contents");
+#endif
+ llvm::for_each(Files, addFile);
+
+ SmallVector<llvm::Metadata *> Defines;
+ Defines.reserve(Macros.size());
+ for (const auto &Macro : Macros) {
+ // Ignore undefs.
+ if (!Macro.second)
+ Defines.emplace_back(llvm::MDString::get(Ctx, Macro.first));
+ }
+ M.getOrInsertNamedMetadata("dx.source.defines")
+ ->addOperand(llvm::MDNode::get(Ctx, Defines));
+
+ if (!CGM.getCodeGenOpts().MainFileName.empty())
+ llvm::sys::path::native(CGM.getCodeGenOpts().MainFileName, *MainFileName);
+ M.getOrInsertNamedMetadata("dx.source.mainFileName")
+ ->addOperand(
+ llvm::MDNode::get(Ctx, llvm::MDString::get(Ctx, *MainFileName)));
+
+ auto ParsedArgs = clang::parseEscapedCommandLine(
+ CGM.getCodeGenOpts().HLSLRecordCommandLine.c_str());
+ if (!ParsedArgs) {
+ unsigned DiagID = CGM.getDiags().getCustomDiagID(
+ DiagnosticsEngine::Error, "invalid escaped command line: %0");
----------------
AaronBallman wrote:
Why does this parsing have to happen at codegen time? This means passing
`-fsyntax-only` while passing an invalid command line option won't get
diagnosed. But also, why is this using custom diagnostics?
I think this information should be parsed far sooner than codegen and that
removes the need to link the options library into codegen.
https://github.com/llvm/llvm-project/pull/199689
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits