https://github.com/wzssyqa created https://github.com/llvm/llvm-project/pull/93159
The backend may have interest on the language-standard level of source file. Let's pass it to IR. In a ll file, it looks like language-standard = "gnu17" >From 3e413bae6ba18276e4d47075d48d656e4f732b5e Mon Sep 17 00:00:00 2001 From: YunQiang Su <s...@gcc.gnu.org> Date: Thu, 23 May 2024 17:33:34 +0800 Subject: [PATCH] IR: Add module level attribution language-standard The backend may have interest on the language-standard level of source file. Let's pass it to IR. In a ll file, it looks like language-standard = "gnu17" --- clang/lib/CodeGen/ModuleBuilder.cpp | 3 +++ llvm/include/llvm/Bitcode/LLVMBitCodes.h | 3 +++ llvm/include/llvm/IR/Module.h | 7 +++++++ llvm/lib/Bitcode/Reader/BitcodeReader.cpp | 22 +++++++++++++++++++++- llvm/lib/Bitcode/Writer/BitcodeWriter.cpp | 23 +++++++++++++++++++++++ llvm/lib/IR/AsmWriter.cpp | 6 ++++++ llvm/lib/IR/Module.cpp | 4 ++-- 7 files changed, 65 insertions(+), 3 deletions(-) diff --git a/clang/lib/CodeGen/ModuleBuilder.cpp b/clang/lib/CodeGen/ModuleBuilder.cpp index df85295cfb2e2..cf07b09b93fd7 100644 --- a/clang/lib/CodeGen/ModuleBuilder.cpp +++ b/clang/lib/CodeGen/ModuleBuilder.cpp @@ -153,6 +153,9 @@ namespace { M->setTargetTriple(Ctx->getTargetInfo().getTriple().getTriple()); M->setDataLayout(Ctx->getTargetInfo().getDataLayoutString()); + M->setLanguageStandard( + LangStandard::getLangStandardForKind(Ctx->getLangOpts().LangStd) + .getName()); const auto &SDKVersion = Ctx->getTargetInfo().getSDKVersion(); if (!SDKVersion.empty()) M->setSDKVersion(SDKVersion); diff --git a/llvm/include/llvm/Bitcode/LLVMBitCodes.h b/llvm/include/llvm/Bitcode/LLVMBitCodes.h index 909eb833c601a..cba77c322fdb4 100644 --- a/llvm/include/llvm/Bitcode/LLVMBitCodes.h +++ b/llvm/include/llvm/Bitcode/LLVMBitCodes.h @@ -120,6 +120,9 @@ enum ModuleCodes { // IFUNC: [ifunc value type, addrspace, resolver val#, linkage, visibility] MODULE_CODE_IFUNC = 18, + + // LANGUAGE_STANDARD: [strchr x N] + MODULE_CODE_LANGUAGE_STANDARD = 19, }; /// PARAMATTR blocks have code for defining a parameter attribute set. diff --git a/llvm/include/llvm/IR/Module.h b/llvm/include/llvm/IR/Module.h index 6135e15fd030f..300dc5c5630dc 100644 --- a/llvm/include/llvm/IR/Module.h +++ b/llvm/include/llvm/IR/Module.h @@ -196,6 +196,7 @@ class LLVM_EXTERNAL_VISIBILITY Module { ///< recorded in bitcode. std::string TargetTriple; ///< Platform target triple Module compiled on ///< Format: (arch)(sub)-(vendor)-(sys0-(abi) + std::string LanguageStandard; ///< Language standard: c89/c99/c11/c23 etc. NamedMDSymTabType NamedMDSymTab; ///< NamedMDNode names. DataLayout DL; ///< DataLayout associated with the module StringMap<unsigned> @@ -277,6 +278,9 @@ class LLVM_EXTERNAL_VISIBILITY Module { /// contain the source file name. const std::string &getSourceFileName() const { return SourceFileName; } + /// Get the module's language standard. + const std::string &getLanguageStandard() const { return LanguageStandard; } + /// Get a short "name" for the module. /// /// This is useful for debugging or logging. It is essentially a convenience @@ -339,6 +343,9 @@ class LLVM_EXTERNAL_VISIBILITY Module { /// Set the target triple. void setTargetTriple(StringRef T) { TargetTriple = std::string(T); } + /// Set the language standard. + void setLanguageStandard(StringRef S) { LanguageStandard = std::string(S); } + /// Set the module-scope inline assembly blocks. /// A trailing newline is added if the input doesn't have one. void setModuleInlineAsm(StringRef Asm) { diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index c9295344f8080..8078291477886 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -946,6 +946,9 @@ class ModuleSummaryIndexBitcodeReader : public BitcodeReaderBase { /// Original source file name recorded in a bitcode record. std::string SourceFileName; + /// Original language standard recorded in a bitcode record. + std::string LanguageStandard; + /// The string identifier given to this module by the client, normally the /// path to the bitcode file. StringRef ModulePath; @@ -4613,13 +4616,22 @@ Error BitcodeReader::parseModule(uint64_t ResumeBit, VSTOffset = Record[0] - 1; break; /// MODULE_CODE_SOURCE_FILENAME: [namechar x N] - case bitc::MODULE_CODE_SOURCE_FILENAME: + case bitc::MODULE_CODE_SOURCE_FILENAME: { SmallString<128> ValueName; if (convertToString(Record, 0, ValueName)) return error("Invalid record"); TheModule->setSourceFileName(ValueName); break; } + /// MODULE_CODE_LANGUAGE_STANDARD: [strchar x N] + case bitc::MODULE_CODE_LANGUAGE_STANDARD: { + SmallString<128> ValueLangStd; + if (convertToString(Record, 0, ValueLangStd)) + return error("Invalid record"); + TheModule->setLanguageStandard(ValueLangStd); + break; + } + } Record.clear(); } this->ValueTypeCallback = std::nullopt; @@ -7227,6 +7239,14 @@ Error ModuleSummaryIndexBitcodeReader::parseModule() { SourceFileName = ValueName.c_str(); break; } + /// MODULE_CODE_LANGUAGE_STANDARD: [strchar x N] + case bitc::MODULE_CODE_LANGUAGE_STANDARD: { + SmallString<128> ValueName; + if (convertToString(Record, 0, ValueName)) + return error("Invalid record"); + LanguageStandard = ValueName.c_str(); + break; + } /// MODULE_CODE_HASH: [5*i32] case bitc::MODULE_CODE_HASH: { if (Record.size() != 5) diff --git a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp index c4cea3d6eef2d..ef39c31bae416 100644 --- a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -1484,6 +1484,29 @@ void ModuleBitcodeWriter::writeModuleInfo() { Stream.EmitRecord(bitc::MODULE_CODE_SOURCE_FILENAME, Vals, FilenameAbbrev); Vals.clear(); } + // Emit the module's language standard. + { + StringEncoding Bits = getStringEncoding(M.getLanguageStandard()); + BitCodeAbbrevOp AbbrevOpToUse = BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8); + if (Bits == SE_Char6) + AbbrevOpToUse = BitCodeAbbrevOp(BitCodeAbbrevOp::Char6); + else if (Bits == SE_Fixed7) + AbbrevOpToUse = BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7); + + // MODULE_CODE_SOURCE_FILENAME: [namechar x N] + auto Abbv = std::make_shared<BitCodeAbbrev>(); + Abbv->Add(BitCodeAbbrevOp(bitc::MODULE_CODE_LANGUAGE_STANDARD)); + Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); + Abbv->Add(AbbrevOpToUse); + unsigned LangStdAbbrev = Stream.EmitAbbrev(std::move(Abbv)); + + for (const auto P : M.getLanguageStandard()) + Vals.push_back((unsigned char)P); + + // Emit the finished record. + Stream.EmitRecord(bitc::MODULE_CODE_LANGUAGE_STANDARD, Vals, LangStdAbbrev); + Vals.clear(); + } // Emit the global variable information. for (const GlobalVariable &GV : M.globals()) { diff --git a/llvm/lib/IR/AsmWriter.cpp b/llvm/lib/IR/AsmWriter.cpp index 941f6a7a7d823..8f583691b51f0 100644 --- a/llvm/lib/IR/AsmWriter.cpp +++ b/llvm/lib/IR/AsmWriter.cpp @@ -2928,6 +2928,12 @@ void AssemblyWriter::printModule(const Module *M) { if (!M->getTargetTriple().empty()) Out << "target triple = \"" << M->getTargetTriple() << "\"\n"; + if (!M->getLanguageStandard().empty()) { + Out << "language_standard = \""; + printEscapedString(M->getLanguageStandard(), Out); + Out << "\"\n"; + } + if (!M->getModuleInlineAsm().empty()) { Out << '\n'; diff --git a/llvm/lib/IR/Module.cpp b/llvm/lib/IR/Module.cpp index a8696ed9e3ce5..1d7395b284339 100644 --- a/llvm/lib/IR/Module.cpp +++ b/llvm/lib/IR/Module.cpp @@ -71,8 +71,8 @@ template class llvm::SymbolTableListTraits<GlobalIFunc>; Module::Module(StringRef MID, LLVMContext &C) : Context(C), ValSymTab(std::make_unique<ValueSymbolTable>(-1)), - ModuleID(std::string(MID)), SourceFileName(std::string(MID)), DL(""), - IsNewDbgInfoFormat(false) { + ModuleID(std::string(MID)), SourceFileName(std::string(MID)), + LanguageStandard(""), DL(""), IsNewDbgInfoFormat(false) { Context.addModule(this); } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits