[clang] [llvm] [DTLTO] Serialize of LTO Config (PR #219894)
Konstantin Belochapka via cfe-commits
cfe-commits at lists.llvm.org
Mon Sep 7 23:50:31 PDT 2026
================
@@ -0,0 +1,181 @@
+//===- LTOConfigBitcodeTest.cpp - LTO config bitcode tests --------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/LTO/LTOConfigBitcode.h"
+#include "llvm/Bitcode/BitcodeReader.h"
+#include "llvm/Bitcode/BitcodeWriter.h"
+#include "llvm/IR/LLVMContext.h"
+#include "llvm/IR/Module.h"
+#include "llvm/LTO/TargetOptionsBitcode.h"
+#include "llvm/Support/FileSystem.h"
+#include "llvm/Support/FileUtilities.h"
+#include "llvm/Support/MemoryBuffer.h"
+#include "llvm/Support/MemoryBufferRef.h"
+#include "llvm/Support/raw_ostream.h"
+#include "llvm/Testing/Support/Error.h"
+#include "gtest/gtest.h"
+
+#include <limits>
+
+using namespace llvm;
+using namespace llvm::lto;
+
+TEST(TargetOptionsBitcodeTest, RoundTripThroughBitcode) {
+ TargetOptions Input;
+ Input.MCOptions.BinutilsVersion = {2, 41};
+ Input.FunctionSections = true;
+ Input.DataSections = true;
+ Input.GlobalISelAbort = GlobalISelAbortMode::DisableWithDiag;
+ Input.TLSSize = 64;
+ Input.BBSections = BasicBlockSection::List;
+ Input.BBSectionsFuncListBuf = MemoryBuffer::getMemBufferCopy(
+ "v1\nf foo\nc 0 1\n", "basic-block-sections.profile");
+ Input.EnableDefaultMachineVerifier = false;
+ Input.StackUsageFile = "output.su";
+ Input.LoopAlignment = std::numeric_limits<unsigned>::max();
+ Input.ExceptionModel = ExceptionHandling::Wasm;
+ Input.MCOptions.MCRelaxAll = true;
+ Input.MCOptions.RelocSectionSym = RelocSectionSymType::Internal;
+ Input.MCOptions.DwarfVersion = 5;
+ Input.MCOptions.ABIName = "test-abi";
+ Input.MCOptions.OutputAsmVariant = std::numeric_limits<unsigned>::max();
+ Input.MCOptions.IASSearchPaths = {"include/one", "include/two"};
+ Input.MCOptions.InstPrinterOptions = {"no-aliases"};
+ Input.MCOptions.LargeEHEncoding = true;
+
+ LLVMContext WriteCtx;
+ Module M("target-options", WriteCtx);
+ ASSERT_THAT_ERROR(encodeTargetOptionsToModule(M, Input), Succeeded());
+ EXPECT_TRUE(hasEncodedTargetOptions(M));
+
+ SmallString<0> Storage;
+ raw_svector_ostream OS(Storage);
+ WriteBitcodeToFile(M, OS);
+
+ LLVMContext ReadCtx;
+ Expected<std::unique_ptr<Module>> Parsed = parseBitcodeFile(
+ MemoryBufferRef(StringRef(Storage.data(), Storage.size()), "options.bc"),
+ ReadCtx);
+ ASSERT_THAT_EXPECTED(Parsed, Succeeded());
+ Expected<TargetOptions> Output = decodeTargetOptionsFromModule(**Parsed);
+ ASSERT_THAT_EXPECTED(Output, Succeeded());
+
+ EXPECT_EQ(Output->MCOptions.BinutilsVersion, Input.MCOptions.BinutilsVersion);
+ EXPECT_TRUE(Output->FunctionSections);
+ EXPECT_TRUE(Output->DataSections);
+ EXPECT_EQ(Output->GlobalISelAbort, GlobalISelAbortMode::DisableWithDiag);
----------------
kbelochapka wrote:
Hi @arsenm , Can you please be more specific, what stuff needs to be serialized.
For DTLTO, we are addressing a very specific goal: ensuring that the object file generated from a bitcode file through the ThinLTO pipeline is identical to the object file produced by the DTLTO pipeline. In this context, the FunctionSections and DataSections fields are important because they have a direct impact on the layout and contents of the resulting object file.
https://github.com/llvm/llvm-project/pull/219894
More information about the cfe-commits
mailing list