================ @@ -1026,6 +1030,78 @@ void SystemZAsmPrinter::emitADASection() { OutStreamer->popSection(); } +static uint32_t getProductVersion(Module &M) { + if (auto *VersionVal = cast_or_null<ConstantAsMetadata>( + M.getModuleFlag("zos_product_major_version"))) + return cast<ConstantInt>(VersionVal->getValue())->getZExtValue(); + return LLVM_VERSION_MAJOR; +} + +static uint32_t getProductRelease(Module &M) { + if (auto *ReleaseVal = cast_or_null<ConstantAsMetadata>( + M.getModuleFlag("zos_product_minor_version"))) + return cast<ConstantInt>(ReleaseVal->getValue())->getZExtValue(); + return LLVM_VERSION_MINOR; +} + +static uint32_t getProductPatch(Module &M) { + if (auto *PatchVal = cast_or_null<ConstantAsMetadata>( + M.getModuleFlag("zos_product_patchlevel"))) + return cast<ConstantInt>(PatchVal->getValue())->getZExtValue(); + return LLVM_VERSION_PATCH; +} + +static time_t getTranslationTime(Module &M) { + std::time_t Time = 0; + if (auto *Val = cast_or_null<ConstantAsMetadata>( + M.getModuleFlag("zos_translation_time"))) { + long SecondsSinceEpoch = cast<ConstantInt>(Val->getValue())->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; + if (auto *MD = M.getModuleFlag("zos_product_id")) + ProductID = cast<MDString>(MD)->getString().str(); + + if (ProductID.empty()) { + char ProductIDFormatted[11]; // 10 + null. + snprintf(ProductIDFormatted, sizeof(ProductIDFormatted), "LLVM %02d%02d", + ProductVersion, ProductRelease); + ProductID = ProductIDFormatted; + } + + // Remove - from Product Id, which makes it consistent with legacy. + // The binder expects alphanumeric characters only. + std::size_t DashFound = ProductID.find("-"); + if (DashFound != std::string::npos) + ProductID.erase(ProductID.begin() + DashFound); ---------------- uweigand wrote:
In the back-end, the string comes from a module flag in the IR - when providing their own IR file, a user could set that flag to anything, including a string with multiple dashes. So if this is a problem for the rest of the toolchain, we need to be more careful in handling it. If this is not actually a problem in the binder, then I guess removing that code here is fine. 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