================ @@ -1026,6 +1030,72 @@ void SystemZAsmPrinter::emitADASection() { OutStreamer->popSection(); } +static std::string getProductID(Module &M) { + std::string ProductID; + if (auto *MD = M.getModuleFlag("zos_product_id")) + ProductID = cast<MDString>(MD)->getString().str(); + if (ProductID.empty()) + ProductID = "LLVM"; + return ProductID; +} + +static uint32_t getProductVersion(Module &M) { + if (auto *VersionVal = mdconst::extract_or_null<ConstantInt>( + M.getModuleFlag("zos_product_major_version"))) + return VersionVal->getZExtValue(); + return LLVM_VERSION_MAJOR; +} + +static uint32_t getProductRelease(Module &M) { + if (auto *ReleaseVal = mdconst::extract_or_null<ConstantInt>( + M.getModuleFlag("zos_product_minor_version"))) + return ReleaseVal->getZExtValue(); + return LLVM_VERSION_MINOR; +} + +static uint32_t getProductPatch(Module &M) { + if (auto *PatchVal = mdconst::extract_or_null<ConstantInt>( + M.getModuleFlag("zos_product_patchlevel"))) + return PatchVal->getZExtValue(); + return LLVM_VERSION_PATCH; +} + +static time_t getTranslationTime(Module &M) { + std::time_t Time = 0; + if (auto *Val = mdconst::extract_or_null<ConstantInt>( + M.getModuleFlag("zos_translation_time"))) { + long SecondsSinceEpoch = Val->getSExtValue(); + Time = static_cast<time_t>(SecondsSinceEpoch); + } + return Time; +} + +void SystemZAsmPrinter::emitIDRLSection(Module &M) { + OutStreamer->pushSection(); + OutStreamer->switchSection(getObjFileLowering().getIDRLSection()); + constexpr unsigned IDRLDataLength = 30; + std::time_t Time = getTranslationTime(M); + + uint32_t ProductVersion = getProductVersion(M); + uint32_t ProductRelease = getProductRelease(M); + + std::string ProductID = getProductID(M); + + SmallString<IDRLDataLength + 1> TempStr; + raw_svector_ostream O(TempStr); + O << formatv("{0}{1,0-2:d}{2,0-2:d}{3:%Y-%m-%d %H:%M:%S}", + ProductID.substr(0, 10).c_str(), ProductVersion, ProductRelease, + llvm::sys::toUtcTime(Time)); + SmallString<IDRLDataLength> Data; + ConverterEBCDIC::convertToEBCDIC(TempStr, Data); + + OutStreamer->emitInt8(0); // Reserved. + OutStreamer->emitInt8(3); // Format. + OutStreamer->emitInt16(IDRLDataLength); // Length. + OutStreamer->emitBytes(Data.str()); ---------------- ysyeda wrote:
I added testing for the IDRL section and fixed the length to be 30 bytes. https://github.com/llvm/llvm-project/pull/68926 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits