From 9069e5bc8f7e10eb1468f4b837ace09afcb7371b Mon Sep 17 00:00:00 2001 From: Shubham Sandeep Rastogi Date: Thu, 31 Jul 2025 11:25:40 -0700 Subject: [PATCH 01/29] Revert "[MCCAS] Add configuration LLVM_ENABLE_MCCAS" This reverts commit 1d94ada9141d7c162eb4327daa12fd33dbe33080. --- clang/include/clang/Driver/Options.td | 5 ----- clang/lib/Frontend/CMakeLists.txt | 9 +------- clang/lib/Frontend/CompileJobCache.cpp | 6 ----- clang/test/CAS/cas-backend.c | 1 - clang/test/CAS/cas-emit-casid.c | 2 +- clang/test/CAS/depscan-update-mccas.c | 1 - .../CAS/remote-cache-incompatible-options.c | 1 - clang/test/CMakeLists.txt | 9 +------- llvm/CMakeLists.txt | 1 - llvm/lib/CMakeLists.txt | 4 +--- llvm/lib/CodeGen/CMakeLists.txt | 9 +------- llvm/lib/CodeGen/CodeGenTargetMachineImpl.cpp | 14 +++--------- llvm/lib/MC/CMakeLists.txt | 4 ---- llvm/lib/MC/MachOCASWriter.cpp | 22 ++----------------- llvm/test/CAS/emit-casid-file.ll | 2 +- llvm/test/CMakeLists.txt | 11 ++-------- llvm/test/DebugInfo/CAS/AArch64/lit.local.cfg | 4 +--- llvm/test/MC/CAS/lit.local.cfg | 2 -- llvm/test/lit.cfg.py | 3 --- llvm/test/lit.site.cfg.py.in | 1 - llvm/test/tools/llvm-cas-dump/lit.local.cfg | 2 -- .../llvm-cas-object-format/lit.local.cfg | 2 -- .../tools/llvm-cas/ingest-blobs-casid.test | 2 +- llvm/tools/CMakeLists.txt | 8 +------ llvm/tools/llvm-mc/CMakeLists.txt | 9 +------- llvm/tools/llvm-mc/llvm-mc.cpp | 7 ------ 26 files changed, 17 insertions(+), 124 deletions(-) delete mode 100644 llvm/test/tools/llvm-cas-dump/lit.local.cfg delete mode 100644 llvm/test/tools/llvm-cas-object-format/lit.local.cfg diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 1ac067f96e8a8..53588ebdcd1ac 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -9092,15 +9092,10 @@ defm include_tree_preserve_pch_path : BoolFOption<"include-tree-preserve-pch-pat NegFlag>; /// BEGIN MCCAS -#ifdef LLVM_EMABLE_MCCAS defm cas_backend : BoolFOption<"cas-backend", CodeGenOpts<"UseCASBackend">, DefaultFalse, PosFlag, NegFlag>; -#else -def cas_backend : Flag<["-"], "fcas-backend">, Group; -def no_cas_backend : Flag<["-"], "fno-cas-backend">, Group; -#endif defm cas_emit_casid_file : BoolFOption<"cas-emit-casid-file", CodeGenOpts<"EmitCASIDFile">, DefaultFalse, diff --git a/clang/lib/Frontend/CMakeLists.txt b/clang/lib/Frontend/CMakeLists.txt index 2db35e619649f..4831919f5c50a 100644 --- a/clang/lib/Frontend/CMakeLists.txt +++ b/clang/lib/Frontend/CMakeLists.txt @@ -1,18 +1,11 @@ add_subdirectory(Rewrite) -if (LLVM_ENABLE_MCCAS) - add_definitions(-DLLVM_ENABLE_MCCAS=1) - set(MCCAS_DEPS - MCCAS - ) -endif() - set(LLVM_LINK_COMPONENTS BitReader BitstreamReader CAS CASUtil - ${MCCAS_DEPS} + MCCAS Option ProfileData RemoteCachingService diff --git a/clang/lib/Frontend/CompileJobCache.cpp b/clang/lib/Frontend/CompileJobCache.cpp index a8063996b76db..6e32eb80edb87 100644 --- a/clang/lib/Frontend/CompileJobCache.cpp +++ b/clang/lib/Frontend/CompileJobCache.cpp @@ -18,9 +18,7 @@ #include "llvm/CAS/ActionCache.h" #include "llvm/CAS/CASOutputBackend.h" #include "llvm/CASUtil/Utils.h" -#if LLVM_ENABLE_MCCAS #include "llvm/MCCAS/MCCASObjectV1.h" -#endif #include "llvm/RemoteCachingService/Client.h" #include "llvm/Support/FileOutputBuffer.h" #include "llvm/Support/Path.h" @@ -824,7 +822,6 @@ Expected> ObjectStoreCachingOutputs::replayCachedResult( if (WriteOutputAsCASID) llvm::cas::writeCASIDBuffer(CAS.getID(O.Object), *Output); else if (UseCASBackend) { -#if LLVM_ENABLE_MCCAS // Replay by write out object file. // When the environmental variable is set, save the backend CASID for // analysis later. @@ -841,9 +838,6 @@ Expected> ObjectStoreCachingOutputs::replayCachedResult( auto Schema = std::make_unique(CAS); if (auto E = Schema->serializeObjectFile(*Obj, *Output)) return E; -#else - llvm_unreachable("MCCAS disabled"); -#endif } return Output->keep(); } diff --git a/clang/test/CAS/cas-backend.c b/clang/test/CAS/cas-backend.c index de7589c2dafe1..662c45b0f7212 100644 --- a/clang/test/CAS/cas-backend.c +++ b/clang/test/CAS/cas-backend.c @@ -1,4 +1,3 @@ -// REQUIRES: mccas // RUN: rm -rf %t && mkdir -p %t // RUN: llvm-cas --cas %t/cas --ingest %s > %t/casid // diff --git a/clang/test/CAS/cas-emit-casid.c b/clang/test/CAS/cas-emit-casid.c index 3b1811592d3ad..e5598a161d923 100644 --- a/clang/test/CAS/cas-emit-casid.c +++ b/clang/test/CAS/cas-emit-casid.c @@ -1,4 +1,4 @@ -// REQUIRES: aarch64-registered-target && mccas +// REQUIRES: aarch64-registered-target // RUN: rm -rf %t && mkdir -p %t // RUN: %clang -target arm64-apple-macosx12.0.0 -c -Xclang -fcas-backend -Xclang -fcas-path -Xclang %t/cas -Xclang -fcas-backend-mode=native -Xclang -fcas-emit-casid-file %s -o %t/test.o // RUN: cat %t/test.o.casid | FileCheck %s --check-prefix=NATIVE_FILENAME diff --git a/clang/test/CAS/depscan-update-mccas.c b/clang/test/CAS/depscan-update-mccas.c index 4b16f758bcdc3..c9cd52c67f6eb 100644 --- a/clang/test/CAS/depscan-update-mccas.c +++ b/clang/test/CAS/depscan-update-mccas.c @@ -1,4 +1,3 @@ -// REQUIRES: mccas // RUN: %clang -cc1depscan -o - -cc1-args -cc1 -triple \ // RUN: x86_64-apple-darwin10 -debug-info-kind=standalone -dwarf-version=4 \ // RUN: -debugger-tuning=lldb -emit-obj -fcas-backend -fcas-path %t/cas \ diff --git a/clang/test/CAS/remote-cache-incompatible-options.c b/clang/test/CAS/remote-cache-incompatible-options.c index 61c4fc4a1b197..b15a3c98b18f6 100644 --- a/clang/test/CAS/remote-cache-incompatible-options.c +++ b/clang/test/CAS/remote-cache-incompatible-options.c @@ -1,4 +1,3 @@ -// REQUIRES: mccas // RUN: not %clang_cc1 -triple x86_64-apple-macos11 -fcompilation-caching-service-path %t -fcas-backend -fcasid-output -emit-obj %s -o %t.o 2>&1 | FileCheck %s // CHECK: error: '-fcas-backend' is incompatible with remote caching backend // CHECK: error: '-fcasid-output' is incompatible with remote caching backend diff --git a/clang/test/CMakeLists.txt b/clang/test/CMakeLists.txt index 474edafb4f52c..6230a51bc5db2 100644 --- a/clang/test/CMakeLists.txt +++ b/clang/test/CMakeLists.txt @@ -150,13 +150,6 @@ if(LLVM_INCLUDE_SPIRV_TOOLS_TESTS) ) endif() -if (LLVM_ENABLE_MCCAS) - set(MCCAS_DEPS - llvm-cas-object-format - llvm-cas-dump - ) -endif() - if( NOT CLANG_BUILT_STANDALONE ) list(APPEND CLANG_TEST_DEPS llvm-config @@ -167,7 +160,7 @@ if( NOT CLANG_BUILT_STANDALONE ) llvm-as llvm-bcanalyzer llvm-cas - ${MCCAS_DEPS} + llvm-cas-dump llvm-cat llvm-cxxfilt llvm-dis diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt index bd4dcc1ae431e..a86818204dd52 100644 --- a/llvm/CMakeLists.txt +++ b/llvm/CMakeLists.txt @@ -907,7 +907,6 @@ option(LLVM_CAS_ENABLE_REMOTE_CACHE "Build remote CAS service" OFF) if(LLVM_CAS_ENABLE_REMOTE_CACHE) include(FindGRPC) endif() -option(LLVM_ENABLE_MCCAS "Build MCCAS backend" OFF) set(LLVM_INSTALL_DOXYGEN_HTML_DIR "${CMAKE_INSTALL_DOCDIR}/llvm/doxygen-html" CACHE STRING "Doxygen-generated HTML documentation install directory") diff --git a/llvm/lib/CMakeLists.txt b/llvm/lib/CMakeLists.txt index d9c387a8a65c9..080c435e98cf9 100644 --- a/llvm/lib/CMakeLists.txt +++ b/llvm/lib/CMakeLists.txt @@ -25,9 +25,7 @@ add_subdirectory(Linker) add_subdirectory(Analysis) add_subdirectory(LTO) add_subdirectory(MC) -if (LLVM_ENABLE_MCCAS) - add_subdirectory(MCCAS) -endif() +add_subdirectory(MCCAS) add_subdirectory(MCA) add_subdirectory(ObjCopy) add_subdirectory(Object) diff --git a/llvm/lib/CodeGen/CMakeLists.txt b/llvm/lib/CodeGen/CMakeLists.txt index a47b482e748ac..f3c33db6a3fac 100644 --- a/llvm/lib/CodeGen/CMakeLists.txt +++ b/llvm/lib/CodeGen/CMakeLists.txt @@ -1,10 +1,3 @@ -if (LLVM_ENABLE_MCCAS) - add_definitions(-DLLVM_ENABLE_MCCAS=1) - set(MCCAS_DEPS - MCCAS - ) -endif() - if (DEFINED LLVM_HAVE_TF_AOT OR LLVM_HAVE_TFLITE) include(TensorFlowCompile) set(LLVM_RAEVICT_MODEL_PATH_DEFAULT "models/regalloc-eviction") @@ -286,7 +279,7 @@ add_llvm_component_library(LLVMCodeGen Core MC ObjCARC - ${MCCAS_DEPS} + MCCAS ProfileData Scalar Support diff --git a/llvm/lib/CodeGen/CodeGenTargetMachineImpl.cpp b/llvm/lib/CodeGen/CodeGenTargetMachineImpl.cpp index 3584a2ccc1a26..03aa2b84e1a5b 100644 --- a/llvm/lib/CodeGen/CodeGenTargetMachineImpl.cpp +++ b/llvm/lib/CodeGen/CodeGenTargetMachineImpl.cpp @@ -23,20 +23,18 @@ #include "llvm/MC/MCContext.h" #include "llvm/MC/MCInstPrinter.h" #include "llvm/MC/MCInstrInfo.h" +#include "llvm/MC/MCMachOCASWriter.h" #include "llvm/MC/MCObjectWriter.h" #include "llvm/MC/MCRegisterInfo.h" #include "llvm/MC/MCStreamer.h" #include "llvm/MC/MCSubtargetInfo.h" #include "llvm/MC/TargetRegistry.h" +#include "llvm/MCCAS/MCCASObjectV1.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/FormattedStream.h" #include "llvm/Target/RegisterTargetPassConfigCallback.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetOptions.h" -#if LLVM_ENABLE_MCCAS -#include "llvm/MC/MCMachOCASWriter.h" -#include "llvm/MCCAS/MCCASObjectV1.h" -#endif using namespace llvm; static cl::opt @@ -210,9 +208,7 @@ CodeGenTargetMachineImpl::createMCStreamer(raw_pwrite_stream &Out, inconvertibleErrorCode()); Triple T(getTargetTriple()); -#if LLVM_ENABLE_MCCAS // BEGIN MCCAS - bool UseCASBackend = Options.UseCASBackend; std::unique_ptr CASBackendWriter; if (Options.UseCASBackend) { std::function CASBackendWriter; -#endif // END MCCAS AsmStreamer.reset(getTarget().createMCObjectStreamer( T, Context, std::unique_ptr(MAB), - UseCASBackend ? std::move(CASBackendWriter) // MCCAS + Options.UseCASBackend ? std::move(CASBackendWriter) // MCCAS : DwoOut ? MAB->createDwoObjectWriter(Out, *DwoOut) : MAB->createObjectWriter(Out), std::unique_ptr(MCE), STI)); diff --git a/llvm/lib/MC/CMakeLists.txt b/llvm/lib/MC/CMakeLists.txt index 10d2e69f2dc24..b8927601a1994 100644 --- a/llvm/lib/MC/CMakeLists.txt +++ b/llvm/lib/MC/CMakeLists.txt @@ -1,7 +1,3 @@ -if (LLVM_ENABLE_MCCAS) - add_definitions(-DLLVM_ENABLE_MCCAS=1) -endif() - add_llvm_component_library(LLVMMC ConstantPools.cpp DXContainerPSVInfo.cpp diff --git a/llvm/lib/MC/MachOCASWriter.cpp b/llvm/lib/MC/MachOCASWriter.cpp index 23d8cd341bd80..921cddfa06539 100644 --- a/llvm/lib/MC/MachOCASWriter.cpp +++ b/llvm/lib/MC/MachOCASWriter.cpp @@ -23,6 +23,8 @@ #include "llvm/MC/MCSymbol.h" #include "llvm/MC/MCSymbolMachO.h" #include "llvm/MC/MCValue.h" +#include "llvm/MCCAS/MCCASFormatSchemaBase.h" +#include "llvm/MCCAS/MCCASObjectV1.h" #include "llvm/Support/Alignment.h" #include "llvm/Support/Allocator.h" #include "llvm/Support/Casting.h" @@ -31,10 +33,6 @@ #include "llvm/Support/raw_ostream.h" #include -#if LLVM_ENABLE_MCCAS -#include "llvm/MCCAS/MCCASFormatSchemaBase.h" -#include "llvm/MCCAS/MCCASObjectV1.h" - using namespace llvm; using namespace llvm::cas; using namespace llvm::mccasformats; @@ -124,19 +122,3 @@ std::unique_ptr llvm::createMachOCASWriter( std::move(MOTW), TT, CAS, Mode, OS, IsLittleEndian, CreateFromMcAssembler, SerializeObjectFile, ResultCallBack, CasIDOS); } -#else -std::unique_ptr llvm::createMachOCASWriter( - std::unique_ptr MOTW, const Triple &TT, - cas::ObjectStore &CAS, CASBackendMode Mode, raw_pwrite_stream &OS, - bool IsLittleEndian, - std::function - CreateFromMcAssembler, - std::function - SerializeObjectFile, - std::optional ResultCallBack, - raw_pwrite_stream *CasIDOS) { - llvm_unreachable("unsupported"); -} -#endif diff --git a/llvm/test/CAS/emit-casid-file.ll b/llvm/test/CAS/emit-casid-file.ll index 7be885edee5c8..7c262cd84385b 100644 --- a/llvm/test/CAS/emit-casid-file.ll +++ b/llvm/test/CAS/emit-casid-file.ll @@ -24,7 +24,7 @@ ; RUN: llc -O0 -cas-friendly-debug-info --filetype=obj --cas-backend --cas=%t/cas --mccas-casid %s --mccas-emit-casid-file -o - ; RUN: not cat %t/test.o.casid -; REQUIRES: aarch64-registered-target && mccas +; REQUIRES: aarch64-registered-target ; ModuleID = '/Users/shubham/Development/test109275485/a.cpp' source_filename = "/Users/shubham/Development/test109275485/a.cpp" diff --git a/llvm/test/CMakeLists.txt b/llvm/test/CMakeLists.txt index e0d5c2538976f..fc576f9693ff0 100644 --- a/llvm/test/CMakeLists.txt +++ b/llvm/test/CMakeLists.txt @@ -27,7 +27,6 @@ llvm_canonicalize_cmake_booleans( LLVM_INCLUDE_DXIL_TESTS LLVM_ENABLE_ONDISK_CAS LLVM_CAS_ENABLE_REMOTE_CACHE - LLVM_ENABLE_MCCAS LLVM_TOOL_LLVM_DRIVER_BUILD LLVM_INCLUDE_SPIRV_SIMULATOR_TESTS LLVM_INCLUDE_SPIRV_TOOLS_TESTS @@ -61,13 +60,6 @@ configure_lit_site_cfg( "SHLIBDIR" ) -if (LLVM_ENABLE_MCCAS) - set(MCCAS_DEPS - llvm-cas-object-format - llvm-cas-dump - ) -endif() - # Set the depends list as a variable so that it can grow conditionally. # NOTE: Sync the substitutions in test/lit.cfg when adding to this list. set(LLVM_TEST_DEPENDS @@ -88,7 +80,8 @@ set(LLVM_TEST_DEPENDS llvm-bitcode-strip llvm-c-test llvm-cas - ${MCCAS_DEPS} + llvm-cas-dump + llvm-cas-object-format llvm-cas-test llvm-cat llvm-cfi-verify diff --git a/llvm/test/DebugInfo/CAS/AArch64/lit.local.cfg b/llvm/test/DebugInfo/CAS/AArch64/lit.local.cfg index 49c5885fcf191..102671146a4ae 100644 --- a/llvm/test/DebugInfo/CAS/AArch64/lit.local.cfg +++ b/llvm/test/DebugInfo/CAS/AArch64/lit.local.cfg @@ -1,4 +1,2 @@ if not "AArch64" in config.root.targets: - config.unsupported = True -if not config.have_mccas: - config.unsupported = True + config.unsupported = True \ No newline at end of file diff --git a/llvm/test/MC/CAS/lit.local.cfg b/llvm/test/MC/CAS/lit.local.cfg index 0928c4be89f1d..379945b68925d 100644 --- a/llvm/test/MC/CAS/lit.local.cfg +++ b/llvm/test/MC/CAS/lit.local.cfg @@ -1,4 +1,2 @@ if not config.have_ondisk_cas: config.unsupported = True -if not config.have_mccas: - config.unsupported = True diff --git a/llvm/test/lit.cfg.py b/llvm/test/lit.cfg.py index 118564ab93a14..bd74f6147df52 100644 --- a/llvm/test/lit.cfg.py +++ b/llvm/test/lit.cfg.py @@ -706,9 +706,6 @@ def host_unwind_supports_jit(): if config.have_ondisk_cas: config.available_features.add('ondisk_cas') -if config.have_mccas: - config.available_features.add('mccas') - if "MemoryWithOrigins" in config.llvm_use_sanitizer: config.available_features.add("use_msan_with_origins") diff --git a/llvm/test/lit.site.cfg.py.in b/llvm/test/lit.site.cfg.py.in index 08295a8dac5ec..e47dd77fbfa98 100644 --- a/llvm/test/lit.site.cfg.py.in +++ b/llvm/test/lit.site.cfg.py.in @@ -63,7 +63,6 @@ config.reverse_iteration = @LLVM_ENABLE_REVERSE_ITERATION@ config.dxil_tests = @LLVM_INCLUDE_DXIL_TESTS@ config.have_ondisk_cas = @LLVM_ENABLE_ONDISK_CAS@ config.enable_remote_cache = @LLVM_CAS_ENABLE_REMOTE_CACHE@ -config.have_mccas = @LLVM_ENABLE_MCCAS@ config.have_llvm_driver = @LLVM_TOOL_LLVM_DRIVER_BUILD@ config.spirv_tools_tests = @LLVM_INCLUDE_SPIRV_TOOLS_TESTS@ config.have_vc_rev = @LLVM_APPEND_VC_REV@ diff --git a/llvm/test/tools/llvm-cas-dump/lit.local.cfg b/llvm/test/tools/llvm-cas-dump/lit.local.cfg deleted file mode 100644 index d3b98db1f755a..0000000000000 --- a/llvm/test/tools/llvm-cas-dump/lit.local.cfg +++ /dev/null @@ -1,2 +0,0 @@ -if not config.have_mccas: - config.unsupported = True diff --git a/llvm/test/tools/llvm-cas-object-format/lit.local.cfg b/llvm/test/tools/llvm-cas-object-format/lit.local.cfg deleted file mode 100644 index d3b98db1f755a..0000000000000 --- a/llvm/test/tools/llvm-cas-object-format/lit.local.cfg +++ /dev/null @@ -1,2 +0,0 @@ -if not config.have_mccas: - config.unsupported = True diff --git a/llvm/test/tools/llvm-cas/ingest-blobs-casid.test b/llvm/test/tools/llvm-cas/ingest-blobs-casid.test index bbac4269e1b48..b3ee24b89f00b 100644 --- a/llvm/test/tools/llvm-cas/ingest-blobs-casid.test +++ b/llvm/test/tools/llvm-cas/ingest-blobs-casid.test @@ -1,4 +1,4 @@ -; REQUIRES: aarch64-registered-target && mccas +; REQUIRES: aarch64-registered-target ; RUN: rm -rf %t && mkdir -p %t ; RUN: split-file %s %t diff --git a/llvm/tools/CMakeLists.txt b/llvm/tools/CMakeLists.txt index 385d177d2f0f7..73d4993194ece 100644 --- a/llvm/tools/CMakeLists.txt +++ b/llvm/tools/CMakeLists.txt @@ -40,18 +40,12 @@ add_llvm_tool_subdirectory(llvm-config) add_llvm_tool_subdirectory(llvm-ctxprof-util) add_llvm_tool_subdirectory(llvm-lto) add_llvm_tool_subdirectory(llvm-profdata) +add_llvm_tool_subdirectory(llvm-cas-dump) if(LLVM_CAS_ENABLE_REMOTE_CACHE) add_llvm_tool_subdirectory(llvm-remote-cache-test) else() set(LLVM_TOOL_LLVM_REMOTE_CACHE_TEST_BUILD Off) endif() -if(LLVM_ENABLE_MCCAS) - add_llvm_tool_subdirectory(llvm-cas-object-format) - add_llvm_tool_subdirectory(llvm-cas-dump) -else() - set(LLVM_TOOL_LLVM_CAS_OBJECT_FORMAT_BUILD Off) - set(LLVM_TOOL_LLVM_CAS_DUMP_BUILD Off) -endif() # Projects supported via LLVM_EXTERNAL_*_SOURCE_DIR need to be explicitly # specified. diff --git a/llvm/tools/llvm-mc/CMakeLists.txt b/llvm/tools/llvm-mc/CMakeLists.txt index 70004ceb4d4bf..55d8d9a779f59 100644 --- a/llvm/tools/llvm-mc/CMakeLists.txt +++ b/llvm/tools/llvm-mc/CMakeLists.txt @@ -1,10 +1,3 @@ -if (LLVM_ENABLE_MCCAS) - add_definitions(-DLLVM_ENABLE_MCCAS=1) - set(LLVM_LINK_MCCAS - MCCAS - ) -endif() - set(LLVM_LINK_COMPONENTS AllTargetsAsmParsers AllTargetsDescs @@ -12,7 +5,7 @@ set(LLVM_LINK_COMPONENTS AllTargetsInfos CAS MC - ${LLVM_LINK_MCCAS} + MCCAS MCParser Support TargetParser diff --git a/llvm/tools/llvm-mc/llvm-mc.cpp b/llvm/tools/llvm-mc/llvm-mc.cpp index 56feb139a8888..2c5bad9d6aeea 100644 --- a/llvm/tools/llvm-mc/llvm-mc.cpp +++ b/llvm/tools/llvm-mc/llvm-mc.cpp @@ -31,9 +31,7 @@ #include "llvm/MC/MCSubtargetInfo.h" #include "llvm/MC/MCTargetOptionsCommandFlags.h" #include "llvm/MC/TargetRegistry.h" -#if LLVM_ENABLE_MCCAS #include "llvm/MCCAS/MCCASObjectV1.h" -#endif #include "llvm/Support/CommandLine.h" #include "llvm/Support/Compression.h" #include "llvm/Support/FileUtilities.h" @@ -681,7 +679,6 @@ int main(int argc, char **argv) { MCCodeEmitter *CE = TheTarget->createMCCodeEmitter(*MCII, Ctx); MCAsmBackend *MAB = TheTarget->createMCAsmBackend(*STI, *MRI, MCOptions); -#if LLVM_ENABLE_MCCAS // BEGIN MCCAS std::unique_ptr CASBackendWriter; bool UseCASBackend = UseMCCASBackend || @@ -712,10 +709,6 @@ int main(int argc, char **argv) { CasIDOS ? &CasIDOS->os() : nullptr); } // END MCCAS -#else - bool UseCASBackend = false; - std::unique_ptr CASBackendWriter; -#endif Str.reset(TheTarget->createMCObjectStreamer( TheTriple, Ctx, std::unique_ptr(MAB), UseCASBackend ? std::move(CASBackendWriter) // MCCAS From d77c802d2a9202c1652e91f2171757fcb29cd55a Mon Sep 17 00:00:00 2001 From: Shubham Sandeep Rastogi Date: Thu, 24 Jul 2025 18:25:38 -0700 Subject: [PATCH 02/29] WIP fix MCCAS from MaskRay MC changes, remove obsolete fragment types from MCCASObjectV1.def --- llvm/include/llvm/MCCAS/MCCASObjectV1.def | 7 ------- 1 file changed, 7 deletions(-) diff --git a/llvm/include/llvm/MCCAS/MCCASObjectV1.def b/llvm/include/llvm/MCCAS/MCCASObjectV1.def index df630e851dd35..076ed1e2e409e 100644 --- a/llvm/include/llvm/MCCAS/MCCASObjectV1.def +++ b/llvm/include/llvm/MCCAS/MCCASObjectV1.def @@ -72,23 +72,16 @@ CASV1_SIMPLE_GROUP_REF(DIEDedupeTopLevelRef, mc:debug_DIE_Dedupe_top_level) #ifdef MCFRAGMENT_NODE_REF #ifndef MCFRAGMENT_ENCODED_FRAGMENT_ONLY -MCFRAGMENT_NODE_REF(MCAlignFragment, FT_Align, mc:align) MCFRAGMENT_NODE_REF(MCBoundaryAlignFragment, FT_BoundaryAlign, mc:boundary_align) MCFRAGMENT_NODE_REF(MCCVInlineLineTableFragment, FT_CVInlineLines, mc:cv_inline_lines) MCFRAGMENT_NODE_REF(MCFillFragment, FT_Fill, mc:fill) -MCFRAGMENT_NODE_REF(MCLEBFragment, FT_LEB, mc:leb) MCFRAGMENT_NODE_REF(MCNopsFragment, FT_Nops, mc:nops) MCFRAGMENT_NODE_REF(MCOrgFragment, FT_Org, mc:org) MCFRAGMENT_NODE_REF(MCSymbolIdFragment, FT_SymbolId, mc:symbol_id) #endif /* MCFRAGMENT_ENCODED_FRAGMENT_ONLY */ #undef MCFRAGMENT_ENCODED_FRAGMENT_ONLY -MCFRAGMENT_NODE_REF(MCDataFragment, FT_Data, mc:data) -MCFRAGMENT_NODE_REF(MCRelaxableFragment, FT_Relaxable, mc:relaxable) -MCFRAGMENT_NODE_REF(MCDwarfLineAddrFragment, FT_Dwarf, mc:dwarf) -MCFRAGMENT_NODE_REF(MCDwarfCallFrameFragment, FT_DwarfFrame, mc:dwarf_frame) MCFRAGMENT_NODE_REF(MCCVDefRangeFragment, FT_CVDefRange, mc:cv_def_range) -MCFRAGMENT_NODE_REF(MCPseudoProbeAddrFragment, FT_PseudoProbe, mc:presudo_pro) #undef MCFRAGMENT_NODE_REF #endif /* MCFRAGMENT_NODE_REF */ From 79adaf5c3f47742d597dd839d3522b25d8d0f6dd Mon Sep 17 00:00:00 2001 From: Shubham Sandeep Rastogi Date: Thu, 24 Jul 2025 18:52:19 -0700 Subject: [PATCH 03/29] WIP MCCAS MaskRay Fix, fix MCRelaxableFragment --- llvm/lib/MCCAS/MCCASObjectV1.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/llvm/lib/MCCAS/MCCASObjectV1.cpp b/llvm/lib/MCCAS/MCCASObjectV1.cpp index 0d4861d4a5f94..41f1087df4e45 100644 --- a/llvm/lib/MCCAS/MCCASObjectV1.cpp +++ b/llvm/lib/MCCAS/MCCASObjectV1.cpp @@ -2127,9 +2127,6 @@ MCCASBuilder::mergeMCFragmentContents(const MCSection *Section, for (const MCFragment &Fragment : *Section) { if (const auto *DataFragment = dyn_cast(&Fragment)) llvm::append_range(mergedData, DataFragment->getContents()); - else if (const auto *RelaxableFragment = - dyn_cast(&Fragment)) - llvm::append_range(mergedData, RelaxableFragment->getContents()); else if (const auto *DwarfLineAddrFrag = dyn_cast(&Fragment)) if (IsDebugLineSection) @@ -2157,7 +2154,9 @@ MCCASBuilder::mergeMCFragmentContents(const MCSection *Section, raw_svector_ostream OS(mergedData); if (auto E = writeAlignFragment(*this, *AlignFragment, OS, FragmentSize)) return std::move(E); - } else + } else if (Fragment.getFixedSize() != 0) + llvm::append_range(mergedData, Fragment.getContents()); + else // All other fragment types can be considered empty, see // getFragmentContents() for all fragments that have contents. continue; From c00daef3fbf12eb57be8eb351fb5442f1ad96291 Mon Sep 17 00:00:00 2001 From: Shubham Sandeep Rastogi Date: Thu, 24 Jul 2025 18:53:53 -0700 Subject: [PATCH 04/29] WIP MCCAS MaskRay Fix, fix MCDwarfCallFrameFragment --- llvm/lib/MCCAS/MCCASObjectV1.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/llvm/lib/MCCAS/MCCASObjectV1.cpp b/llvm/lib/MCCAS/MCCASObjectV1.cpp index 41f1087df4e45..3eaff67034e92 100644 --- a/llvm/lib/MCCAS/MCCASObjectV1.cpp +++ b/llvm/lib/MCCAS/MCCASObjectV1.cpp @@ -2135,9 +2135,6 @@ MCCASBuilder::mergeMCFragmentContents(const MCSection *Section, return createStringError( inconvertibleErrorCode(), "Invalid MCDwarfLineAddrFragment in a non debug line section"); - else if (const auto *DwarfCallFrameFragment = - dyn_cast(&Fragment)) - llvm::append_range(mergedData, DwarfCallFrameFragment->getContents()); else if (const auto *CVDefRangeFragment = dyn_cast(&Fragment)) llvm::append_range(mergedData, CVDefRangeFragment->getContents()); From 50c5933f0af986cc3bed27f70f31d02f4ecd9a73 Mon Sep 17 00:00:00 2001 From: Shubham Sandeep Rastogi Date: Thu, 24 Jul 2025 18:59:52 -0700 Subject: [PATCH 05/29] WIP MCCAS MaskRay Fix, fix MCPseudoProbeFragment --- llvm/lib/MCCAS/MCCASObjectV1.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/llvm/lib/MCCAS/MCCASObjectV1.cpp b/llvm/lib/MCCAS/MCCASObjectV1.cpp index 3eaff67034e92..8586d843bffae 100644 --- a/llvm/lib/MCCAS/MCCASObjectV1.cpp +++ b/llvm/lib/MCCAS/MCCASObjectV1.cpp @@ -2138,9 +2138,6 @@ MCCASBuilder::mergeMCFragmentContents(const MCSection *Section, else if (const auto *CVDefRangeFragment = dyn_cast(&Fragment)) llvm::append_range(mergedData, CVDefRangeFragment->getContents()); - else if (const auto *PseudoProbeAddrFragment = - dyn_cast(&Fragment)) - llvm::append_range(mergedData, PseudoProbeAddrFragment->getContents()); else if (const auto *LEBFragment = dyn_cast(&Fragment)) llvm::append_range(mergedData, LEBFragment->getContents()); else if (const auto *CVInlineLineTableFragment = From cf745f96d5773fb4d8dc7cc2d912910dd1e5e4ff Mon Sep 17 00:00:00 2001 From: Shubham Sandeep Rastogi Date: Thu, 24 Jul 2025 19:02:20 -0700 Subject: [PATCH 06/29] WIP MCCAS MaskRay Fix, fix MCLEBFragment --- llvm/lib/MCCAS/MCCASObjectV1.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/llvm/lib/MCCAS/MCCASObjectV1.cpp b/llvm/lib/MCCAS/MCCASObjectV1.cpp index 8586d843bffae..222a8cee6dee9 100644 --- a/llvm/lib/MCCAS/MCCASObjectV1.cpp +++ b/llvm/lib/MCCAS/MCCASObjectV1.cpp @@ -2138,8 +2138,6 @@ MCCASBuilder::mergeMCFragmentContents(const MCSection *Section, else if (const auto *CVDefRangeFragment = dyn_cast(&Fragment)) llvm::append_range(mergedData, CVDefRangeFragment->getContents()); - else if (const auto *LEBFragment = dyn_cast(&Fragment)) - llvm::append_range(mergedData, LEBFragment->getContents()); else if (const auto *CVInlineLineTableFragment = dyn_cast(&Fragment)) llvm::append_range(mergedData, CVInlineLineTableFragment->getContents()); From 0b16ed9b657c2cedfc268dfcb117fa41954c1d86 Mon Sep 17 00:00:00 2001 From: Shubham Sandeep Rastogi Date: Thu, 24 Jul 2025 19:43:31 -0700 Subject: [PATCH 07/29] WIP MCCAS MaskRay Fix, fix MCDwarfLineAddrFragment --- llvm/lib/MCCAS/MCCASObjectV1.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/llvm/lib/MCCAS/MCCASObjectV1.cpp b/llvm/lib/MCCAS/MCCASObjectV1.cpp index 222a8cee6dee9..05fe5601b5645 100644 --- a/llvm/lib/MCCAS/MCCASObjectV1.cpp +++ b/llvm/lib/MCCAS/MCCASObjectV1.cpp @@ -2127,14 +2127,13 @@ MCCASBuilder::mergeMCFragmentContents(const MCSection *Section, for (const MCFragment &Fragment : *Section) { if (const auto *DataFragment = dyn_cast(&Fragment)) llvm::append_range(mergedData, DataFragment->getContents()); - else if (const auto *DwarfLineAddrFrag = - dyn_cast(&Fragment)) + else if (Fragment.getKind() == MCFragment::FT_Dwarf) if (IsDebugLineSection) - llvm::append_range(mergedData, DwarfLineAddrFrag->getContents()); + llvm::append_range(mergedData, Fragment.getContents()); else return createStringError( inconvertibleErrorCode(), - "Invalid MCDwarfLineAddrFragment in a non debug line section"); + "Invalid MCFragment::FT_Dwarf type in a non debug line section"); else if (const auto *CVDefRangeFragment = dyn_cast(&Fragment)) llvm::append_range(mergedData, CVDefRangeFragment->getContents()); From 6b49396339bcf18416480ed242b6b790c2c014ee Mon Sep 17 00:00:00 2001 From: Shubham Sandeep Rastogi Date: Thu, 24 Jul 2025 20:09:37 -0700 Subject: [PATCH 08/29] WIP MCCAS MaskRay Fix, do some work for MCAlignFragment --- llvm/lib/MCCAS/MCCASObjectV1.cpp | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/llvm/lib/MCCAS/MCCASObjectV1.cpp b/llvm/lib/MCCAS/MCCASObjectV1.cpp index 05fe5601b5645..1c4db3f2630e4 100644 --- a/llvm/lib/MCCAS/MCCASObjectV1.cpp +++ b/llvm/lib/MCCAS/MCCASObjectV1.cpp @@ -1919,11 +1919,10 @@ Error MCDataFragmentMerger::tryMerge(const MCFragment &F, unsigned Size, return Error::success(); } -static Error writeAlignFragment(MCCASBuilder &Builder, - const MCAlignFragment &AF, raw_ostream &OS, - unsigned FragmentSize) { - uint64_t Count = FragmentSize / AF.getFillLen(); - if (AF.hasEmitNops()) { +static Error writeAlignFragment(MCCASBuilder &Builder, const MCFragment &AF, + raw_ostream &OS, unsigned FragmentSize) { + uint64_t Count = FragmentSize / AF.getAlignFillLen(); + if (AF.hasAlignEmitNops()) { if (!Builder.Asm.getBackend().writeNopData(OS, Count, AF.getSubtargetInfo())) return createStringError(inconvertibleErrorCode(), @@ -1934,20 +1933,20 @@ static Error writeAlignFragment(MCCASBuilder &Builder, auto Endian = Builder.ObjectWriter.Target.isLittleEndian() ? endianness::little : endianness::big; for (uint64_t I = 0; I != Count; ++I) { - switch (AF.getFillLen()) { + switch (AF.getAlignFillLen()) { default: llvm_unreachable("Invalid size!"); case 1: - OS << char(AF.getFill()); + OS << char(AF.getAlignFill()); break; case 2: - support::endian::write(OS, AF.getFill(), Endian); + support::endian::write(OS, AF.getAlignFill(), Endian); break; case 4: - support::endian::write(OS, AF.getFill(), Endian); + support::endian::write(OS, AF.getAlignFill(), Endian); break; case 8: - support::endian::write(OS, AF.getFill(), Endian); + support::endian::write(OS, AF.getAlignFill(), Endian); break; } } @@ -2140,10 +2139,10 @@ MCCASBuilder::mergeMCFragmentContents(const MCSection *Section, else if (const auto *CVInlineLineTableFragment = dyn_cast(&Fragment)) llvm::append_range(mergedData, CVInlineLineTableFragment->getContents()); - else if (const auto *AlignFragment = dyn_cast(&Fragment)) { + else if (Fragment.getKind() == MCFragment::FT_Align) { auto FragmentSize = Asm.computeFragmentSize(Fragment); raw_svector_ostream OS(mergedData); - if (auto E = writeAlignFragment(*this, *AlignFragment, OS, FragmentSize)) + if (auto E = writeAlignFragment(*this, Fragment, OS, FragmentSize)) return std::move(E); } else if (Fragment.getFixedSize() != 0) llvm::append_range(mergedData, Fragment.getContents()); From 707de7218843cedef1affc8325f45ccd6a137e71 Mon Sep 17 00:00:00 2001 From: Shubham Sandeep Rastogi Date: Thu, 24 Jul 2025 20:16:32 -0700 Subject: [PATCH 09/29] WIP MCCAS MaskRay Fix, Fix some stuff for MCDataFragment --- llvm/lib/MCCAS/MCCASObjectV1.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/llvm/lib/MCCAS/MCCASObjectV1.cpp b/llvm/lib/MCCAS/MCCASObjectV1.cpp index 1c4db3f2630e4..6becd8e7eab6a 100644 --- a/llvm/lib/MCCAS/MCCASObjectV1.cpp +++ b/llvm/lib/MCCAS/MCCASObjectV1.cpp @@ -2124,9 +2124,7 @@ MCCASBuilder::mergeMCFragmentContents(const MCSection *Section, bool IsDebugLineSection) { SmallVector mergedData; for (const MCFragment &Fragment : *Section) { - if (const auto *DataFragment = dyn_cast(&Fragment)) - llvm::append_range(mergedData, DataFragment->getContents()); - else if (Fragment.getKind() == MCFragment::FT_Dwarf) + if (Fragment.getKind() == MCFragment::FT_Dwarf) if (IsDebugLineSection) llvm::append_range(mergedData, Fragment.getContents()); else From 108957762ee4332e60c330996b8b88978b131931 Mon Sep 17 00:00:00 2001 From: Shubham Sandeep Rastogi Date: Thu, 24 Jul 2025 20:19:07 -0700 Subject: [PATCH 10/29] WIP MCCAS MaskRay Fix, Fix some more stuff for MCDataFragment --- llvm/lib/MCCAS/MCCASObjectV1.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/lib/MCCAS/MCCASObjectV1.cpp b/llvm/lib/MCCAS/MCCASObjectV1.cpp index 6becd8e7eab6a..b4a272aaa5d54 100644 --- a/llvm/lib/MCCAS/MCCASObjectV1.cpp +++ b/llvm/lib/MCCAS/MCCASObjectV1.cpp @@ -2595,7 +2595,7 @@ Expected> MCCASBuilder::createDebugStringRefs() { SmallVector DebugStringRefs; ArrayRef DebugStrData = - cast(*DwarfSections.Str->begin()).getContents(); + cast(*DwarfSections.Str->begin()).getContents(); StringRef S(DebugStrData.data(), DebugStrData.size()); if (auto E = createStringSection(S, [&](StringRef S) -> Error { auto Sym = DebugStrRef::create(*this, S); From 1182f9b4cb79b5608bea94a2d1bae723ddfd607c Mon Sep 17 00:00:00 2001 From: Shubham Sandeep Rastogi Date: Thu, 24 Jul 2025 20:23:05 -0700 Subject: [PATCH 11/29] WIP MCCAS MaskRayFix, Replace isVirtualSection with isBssSection --- llvm/lib/MCCAS/MCCASObjectV1.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/lib/MCCAS/MCCASObjectV1.cpp b/llvm/lib/MCCAS/MCCASObjectV1.cpp index b4a272aaa5d54..2a06f50eddbce 100644 --- a/llvm/lib/MCCAS/MCCASObjectV1.cpp +++ b/llvm/lib/MCCAS/MCCASObjectV1.cpp @@ -2947,7 +2947,7 @@ Error MCCASBuilder::buildFragments() { startGroup(); for (const MCSection &Sec : Asm) { - if (Sec.isVirtualSection()) + if (Sec.isBssSection()) continue; // Handle Debug Info sections separately. From e2119b24161c08d8e81d0ebadd866a9bd538010f Mon Sep 17 00:00:00 2001 From: Shubham Sandeep Rastogi Date: Thu, 24 Jul 2025 20:24:17 -0700 Subject: [PATCH 12/29] WIP MCCAS MaskRay Fix, Change isa to F.getKind() == MCFragment::FT_Align --- llvm/lib/MCCAS/MCCASObjectV1.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/lib/MCCAS/MCCASObjectV1.cpp b/llvm/lib/MCCAS/MCCASObjectV1.cpp index 2a06f50eddbce..b2f868ecaffdd 100644 --- a/llvm/lib/MCCAS/MCCASObjectV1.cpp +++ b/llvm/lib/MCCAS/MCCASObjectV1.cpp @@ -1887,7 +1887,7 @@ Error MCDataFragmentMerger::tryMerge(const MCFragment &F, unsigned Size, bool Oversized = CurrentSize + Size > MCDataMergeThreshold; // TODO: Try merge align fragment? bool IsMergeableFragment = - isa(F) || isa(F); + isa(F) || F.getKind() == MCFragment::FT_Align; // If not the same atom, flush merge candidate and return false. if (!IsSameAtom || !IsMergeableFragment || Oversized) { if (auto E = emitMergedFragments()) From 8834a8a067dc2ed8961b23587d70fbca1ae745ca Mon Sep 17 00:00:00 2001 From: Shubham Sandeep Rastogi Date: Thu, 24 Jul 2025 20:29:53 -0700 Subject: [PATCH 13/29] WIP MCCAS MaskRay Fix, some more work for MCAlignFragment --- llvm/lib/MCCAS/MCCASObjectV1.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/llvm/lib/MCCAS/MCCASObjectV1.cpp b/llvm/lib/MCCAS/MCCASObjectV1.cpp index b2f868ecaffdd..2a0c5d8502333 100644 --- a/llvm/lib/MCCAS/MCCASObjectV1.cpp +++ b/llvm/lib/MCCAS/MCCASObjectV1.cpp @@ -1978,9 +1978,8 @@ Error MCDataFragmentMerger::emitMergedFragments() { #define MCFRAGMENT_ENCODED_FRAGMENT_ONLY #include "llvm/MCCAS/MCCASObjectV1.def" case MCFragment::FT_Align: { - const MCAlignFragment *AF = cast(Candidate.first); - if (auto E = - writeAlignFragment(Builder, *AF, FragmentOS, Candidate.second)) + if (auto E = writeAlignFragment(Builder, *Candidate.first, FragmentOS, + Candidate.second)) return E; break; } From 9dbbf284489fe83c8c1e11eb564665e86ef76487 Mon Sep 17 00:00:00 2001 From: Shubham Sandeep Rastogi Date: Thu, 24 Jul 2025 20:37:59 -0700 Subject: [PATCH 14/29] MCCAS MaskRay Fix, a little more MCLEBFragment fix --- llvm/lib/MCCAS/MCCASObjectV1.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/llvm/lib/MCCAS/MCCASObjectV1.cpp b/llvm/lib/MCCAS/MCCASObjectV1.cpp index 2a0c5d8502333..f0e6168f30110 100644 --- a/llvm/lib/MCCAS/MCCASObjectV1.cpp +++ b/llvm/lib/MCCAS/MCCASObjectV1.cpp @@ -2861,8 +2861,7 @@ static ArrayRef getFragmentContents(const MCFragment &Fragment) { return SF.getContents(); } case MCFragment::FT_LEB: { - const MCLEBFragment &SF = cast(Fragment); - return SF.getContents(); + return Fragment.getContents(); } default: return ArrayRef(); From 4b0281f30a75366ddf3bc8eb291220c71d1dc2a4 Mon Sep 17 00:00:00 2001 From: Shubham Sandeep Rastogi Date: Thu, 24 Jul 2025 21:30:45 -0700 Subject: [PATCH 15/29] WIP MCCAS MaskRay Fix, fixed bug with no more classof function in MCEncodedFragment --- llvm/lib/MCCAS/MCCASObjectV1.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/llvm/lib/MCCAS/MCCASObjectV1.cpp b/llvm/lib/MCCAS/MCCASObjectV1.cpp index f0e6168f30110..e62aa66f2d871 100644 --- a/llvm/lib/MCCAS/MCCASObjectV1.cpp +++ b/llvm/lib/MCCAS/MCCASObjectV1.cpp @@ -1557,7 +1557,8 @@ MCAlignFragmentRef::create(MCCASBuilder &MB, const MCAlignFragment &F, } Expected MCAlignFragmentRef::materialize(MCCASReader &Reader, - raw_ostream *Stream) const { + raw_ostream *Stream) const + { uint64_t Count; auto Remaining = getData(); auto Endian = Reader.getEndian(); @@ -1887,7 +1888,7 @@ Error MCDataFragmentMerger::tryMerge(const MCFragment &F, unsigned Size, bool Oversized = CurrentSize + Size > MCDataMergeThreshold; // TODO: Try merge align fragment? bool IsMergeableFragment = - isa(F) || F.getKind() == MCFragment::FT_Align; + F.isEncoded() || F.getKind() == MCFragment::FT_Align; // If not the same atom, flush merge candidate and return false. if (!IsSameAtom || !IsMergeableFragment || Oversized) { if (auto E = emitMergedFragments()) From a5bc9173afb504c22332c6e9137307ed38e6858d Mon Sep 17 00:00:00 2001 From: Shubham Sandeep Rastogi Date: Thu, 24 Jul 2025 23:52:40 -0700 Subject: [PATCH 16/29] WIP fix MCCAS, builds but round trip verification error due to FragType not staying the same after materialization, does it not get saved? --- llvm/include/llvm/MCCAS/MCCASObjectV1.def | 1 + llvm/include/llvm/MCCAS/MCCASObjectV1.h | 57 ++++++++++ llvm/lib/MCCAS/MCCASObjectV1.cpp | 122 ++++++++++++++++++---- 3 files changed, 160 insertions(+), 20 deletions(-) diff --git a/llvm/include/llvm/MCCAS/MCCASObjectV1.def b/llvm/include/llvm/MCCAS/MCCASObjectV1.def index 076ed1e2e409e..5e7667ad8a713 100644 --- a/llvm/include/llvm/MCCAS/MCCASObjectV1.def +++ b/llvm/include/llvm/MCCAS/MCCASObjectV1.def @@ -85,3 +85,4 @@ MCFRAGMENT_NODE_REF(MCCVDefRangeFragment, FT_CVDefRange, mc:cv_def_range) #undef MCFRAGMENT_NODE_REF #endif /* MCFRAGMENT_NODE_REF */ + diff --git a/llvm/include/llvm/MCCAS/MCCASObjectV1.h b/llvm/include/llvm/MCCAS/MCCASObjectV1.h index 6cce778a8e803..fef193b38aeb8 100644 --- a/llvm/include/llvm/MCCAS/MCCASObjectV1.h +++ b/llvm/include/llvm/MCCAS/MCCASObjectV1.h @@ -418,6 +418,63 @@ class SpecificRef : public MCObjectProxy { }; #include "llvm/MCCAS/MCCASObjectV1.def" +class MCGenericFragmentRef : public SpecificRef { + using SpecificRefT = SpecificRef; + friend class SpecificRef; + +public: + MCGenericFragmentRef(SpecificRefT ST, MCFragment::FragmentType FragType) + : SpecificRef(ST), FragType(FragType) {} + MCFragment::FragmentType FragType; + static constexpr StringLiteral KindString = "mc:generic_fragment"; + static Expected create(MCCASBuilder &MB, + const MCFragment &Fragment, + unsigned FragmentSize, + ArrayRef FragmentContents); + static Expected get(Expected Ref, + MCFragment::FragmentType FragType) { + auto Specific = SpecificRefT::getSpecific(std::move(Ref)); + if (!Specific) + return Specific.takeError(); + return MCGenericFragmentRef(*Specific, FragType); + } + static Expected get(const MCSchema &Schema, + cas::ObjectRef ID, + MCFragment::FragmentType FragType) { + return get(Schema.get(ID), FragType); + } + static std::optional Cast(MCObjectProxy Ref) { + auto Specific = SpecificRefT::Cast(Ref); + if (!Specific) + return std::nullopt; + return MCGenericFragmentRef(*Specific); + } + Expected materialize(const MCFragment::FragmentType FragType, + MCCASReader &Reader, + raw_ostream *Stream) const; + + static Expected + createGenericAlignFragmentRef(MCCASBuilder &MB, const MCFragment &F, + unsigned FragmentSize, + ArrayRef FragmentContents); + + static Expected + createGenericLEBFragmentRef(MCCASBuilder &MB, const MCFragment &F, + unsigned FragmentSize, + ArrayRef FragmentContents); + + Expected + materializeGenericAlignFragmentRef(MCCASReader &Reader, + raw_ostream *Stream) const; + + Expected + materializeGenericLEBFragmentRef(MCCASReader &Reader, + raw_ostream *Stream) const; + +private: + explicit MCGenericFragmentRef(SpecificRefT Ref) : SpecificRefT(Ref) {} +}; + class PaddingRef : public SpecificRef { using SpecificRefT = SpecificRef; friend class SpecificRef; diff --git a/llvm/lib/MCCAS/MCCASObjectV1.cpp b/llvm/lib/MCCAS/MCCASObjectV1.cpp index e62aa66f2d871..9859af495f35c 100644 --- a/llvm/lib/MCCAS/MCCASObjectV1.cpp +++ b/llvm/lib/MCCAS/MCCASObjectV1.cpp @@ -48,6 +48,7 @@ constexpr StringLiteral PaddingRef::KindString; #define MCFRAGMENT_NODE_REF(MCFragmentName, MCEnumName, MCEnumIdentifier) \ constexpr StringLiteral MCFragmentName##Ref::KindString; #include "llvm/MCCAS/MCCASObjectV1.def" +constexpr StringLiteral MCGenericFragmentRef::KindString; constexpr StringLiteral DebugInfoSectionRef::KindString; void MCSchema::anchor() {} @@ -172,6 +173,7 @@ Error MCSchema::fillCache() { PaddingRef::KindString, MCAssemblerRef::KindString, DebugInfoSectionRef::KindString, + MCGenericFragmentRef::KindString, #define CASV1_SIMPLE_DATA_REF(RefName, IdentifierName) RefName::KindString, #define CASV1_SIMPLE_GROUP_REF(RefName, IdentifierName) RefName::KindString, #define MCFRAGMENT_NODE_REF(MCFragmentName, MCEnumName, MCEnumIdentifier) \ @@ -1531,16 +1533,16 @@ Expected AtomRef::materialize(MCCASReader &Reader, return Size; } -Expected -MCAlignFragmentRef::create(MCCASBuilder &MB, const MCAlignFragment &F, - unsigned FragmentSize, - ArrayRef FragmentContents) { +Expected +MCGenericFragmentRef::createGenericAlignFragmentRef( + MCCASBuilder &MB, const MCFragment &F, unsigned FragmentSize, + ArrayRef FragmentContents) { Expected B = Builder::startNode(MB.Schema, KindString); if (!B) return B.takeError(); - uint64_t Count = FragmentSize / F.getFillLen(); - if (F.hasEmitNops()) { + uint64_t Count = FragmentSize / F.getAlignFillLen(); + if (F.hasAlignEmitNops()) { // Write 0 as size and use backend to emit nop. writeVBR8(0, B->Data); if (!MB.Asm.getBackend().writeNopData(MB.FragmentOS, Count, @@ -1548,17 +1550,16 @@ MCAlignFragmentRef::create(MCCASBuilder &MB, const MCAlignFragment &F, report_fatal_error("unable to write nop sequence of " + Twine(Count) + " bytes"); B->Data.append(MB.FragmentData); - return get(B->build()); + return get(B->build(), MCFragment::FT_Align); } writeVBR8(Count, B->Data); - writeVBR8(F.getFill(), B->Data); - writeVBR8(F.getFillLen(), B->Data); - return get(B->build()); + writeVBR8(F.getAlignFill(), B->Data); + writeVBR8(F.getAlignFillLen(), B->Data); + return get(B->build(), MCFragment::FT_Align); } -Expected MCAlignFragmentRef::materialize(MCCASReader &Reader, - raw_ostream *Stream) const - { +Expected MCGenericFragmentRef::materializeGenericAlignFragmentRef( + MCCASReader &Reader, raw_ostream *Stream) const { uint64_t Count; auto Remaining = getData(); auto Endian = Reader.getEndian(); @@ -1686,23 +1687,76 @@ Expected MCFillFragmentRef::materialize(MCCASReader &Reader, return Size; } -Expected -MCLEBFragmentRef::create(MCCASBuilder &MB, const MCLEBFragment &F, - unsigned FragmentSize, - ArrayRef FragmentContents) { +Expected +MCGenericFragmentRef::createGenericLEBFragmentRef( + MCCASBuilder &MB, const MCFragment &F, unsigned FragmentSize, + ArrayRef FragmentContents) { Expected B = Builder::startNode(MB.Schema, KindString); if (!B) return B.takeError(); llvm::append_range(B->Data, F.getContents()); - return get(B->build()); + return get(B->build(), MCFragment::FT_LEB); } -Expected MCLEBFragmentRef::materialize(MCCASReader &Reader, - raw_ostream *Stream) const { +Expected MCGenericFragmentRef::materializeGenericLEBFragmentRef( + MCCASReader &Reader, raw_ostream *Stream) const { *Stream << getData(); return getData().size(); } +Expected +MCGenericFragmentRef::create(MCCASBuilder &MB, const MCFragment &Fragment, + unsigned int FragmentSize, + ArrayRef FragmentContents) { + auto FragType = Fragment.getKind(); + switch (FragType) { + case MCFragment::FT_Align: + return createGenericAlignFragmentRef(MB, Fragment, FragmentSize, + FragmentContents); + case MCFragment::FT_LEB: + return createGenericLEBFragmentRef(MB, Fragment, FragmentSize, + FragmentContents); + case MCFragment::FT_Relaxable: + case MCFragment::FT_Data: + case MCFragment::FT_Dwarf: + case MCFragment::FT_DwarfFrame: { + Expected B = Builder::startNode(MB.Schema, KindString); + if (!B) + return B.takeError(); + B->Data.append(MB.FragmentData); + B->Data.append(FragmentContents.begin(), FragmentContents.end()); + assert(((MB.FragmentData.empty() && Fragment.getContents().empty()) || + (MB.FragmentData.size() + Fragment.getContents().size() == + FragmentSize)) && + "Size should match"); + return get(B->build(), FragType); + } + default: + llvm_unreachable("Other Fragment Kinds should be handled elsewhere!"); + } +} + +Expected +MCGenericFragmentRef::materialize(const MCFragment::FragmentType FragType, + MCCASReader &Reader, + raw_ostream *Stream) const { + switch (FragType) { + case MCFragment::FT_Align: + return materializeGenericAlignFragmentRef(Reader, Stream); + case MCFragment::FT_LEB: + return materializeGenericLEBFragmentRef(Reader, Stream); + case MCFragment::FT_Relaxable: + case MCFragment::FT_Data: + case MCFragment::FT_Dwarf: + case MCFragment::FT_DwarfFrame: { + *Stream << getData(); + return getData().size(); + } + default: + llvm_unreachable("Other Fragment Kinds should be handled elsewhere!"); + } +} + Expected MCNopsFragmentRef::create(MCCASBuilder &MB, const MCNopsFragment &F, unsigned FragmentSize, @@ -1858,6 +1912,18 @@ Error MCCASBuilder::buildFragment(const MCFragment &F, unsigned Size, return Error::success(); \ } #include "llvm/MCCAS/MCCASObjectV1.def" + case MCFragment::FT_Relaxable: + case MCFragment::FT_Data: + case MCFragment::FT_Align: + case MCFragment::FT_Dwarf: + case MCFragment::FT_DwarfFrame: + case MCFragment::FT_LEB: { + auto GF = MCGenericFragmentRef::create(*this, F, Size, FragmentContents); + if (!GF) + return GF.takeError(); + addNode(*GF); + return Error::success(); + } } llvm_unreachable("unknown fragment"); } @@ -1984,6 +2050,14 @@ Error MCDataFragmentMerger::emitMergedFragments() { return E; break; } + case MCFragment::FT_Relaxable: + case MCFragment::FT_Data: + case MCFragment::FT_Dwarf: + case MCFragment::FT_DwarfFrame: + case MCFragment::FT_LEB: { + FragmentData.append(CandidateContents); + break; + } default: llvm_unreachable("other framgents should not be added"); } @@ -2861,6 +2935,11 @@ static ArrayRef getFragmentContents(const MCFragment &Fragment) { cast(Fragment); return SF.getContents(); } + case MCFragment::FT_Relaxable: + case MCFragment::FT_Data: + case MCFragment::FT_Align: + case MCFragment::FT_Dwarf: + case MCFragment::FT_DwarfFrame: case MCFragment::FT_LEB: { return Fragment.getContents(); } @@ -3602,6 +3681,9 @@ Expected MCCASReader::materializeAtom(cas::ObjectRef ID, return F->materialize(*Stream); if (auto F = MergedFragmentRef::Cast(*Node)) return F->materialize(*Stream); + if (auto F = MCGenericFragmentRef::Cast(*Node)) { + return F->materialize(F->FragType, *this, Stream); + } return createStringError(inconvertibleErrorCode(), "unsupported CAS node for fragment"); From 9564339a77b2279e6aed30a5db8558f61065037a Mon Sep 17 00:00:00 2001 From: Shubham Sandeep Rastogi Date: Fri, 25 Jul 2025 00:16:05 -0700 Subject: [PATCH 17/29] Revert "WIP fix MCCAS, builds but round trip verification error due to FragType not staying the same after materialization, does it not get saved?" This reverts commit 36becd86d27634b5dcfde104a98e4a67f6a80cd0. --- llvm/include/llvm/MCCAS/MCCASObjectV1.def | 1 - llvm/include/llvm/MCCAS/MCCASObjectV1.h | 57 ---------- llvm/lib/MCCAS/MCCASObjectV1.cpp | 122 ++++------------------ 3 files changed, 20 insertions(+), 160 deletions(-) diff --git a/llvm/include/llvm/MCCAS/MCCASObjectV1.def b/llvm/include/llvm/MCCAS/MCCASObjectV1.def index 5e7667ad8a713..076ed1e2e409e 100644 --- a/llvm/include/llvm/MCCAS/MCCASObjectV1.def +++ b/llvm/include/llvm/MCCAS/MCCASObjectV1.def @@ -85,4 +85,3 @@ MCFRAGMENT_NODE_REF(MCCVDefRangeFragment, FT_CVDefRange, mc:cv_def_range) #undef MCFRAGMENT_NODE_REF #endif /* MCFRAGMENT_NODE_REF */ - diff --git a/llvm/include/llvm/MCCAS/MCCASObjectV1.h b/llvm/include/llvm/MCCAS/MCCASObjectV1.h index fef193b38aeb8..6cce778a8e803 100644 --- a/llvm/include/llvm/MCCAS/MCCASObjectV1.h +++ b/llvm/include/llvm/MCCAS/MCCASObjectV1.h @@ -418,63 +418,6 @@ class SpecificRef : public MCObjectProxy { }; #include "llvm/MCCAS/MCCASObjectV1.def" -class MCGenericFragmentRef : public SpecificRef { - using SpecificRefT = SpecificRef; - friend class SpecificRef; - -public: - MCGenericFragmentRef(SpecificRefT ST, MCFragment::FragmentType FragType) - : SpecificRef(ST), FragType(FragType) {} - MCFragment::FragmentType FragType; - static constexpr StringLiteral KindString = "mc:generic_fragment"; - static Expected create(MCCASBuilder &MB, - const MCFragment &Fragment, - unsigned FragmentSize, - ArrayRef FragmentContents); - static Expected get(Expected Ref, - MCFragment::FragmentType FragType) { - auto Specific = SpecificRefT::getSpecific(std::move(Ref)); - if (!Specific) - return Specific.takeError(); - return MCGenericFragmentRef(*Specific, FragType); - } - static Expected get(const MCSchema &Schema, - cas::ObjectRef ID, - MCFragment::FragmentType FragType) { - return get(Schema.get(ID), FragType); - } - static std::optional Cast(MCObjectProxy Ref) { - auto Specific = SpecificRefT::Cast(Ref); - if (!Specific) - return std::nullopt; - return MCGenericFragmentRef(*Specific); - } - Expected materialize(const MCFragment::FragmentType FragType, - MCCASReader &Reader, - raw_ostream *Stream) const; - - static Expected - createGenericAlignFragmentRef(MCCASBuilder &MB, const MCFragment &F, - unsigned FragmentSize, - ArrayRef FragmentContents); - - static Expected - createGenericLEBFragmentRef(MCCASBuilder &MB, const MCFragment &F, - unsigned FragmentSize, - ArrayRef FragmentContents); - - Expected - materializeGenericAlignFragmentRef(MCCASReader &Reader, - raw_ostream *Stream) const; - - Expected - materializeGenericLEBFragmentRef(MCCASReader &Reader, - raw_ostream *Stream) const; - -private: - explicit MCGenericFragmentRef(SpecificRefT Ref) : SpecificRefT(Ref) {} -}; - class PaddingRef : public SpecificRef { using SpecificRefT = SpecificRef; friend class SpecificRef; diff --git a/llvm/lib/MCCAS/MCCASObjectV1.cpp b/llvm/lib/MCCAS/MCCASObjectV1.cpp index 9859af495f35c..e62aa66f2d871 100644 --- a/llvm/lib/MCCAS/MCCASObjectV1.cpp +++ b/llvm/lib/MCCAS/MCCASObjectV1.cpp @@ -48,7 +48,6 @@ constexpr StringLiteral PaddingRef::KindString; #define MCFRAGMENT_NODE_REF(MCFragmentName, MCEnumName, MCEnumIdentifier) \ constexpr StringLiteral MCFragmentName##Ref::KindString; #include "llvm/MCCAS/MCCASObjectV1.def" -constexpr StringLiteral MCGenericFragmentRef::KindString; constexpr StringLiteral DebugInfoSectionRef::KindString; void MCSchema::anchor() {} @@ -173,7 +172,6 @@ Error MCSchema::fillCache() { PaddingRef::KindString, MCAssemblerRef::KindString, DebugInfoSectionRef::KindString, - MCGenericFragmentRef::KindString, #define CASV1_SIMPLE_DATA_REF(RefName, IdentifierName) RefName::KindString, #define CASV1_SIMPLE_GROUP_REF(RefName, IdentifierName) RefName::KindString, #define MCFRAGMENT_NODE_REF(MCFragmentName, MCEnumName, MCEnumIdentifier) \ @@ -1533,16 +1531,16 @@ Expected AtomRef::materialize(MCCASReader &Reader, return Size; } -Expected -MCGenericFragmentRef::createGenericAlignFragmentRef( - MCCASBuilder &MB, const MCFragment &F, unsigned FragmentSize, - ArrayRef FragmentContents) { +Expected +MCAlignFragmentRef::create(MCCASBuilder &MB, const MCAlignFragment &F, + unsigned FragmentSize, + ArrayRef FragmentContents) { Expected B = Builder::startNode(MB.Schema, KindString); if (!B) return B.takeError(); - uint64_t Count = FragmentSize / F.getAlignFillLen(); - if (F.hasAlignEmitNops()) { + uint64_t Count = FragmentSize / F.getFillLen(); + if (F.hasEmitNops()) { // Write 0 as size and use backend to emit nop. writeVBR8(0, B->Data); if (!MB.Asm.getBackend().writeNopData(MB.FragmentOS, Count, @@ -1550,16 +1548,17 @@ MCGenericFragmentRef::createGenericAlignFragmentRef( report_fatal_error("unable to write nop sequence of " + Twine(Count) + " bytes"); B->Data.append(MB.FragmentData); - return get(B->build(), MCFragment::FT_Align); + return get(B->build()); } writeVBR8(Count, B->Data); - writeVBR8(F.getAlignFill(), B->Data); - writeVBR8(F.getAlignFillLen(), B->Data); - return get(B->build(), MCFragment::FT_Align); + writeVBR8(F.getFill(), B->Data); + writeVBR8(F.getFillLen(), B->Data); + return get(B->build()); } -Expected MCGenericFragmentRef::materializeGenericAlignFragmentRef( - MCCASReader &Reader, raw_ostream *Stream) const { +Expected MCAlignFragmentRef::materialize(MCCASReader &Reader, + raw_ostream *Stream) const + { uint64_t Count; auto Remaining = getData(); auto Endian = Reader.getEndian(); @@ -1687,76 +1686,23 @@ Expected MCFillFragmentRef::materialize(MCCASReader &Reader, return Size; } -Expected -MCGenericFragmentRef::createGenericLEBFragmentRef( - MCCASBuilder &MB, const MCFragment &F, unsigned FragmentSize, - ArrayRef FragmentContents) { +Expected +MCLEBFragmentRef::create(MCCASBuilder &MB, const MCLEBFragment &F, + unsigned FragmentSize, + ArrayRef FragmentContents) { Expected B = Builder::startNode(MB.Schema, KindString); if (!B) return B.takeError(); llvm::append_range(B->Data, F.getContents()); - return get(B->build(), MCFragment::FT_LEB); + return get(B->build()); } -Expected MCGenericFragmentRef::materializeGenericLEBFragmentRef( - MCCASReader &Reader, raw_ostream *Stream) const { +Expected MCLEBFragmentRef::materialize(MCCASReader &Reader, + raw_ostream *Stream) const { *Stream << getData(); return getData().size(); } -Expected -MCGenericFragmentRef::create(MCCASBuilder &MB, const MCFragment &Fragment, - unsigned int FragmentSize, - ArrayRef FragmentContents) { - auto FragType = Fragment.getKind(); - switch (FragType) { - case MCFragment::FT_Align: - return createGenericAlignFragmentRef(MB, Fragment, FragmentSize, - FragmentContents); - case MCFragment::FT_LEB: - return createGenericLEBFragmentRef(MB, Fragment, FragmentSize, - FragmentContents); - case MCFragment::FT_Relaxable: - case MCFragment::FT_Data: - case MCFragment::FT_Dwarf: - case MCFragment::FT_DwarfFrame: { - Expected B = Builder::startNode(MB.Schema, KindString); - if (!B) - return B.takeError(); - B->Data.append(MB.FragmentData); - B->Data.append(FragmentContents.begin(), FragmentContents.end()); - assert(((MB.FragmentData.empty() && Fragment.getContents().empty()) || - (MB.FragmentData.size() + Fragment.getContents().size() == - FragmentSize)) && - "Size should match"); - return get(B->build(), FragType); - } - default: - llvm_unreachable("Other Fragment Kinds should be handled elsewhere!"); - } -} - -Expected -MCGenericFragmentRef::materialize(const MCFragment::FragmentType FragType, - MCCASReader &Reader, - raw_ostream *Stream) const { - switch (FragType) { - case MCFragment::FT_Align: - return materializeGenericAlignFragmentRef(Reader, Stream); - case MCFragment::FT_LEB: - return materializeGenericLEBFragmentRef(Reader, Stream); - case MCFragment::FT_Relaxable: - case MCFragment::FT_Data: - case MCFragment::FT_Dwarf: - case MCFragment::FT_DwarfFrame: { - *Stream << getData(); - return getData().size(); - } - default: - llvm_unreachable("Other Fragment Kinds should be handled elsewhere!"); - } -} - Expected MCNopsFragmentRef::create(MCCASBuilder &MB, const MCNopsFragment &F, unsigned FragmentSize, @@ -1912,18 +1858,6 @@ Error MCCASBuilder::buildFragment(const MCFragment &F, unsigned Size, return Error::success(); \ } #include "llvm/MCCAS/MCCASObjectV1.def" - case MCFragment::FT_Relaxable: - case MCFragment::FT_Data: - case MCFragment::FT_Align: - case MCFragment::FT_Dwarf: - case MCFragment::FT_DwarfFrame: - case MCFragment::FT_LEB: { - auto GF = MCGenericFragmentRef::create(*this, F, Size, FragmentContents); - if (!GF) - return GF.takeError(); - addNode(*GF); - return Error::success(); - } } llvm_unreachable("unknown fragment"); } @@ -2050,14 +1984,6 @@ Error MCDataFragmentMerger::emitMergedFragments() { return E; break; } - case MCFragment::FT_Relaxable: - case MCFragment::FT_Data: - case MCFragment::FT_Dwarf: - case MCFragment::FT_DwarfFrame: - case MCFragment::FT_LEB: { - FragmentData.append(CandidateContents); - break; - } default: llvm_unreachable("other framgents should not be added"); } @@ -2935,11 +2861,6 @@ static ArrayRef getFragmentContents(const MCFragment &Fragment) { cast(Fragment); return SF.getContents(); } - case MCFragment::FT_Relaxable: - case MCFragment::FT_Data: - case MCFragment::FT_Align: - case MCFragment::FT_Dwarf: - case MCFragment::FT_DwarfFrame: case MCFragment::FT_LEB: { return Fragment.getContents(); } @@ -3681,9 +3602,6 @@ Expected MCCASReader::materializeAtom(cas::ObjectRef ID, return F->materialize(*Stream); if (auto F = MergedFragmentRef::Cast(*Node)) return F->materialize(*Stream); - if (auto F = MCGenericFragmentRef::Cast(*Node)) { - return F->materialize(F->FragType, *this, Stream); - } return createStringError(inconvertibleErrorCode(), "unsupported CAS node for fragment"); From c2427d80b353be9f2310279b057a671543fcc643 Mon Sep 17 00:00:00 2001 From: Shubham Sandeep Rastogi Date: Fri, 25 Jul 2025 04:04:01 -0700 Subject: [PATCH 18/29] WIP MCCAS MaskRay Fix, works for small cpp file but not on bootstrap build --- llvm/include/llvm/MCCAS/MCCASObjectV1.def | 6 +++ llvm/include/llvm/MCCAS/MCCASObjectV1.h | 4 +- llvm/lib/MCCAS/MCCASObjectV1.cpp | 61 ++++++++++++----------- 3 files changed, 41 insertions(+), 30 deletions(-) diff --git a/llvm/include/llvm/MCCAS/MCCASObjectV1.def b/llvm/include/llvm/MCCAS/MCCASObjectV1.def index 076ed1e2e409e..aab14eda7012f 100644 --- a/llvm/include/llvm/MCCAS/MCCASObjectV1.def +++ b/llvm/include/llvm/MCCAS/MCCASObjectV1.def @@ -72,15 +72,21 @@ CASV1_SIMPLE_GROUP_REF(DIEDedupeTopLevelRef, mc:debug_DIE_Dedupe_top_level) #ifdef MCFRAGMENT_NODE_REF #ifndef MCFRAGMENT_ENCODED_FRAGMENT_ONLY +MCFRAGMENT_NODE_REF(MCAlignFragment, FT_Align, mc:align) MCFRAGMENT_NODE_REF(MCBoundaryAlignFragment, FT_BoundaryAlign, mc:boundary_align) MCFRAGMENT_NODE_REF(MCCVInlineLineTableFragment, FT_CVInlineLines, mc:cv_inline_lines) MCFRAGMENT_NODE_REF(MCFillFragment, FT_Fill, mc:fill) +MCFRAGMENT_NODE_REF(MCLEBFragment, FT_LEB, mc:leb) MCFRAGMENT_NODE_REF(MCNopsFragment, FT_Nops, mc:nops) MCFRAGMENT_NODE_REF(MCOrgFragment, FT_Org, mc:org) MCFRAGMENT_NODE_REF(MCSymbolIdFragment, FT_SymbolId, mc:symbol_id) #endif /* MCFRAGMENT_ENCODED_FRAGMENT_ONLY */ #undef MCFRAGMENT_ENCODED_FRAGMENT_ONLY +MCFRAGMENT_NODE_REF(MCDataFragment, FT_Data, mc:data) +MCFRAGMENT_NODE_REF(MCRelaxableFragment, FT_Relaxable, mc:relaxable) +MCFRAGMENT_NODE_REF(MCDwarfLineAddrFragment, FT_Dwarf, mc:dwarf) +MCFRAGMENT_NODE_REF(MCDwarfCallFrameFragment, FT_DwarfFrame, mc:dwarf_frame) MCFRAGMENT_NODE_REF(MCCVDefRangeFragment, FT_CVDefRange, mc:cv_def_range) #undef MCFRAGMENT_NODE_REF diff --git a/llvm/include/llvm/MCCAS/MCCASObjectV1.h b/llvm/include/llvm/MCCAS/MCCASObjectV1.h index 6cce778a8e803..2aaf858ebd247 100644 --- a/llvm/include/llvm/MCCAS/MCCASObjectV1.h +++ b/llvm/include/llvm/MCCAS/MCCASObjectV1.h @@ -392,7 +392,7 @@ class SpecificRef : public MCObjectProxy { public: \ static constexpr StringLiteral KindString = #MCEnumIdentifier; \ static Expected \ - create(MCCASBuilder &MB, const MCFragmentName &Fragment, \ + create(MCCASBuilder &MB, const MCFragment &Fragment, \ unsigned FragmentSize, ArrayRef FragmentContents); \ static Expected get(Expected Ref) { \ auto Specific = SpecificRefT::getSpecific(std::move(Ref)); \ @@ -404,7 +404,7 @@ class SpecificRef : public MCObjectProxy { cas::ObjectRef ID) { \ return get(Schema.get(ID)); \ } \ - static std::optional Cast(MCObjectProxy Ref) { \ + static std::optional Cast(MCObjectProxy Ref) { \ auto Specific = SpecificRefT::Cast(Ref); \ if (!Specific) \ return std::nullopt; \ diff --git a/llvm/lib/MCCAS/MCCASObjectV1.cpp b/llvm/lib/MCCAS/MCCASObjectV1.cpp index e62aa66f2d871..84e37d12d4b4f 100644 --- a/llvm/lib/MCCAS/MCCASObjectV1.cpp +++ b/llvm/lib/MCCAS/MCCASObjectV1.cpp @@ -1532,15 +1532,15 @@ Expected AtomRef::materialize(MCCASReader &Reader, } Expected -MCAlignFragmentRef::create(MCCASBuilder &MB, const MCAlignFragment &F, +MCAlignFragmentRef::create(MCCASBuilder &MB, const MCFragment &F, unsigned FragmentSize, ArrayRef FragmentContents) { Expected B = Builder::startNode(MB.Schema, KindString); if (!B) return B.takeError(); - uint64_t Count = FragmentSize / F.getFillLen(); - if (F.hasEmitNops()) { + uint64_t Count = FragmentSize / F.getAlignFillLen(); + if (F.hasAlignEmitNops()) { // Write 0 as size and use backend to emit nop. writeVBR8(0, B->Data); if (!MB.Asm.getBackend().writeNopData(MB.FragmentOS, Count, @@ -1551,8 +1551,8 @@ MCAlignFragmentRef::create(MCCASBuilder &MB, const MCAlignFragment &F, return get(B->build()); } writeVBR8(Count, B->Data); - writeVBR8(F.getFill(), B->Data); - writeVBR8(F.getFillLen(), B->Data); + writeVBR8(F.getAlignFill(), B->Data); + writeVBR8(F.getAlignFillLen(), B->Data); return get(B->build()); } @@ -1598,9 +1598,10 @@ Expected MCAlignFragmentRef::materialize(MCCASReader &Reader, return Count * ValueSize; } -Expected MCBoundaryAlignFragmentRef::create( - MCCASBuilder &MB, const MCBoundaryAlignFragment &F, unsigned FragmentSize, - ArrayRef FragmentContents) { +Expected +MCBoundaryAlignFragmentRef::create(MCCASBuilder &MB, const MCFragment &F, + unsigned FragmentSize, + ArrayRef FragmentContents) { Expected B = Builder::startNode(MB.Schema, KindString); if (!B) return B.takeError(); @@ -1619,9 +1620,10 @@ MCBoundaryAlignFragmentRef::materialize(MCCASReader &Reader, return getData().size(); } -Expected MCCVInlineLineTableFragmentRef::create( - MCCASBuilder &MB, const MCCVInlineLineTableFragment &F, - unsigned FragmentSize, ArrayRef FragmentContents) { +Expected +MCCVInlineLineTableFragmentRef::create(MCCASBuilder &MB, const MCFragment &F, + unsigned FragmentSize, + ArrayRef FragmentContents) { Expected B = Builder::startNode(MB.Schema, KindString); if (!B) return B.takeError(); @@ -1637,15 +1639,16 @@ MCCVInlineLineTableFragmentRef::materialize(MCCASReader &Reader, } Expected -MCFillFragmentRef::create(MCCASBuilder &MB, const MCFillFragment &F, +MCFillFragmentRef::create(MCCASBuilder &MB, const MCFragment &F, unsigned FragmentSize, ArrayRef FragmentContents) { + auto *FillFrag = dyn_cast(&F); Expected B = Builder::startNode(MB.Schema, KindString); if (!B) return B.takeError(); writeVBR8(FragmentSize, B->Data); - writeVBR8(F.getValue(), B->Data); - writeVBR8(F.getValueSize(), B->Data); + writeVBR8(FillFrag->getValue(), B->Data); + writeVBR8(FillFrag->getValueSize(), B->Data); return get(B->build()); } @@ -1687,7 +1690,7 @@ Expected MCFillFragmentRef::materialize(MCCASReader &Reader, } Expected -MCLEBFragmentRef::create(MCCASBuilder &MB, const MCLEBFragment &F, +MCLEBFragmentRef::create(MCCASBuilder &MB, const MCFragment &F, unsigned FragmentSize, ArrayRef FragmentContents) { Expected B = Builder::startNode(MB.Schema, KindString); @@ -1704,14 +1707,15 @@ Expected MCLEBFragmentRef::materialize(MCCASReader &Reader, } Expected -MCNopsFragmentRef::create(MCCASBuilder &MB, const MCNopsFragment &F, +MCNopsFragmentRef::create(MCCASBuilder &MB, const MCFragment &F, unsigned FragmentSize, ArrayRef FragmentContents) { + auto *NopsFrag = dyn_cast(&F); Expected B = Builder::startNode(MB.Schema, KindString); if (!B) return B.takeError(); - int64_t NumBytes = F.getNumBytes(); - int64_t ControlledNopLength = F.getControlledNopLength(); + int64_t NumBytes = NopsFrag->getNumBytes(); + int64_t ControlledNopLength = NopsFrag->getControlledNopLength(); int64_t MaximumNopLength = MB.Asm.getBackend().getMaximumNopSize(*F.getSubtargetInfo()); if (ControlledNopLength > MaximumNopLength) @@ -1740,14 +1744,15 @@ Expected MCNopsFragmentRef::materialize(MCCASReader &Reader, } Expected -MCOrgFragmentRef::create(MCCASBuilder &MB, const MCOrgFragment &F, +MCOrgFragmentRef::create(MCCASBuilder &MB, const MCFragment &F, unsigned FragmentSize, ArrayRef FragmentContents) { + auto *OrgFrag = dyn_cast(&F); Expected B = Builder::startNode(MB.Schema, KindString); if (!B) return B.takeError(); writeVBR8(FragmentSize, B->Data); - writeVBR8((char)F.getValue(), B->Data); + writeVBR8((char)OrgFrag->getValue(), B->Data); return get(B->build()); } @@ -1758,13 +1763,14 @@ Expected MCOrgFragmentRef::materialize(MCCASReader &Reader, } Expected -MCSymbolIdFragmentRef::create(MCCASBuilder &MB, const MCSymbolIdFragment &F, +MCSymbolIdFragmentRef::create(MCCASBuilder &MB, const MCFragment &F, unsigned FragmentSize, ArrayRef FragmentContents) { + auto *SymbolIDFrag = dyn_cast(&F); Expected B = Builder::startNode(MB.Schema, KindString); if (!B) return B.takeError(); - writeVBR8(F.getSymbol()->getIndex(), B->Data); + writeVBR8(SymbolIDFrag->getSymbol()->getIndex(), B->Data); return get(B->build()); } @@ -1777,7 +1783,7 @@ MCSymbolIdFragmentRef::materialize(MCCASReader &Reader, #define MCFRAGMENT_NODE_REF(MCFragmentName, MCEnumName, MCEnumIdentifier) \ Expected MCFragmentName##Ref::create( \ - MCCASBuilder &MB, const MCFragmentName &F, unsigned FragmentSize, \ + MCCASBuilder &MB, const MCFragment &F, unsigned FragmentSize, \ ArrayRef FragmentContents) { \ Expected B = Builder::startNode(MB.Schema, KindString); \ if (!B) \ @@ -1850,8 +1856,7 @@ Error MCCASBuilder::buildFragment(const MCFragment &F, unsigned Size, switch (F.getKind()) { #define MCFRAGMENT_NODE_REF(MCFragmentName, MCEnumName, MCEnumIdentifier) \ case MCFragment::MCEnumName: { \ - const MCFragmentName &SF = cast(F); \ - auto FN = MCFragmentName##Ref::create(*this, SF, Size, FragmentContents); \ + auto FN = MCFragmentName##Ref::create(*this, F, Size, FragmentContents); \ if (!FN) \ return FN.takeError(); \ addNode(*FN); \ @@ -1922,7 +1927,8 @@ Error MCDataFragmentMerger::tryMerge(const MCFragment &F, unsigned Size, static Error writeAlignFragment(MCCASBuilder &Builder, const MCFragment &AF, raw_ostream &OS, unsigned FragmentSize) { - uint64_t Count = FragmentSize / AF.getAlignFillLen(); + OS << StringRef(AF.getContents().data(), AF.getContents().size()); + uint64_t Count = (FragmentSize - AF.getFixedSize()) / AF.getAlignFillLen(); if (AF.hasAlignEmitNops()) { if (!Builder.Asm.getBackend().writeNopData(OS, Count, AF.getSubtargetInfo())) @@ -2851,8 +2857,7 @@ static ArrayRef getFragmentContents(const MCFragment &Fragment) { switch (Fragment.getKind()) { #define MCFRAGMENT_NODE_REF(MCFragmentName, MCEnumName, MCEnumIdentifier) \ case MCFragment::MCEnumName: { \ - const MCFragmentName &SF = cast(Fragment); \ - return SF.getContents(); \ + return Fragment.getContents(); \ } #define MCFRAGMENT_ENCODED_FRAGMENT_ONLY #include "llvm/MCCAS/MCCASObjectV1.def" From 1d653c7fbdeedb199057b9b4651450e92b495f64 Mon Sep 17 00:00:00 2001 From: Shubham Sandeep Rastogi Date: Fri, 25 Jul 2025 10:14:36 -0700 Subject: [PATCH 19/29] Edit MCAlignFragmentRef::create and materialize to match what is there in MCAssembler.cpp writeFragment, FT_Align fragments have data in them now? --- llvm/lib/MCCAS/MCCASObjectV1.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/llvm/lib/MCCAS/MCCASObjectV1.cpp b/llvm/lib/MCCAS/MCCASObjectV1.cpp index 84e37d12d4b4f..b39bdec2d319f 100644 --- a/llvm/lib/MCCAS/MCCASObjectV1.cpp +++ b/llvm/lib/MCCAS/MCCASObjectV1.cpp @@ -1539,7 +1539,9 @@ MCAlignFragmentRef::create(MCCASBuilder &MB, const MCFragment &F, if (!B) return B.takeError(); - uint64_t Count = FragmentSize / F.getAlignFillLen(); + writeVBR8(FragmentContents.size(), B->Data); + B->Data.append(FragmentContents.begin(), FragmentContents.end()); + uint64_t Count = (FragmentSize - F.getFixedSize()) / F.getAlignFillLen(); if (F.hasAlignEmitNops()) { // Write 0 as size and use backend to emit nop. writeVBR8(0, B->Data); @@ -1559,9 +1561,16 @@ MCAlignFragmentRef::create(MCCASBuilder &MB, const MCFragment &F, Expected MCAlignFragmentRef::materialize(MCCASReader &Reader, raw_ostream *Stream) const { - uint64_t Count; + uint64_t Count, FragContentSize; auto Remaining = getData(); auto Endian = Reader.getEndian(); + if (auto E = consumeVBR8(Remaining, FragContentSize)) + return std::move(E); + + *Stream << Remaining.substr(0, FragContentSize); + + Remaining = Remaining.drop_front(FragContentSize); + if (auto E = consumeVBR8(Remaining, Count)) return std::move(E); @@ -2869,6 +2878,9 @@ static ArrayRef getFragmentContents(const MCFragment &Fragment) { case MCFragment::FT_LEB: { return Fragment.getContents(); } + case MCFragment::FT_Align: { + return Fragment.getContents(); + } default: return ArrayRef(); } From ab47e762b067c9896ef6d770ff30f47d979916e4 Mon Sep 17 00:00:00 2001 From: Shubham Sandeep Rastogi Date: Fri, 25 Jul 2025 10:25:03 -0700 Subject: [PATCH 20/29] Fix getFragmentContents to match what we see in MCAssembler.cpp writeFragment --- llvm/lib/MCCAS/MCCASObjectV1.cpp | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/llvm/lib/MCCAS/MCCASObjectV1.cpp b/llvm/lib/MCCAS/MCCASObjectV1.cpp index b39bdec2d319f..726aba7b6dcbd 100644 --- a/llvm/lib/MCCAS/MCCASObjectV1.cpp +++ b/llvm/lib/MCCAS/MCCASObjectV1.cpp @@ -2862,27 +2862,38 @@ Error MCCASBuilder::createAppleObjCSection() { return finalizeSection(); } -static ArrayRef getFragmentContents(const MCFragment &Fragment) { +static void getFragmentContents(const MCFragment &Fragment, + SmallVectorImpl &FragContents) { switch (Fragment.getKind()) { #define MCFRAGMENT_NODE_REF(MCFragmentName, MCEnumName, MCEnumIdentifier) \ case MCFragment::MCEnumName: { \ - return Fragment.getContents(); \ + FragContents.append(Fragment.getContents().begin(), \ + Fragment.getContents().end()); \ + \ + return; \ } #define MCFRAGMENT_ENCODED_FRAGMENT_ONLY #include "llvm/MCCAS/MCCASObjectV1.def" case MCFragment::FT_CVInlineLines: { const MCCVInlineLineTableFragment &SF = cast(Fragment); - return SF.getContents(); + FragContents.append(SF.getContents().begin(), SF.getContents().end()); + return; } case MCFragment::FT_LEB: { - return Fragment.getContents(); + auto FixedContent = Fragment.getContents(); + auto VarContent = Fragment.getVarContents(); + FragContents.append(FixedContent.begin(), FixedContent.end()); + FragContents.append(VarContent.begin(), VarContent.end()); + return; } case MCFragment::FT_Align: { - return Fragment.getContents(); + FragContents.append(Fragment.getContents().begin(), + Fragment.getContents().end()); + return; } default: - return ArrayRef(); + return; } } @@ -2914,7 +2925,8 @@ partitionFragment(MCAssembler &Asm, SmallVector &Addends, ArrayRef RelocationBuffer, const MCFragment &Fragment, uint64_t &RelocationBufferIndex, bool IsLittleEndian) { - auto FragmentContents = getFragmentContents(Fragment); + SmallVector FragmentContents; + getFragmentContents(Fragment, FragmentContents); /// FragmentIndex: It denotes the index into the FragmentContents that is used /// to copy the data that deduplicates in the \p FinalFragmentContents. uint64_t FragmentIndex = 0; From e3ccba2be8af0eccfb668c67831e2b3e1124fb49 Mon Sep 17 00:00:00 2001 From: Shubham Sandeep Rastogi Date: Fri, 25 Jul 2025 10:42:56 -0700 Subject: [PATCH 21/29] Fix MCAlignFragmentRef Size calc --- llvm/lib/MCCAS/MCCASObjectV1.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/llvm/lib/MCCAS/MCCASObjectV1.cpp b/llvm/lib/MCCAS/MCCASObjectV1.cpp index 726aba7b6dcbd..253152fea5c4e 100644 --- a/llvm/lib/MCCAS/MCCASObjectV1.cpp +++ b/llvm/lib/MCCAS/MCCASObjectV1.cpp @@ -1577,7 +1577,7 @@ Expected MCAlignFragmentRef::materialize(MCCASReader &Reader, // hasEmitNops. if (!Count) { *Stream << Remaining; - return Remaining.size(); + return Remaining.size() + FragContentSize; } int64_t Value; unsigned ValueSize; @@ -1604,7 +1604,7 @@ Expected MCAlignFragmentRef::materialize(MCCASReader &Reader, break; } } - return Count * ValueSize; + return (Count * ValueSize) + FragContentSize; } Expected From 4968925487b1b5c32b5d7efc46c15da157295d87 Mon Sep 17 00:00:00 2001 From: Shubham Sandeep Rastogi Date: Thu, 31 Jul 2025 14:44:56 -0700 Subject: [PATCH 22/29] Fix MCCAS, Add variable contents to getFragmentsContents function --- llvm/lib/MCCAS/MCCASObjectV1.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/llvm/lib/MCCAS/MCCASObjectV1.cpp b/llvm/lib/MCCAS/MCCASObjectV1.cpp index 253152fea5c4e..cd9b85ec56466 100644 --- a/llvm/lib/MCCAS/MCCASObjectV1.cpp +++ b/llvm/lib/MCCAS/MCCASObjectV1.cpp @@ -2869,6 +2869,8 @@ static void getFragmentContents(const MCFragment &Fragment, case MCFragment::MCEnumName: { \ FragContents.append(Fragment.getContents().begin(), \ Fragment.getContents().end()); \ + FragContents.append(Fragment.getVarContents().begin(), \ + Fragment.getVarContents().end()); \ \ return; \ } From 72d723f30d2537d998c9d716e3e957ce58e1b49d Mon Sep 17 00:00:00 2001 From: Shubham Sandeep Rastogi Date: Fri, 1 Aug 2025 13:01:16 -0700 Subject: [PATCH 23/29] Fix FT_Align creation and materialization for Nops --- llvm/lib/MCCAS/MCCASObjectV1.cpp | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/llvm/lib/MCCAS/MCCASObjectV1.cpp b/llvm/lib/MCCAS/MCCASObjectV1.cpp index cd9b85ec56466..3455dc5ca3f86 100644 --- a/llvm/lib/MCCAS/MCCASObjectV1.cpp +++ b/llvm/lib/MCCAS/MCCASObjectV1.cpp @@ -1543,8 +1543,8 @@ MCAlignFragmentRef::create(MCCASBuilder &MB, const MCFragment &F, B->Data.append(FragmentContents.begin(), FragmentContents.end()); uint64_t Count = (FragmentSize - F.getFixedSize()) / F.getAlignFillLen(); if (F.hasAlignEmitNops()) { - // Write 0 as size and use backend to emit nop. - writeVBR8(0, B->Data); + // Write 1 to signify that it has nops. + writeVBR8(1, B->Data); if (!MB.Asm.getBackend().writeNopData(MB.FragmentOS, Count, F.getSubtargetInfo())) report_fatal_error("unable to write nop sequence of " + Twine(Count) + @@ -1552,6 +1552,8 @@ MCAlignFragmentRef::create(MCCASBuilder &MB, const MCFragment &F, B->Data.append(MB.FragmentData); return get(B->build()); } + // Write 0 to signify that it has nops. + writeVBR8(0, B->Data); writeVBR8(Count, B->Data); writeVBR8(F.getAlignFill(), B->Data); writeVBR8(F.getAlignFillLen(), B->Data); @@ -1561,7 +1563,7 @@ MCAlignFragmentRef::create(MCCASBuilder &MB, const MCFragment &F, Expected MCAlignFragmentRef::materialize(MCCASReader &Reader, raw_ostream *Stream) const { - uint64_t Count, FragContentSize; + uint64_t Count, FragContentSize, HasNops; auto Remaining = getData(); auto Endian = Reader.getEndian(); if (auto E = consumeVBR8(Remaining, FragContentSize)) @@ -1571,14 +1573,18 @@ Expected MCAlignFragmentRef::materialize(MCCASReader &Reader, Remaining = Remaining.drop_front(FragContentSize); - if (auto E = consumeVBR8(Remaining, Count)) + if (auto E = consumeVBR8(Remaining, HasNops)) return std::move(E); // hasEmitNops. - if (!Count) { + if (HasNops) { *Stream << Remaining; return Remaining.size() + FragContentSize; } + + if (auto E = consumeVBR8(Remaining, Count)) + return std::move(E); + int64_t Value; unsigned ValueSize; if (auto E = consumeVBR8(Remaining, Value)) @@ -2871,7 +2877,6 @@ static void getFragmentContents(const MCFragment &Fragment, Fragment.getContents().end()); \ FragContents.append(Fragment.getVarContents().begin(), \ Fragment.getVarContents().end()); \ - \ return; \ } #define MCFRAGMENT_ENCODED_FRAGMENT_ONLY @@ -2880,13 +2885,14 @@ static void getFragmentContents(const MCFragment &Fragment, const MCCVInlineLineTableFragment &SF = cast(Fragment); FragContents.append(SF.getContents().begin(), SF.getContents().end()); + FragContents.append(SF.getVarContents().begin(), SF.getVarContents().end()); return; } case MCFragment::FT_LEB: { - auto FixedContent = Fragment.getContents(); - auto VarContent = Fragment.getVarContents(); - FragContents.append(FixedContent.begin(), FixedContent.end()); - FragContents.append(VarContent.begin(), VarContent.end()); + FragContents.append(Fragment.getContents().begin(), + Fragment.getContents().end()); + FragContents.append(Fragment.getVarContents().begin(), + Fragment.getVarContents().end()); return; } case MCFragment::FT_Align: { From 54a5fbb27ca69607cfedbf8cc898978c361d888e Mon Sep 17 00:00:00 2001 From: Shubham Sandeep Rastogi Date: Mon, 4 Aug 2025 18:42:27 -0700 Subject: [PATCH 24/29] Make it work after rebase --- llvm/include/llvm/MCCAS/MCCASReader.h | 12 ------------ llvm/lib/MCCAS/MCCASObjectV1.cpp | 10 ++++++++-- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/llvm/include/llvm/MCCAS/MCCASReader.h b/llvm/include/llvm/MCCAS/MCCASReader.h index 161a22fabfd63..bc06165690312 100644 --- a/llvm/include/llvm/MCCAS/MCCASReader.h +++ b/llvm/include/llvm/MCCAS/MCCASReader.h @@ -44,18 +44,6 @@ class MCSectionCAS : public MCSection { public: MCSectionCAS(StringRef Name, SectionKind K); virtual ~MCSectionCAS() {} - - void printSwitchToSection(const MCAsmInfo &MAI, const Triple &T, - raw_ostream &OS, - uint32_t Subsection) const override { - llvm_unreachable("unsupported from CAS"); - } - - bool useCodeAlign() const override { - llvm_unreachable("unsupported from CAS"); - } - - static bool classof(const MCSection *S) { return S->getVariant() == SV_CAS; } }; class MCFragmentCAS : public MCFragment { diff --git a/llvm/lib/MCCAS/MCCASObjectV1.cpp b/llvm/lib/MCCAS/MCCASObjectV1.cpp index 3455dc5ca3f86..3781cde9987ea 100644 --- a/llvm/lib/MCCAS/MCCASObjectV1.cpp +++ b/llvm/lib/MCCAS/MCCASObjectV1.cpp @@ -1907,8 +1907,14 @@ Error MCDataFragmentMerger::tryMerge(const MCFragment &F, unsigned Size, bool IsSameAtom = Builder.getCurrentAtom() == F.getAtom(); bool Oversized = CurrentSize + Size > MCDataMergeThreshold; // TODO: Try merge align fragment? - bool IsMergeableFragment = - F.isEncoded() || F.getKind() == MCFragment::FT_Align; + bool IsMergeableFragment = F.getKind() == MCFragment::FT_Relaxable || + F.getKind() == MCFragment::FT_Data || + F.getKind() == MCFragment::FT_Align || + F.getKind() == MCFragment::FT_Dwarf || + F.getKind() == MCFragment::FT_DwarfFrame || + F.getKind() == MCFragment::FT_LEB || + F.getKind() == MCFragment::FT_CVInlineLines || + F.getKind() == MCFragment::FT_CVDefRange; // If not the same atom, flush merge candidate and return false. if (!IsSameAtom || !IsMergeableFragment || Oversized) { if (auto E = emitMergedFragments()) From 784c95e4b53c3ec31237585f995f6e52c988b186 Mon Sep 17 00:00:00 2001 From: Shubham Sandeep Rastogi Date: Tue, 5 Aug 2025 12:02:49 -0700 Subject: [PATCH 25/29] WIP MCCAS, early exit if Section has no fragments --- llvm/lib/MCCAS/MCCASObjectV1.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/llvm/lib/MCCAS/MCCASObjectV1.cpp b/llvm/lib/MCCAS/MCCASObjectV1.cpp index 3781cde9987ea..28d99ffe8c797 100644 --- a/llvm/lib/MCCAS/MCCASObjectV1.cpp +++ b/llvm/lib/MCCAS/MCCASObjectV1.cpp @@ -2150,6 +2150,8 @@ Expected> MCCASBuilder::mergeMCFragmentContents(const MCSection *Section, bool IsDebugLineSection) { SmallVector mergedData; + if (!Section->curFragList()) + return mergedData; for (const MCFragment &Fragment : *Section) { if (Fragment.getKind() == MCFragment::FT_Dwarf) if (IsDebugLineSection) From ce7f285ce01b4bcfb4b1653a7fc6b4aa0be3be79 Mon Sep 17 00:00:00 2001 From: Shubham Sandeep Rastogi Date: Tue, 5 Aug 2025 12:43:33 -0700 Subject: [PATCH 26/29] add var fragment handline --- llvm/lib/MCCAS/MCCASObjectV1.cpp | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/llvm/lib/MCCAS/MCCASObjectV1.cpp b/llvm/lib/MCCAS/MCCASObjectV1.cpp index 28d99ffe8c797..ddf494dfbdbf6 100644 --- a/llvm/lib/MCCAS/MCCASObjectV1.cpp +++ b/llvm/lib/MCCAS/MCCASObjectV1.cpp @@ -2154,29 +2154,35 @@ MCCASBuilder::mergeMCFragmentContents(const MCSection *Section, return mergedData; for (const MCFragment &Fragment : *Section) { if (Fragment.getKind() == MCFragment::FT_Dwarf) - if (IsDebugLineSection) + if (IsDebugLineSection) { llvm::append_range(mergedData, Fragment.getContents()); - else + llvm::append_range(mergedData, Fragment.getVarContents()); + } else return createStringError( inconvertibleErrorCode(), "Invalid MCFragment::FT_Dwarf type in a non debug line section"); else if (const auto *CVDefRangeFragment = - dyn_cast(&Fragment)) + dyn_cast(&Fragment)) { llvm::append_range(mergedData, CVDefRangeFragment->getContents()); + llvm::append_range(mergedData, CVDefRangeFragment->getVarContents()); + } + else if (const auto *CVInlineLineTableFragment = - dyn_cast(&Fragment)) + dyn_cast(&Fragment)) { llvm::append_range(mergedData, CVInlineLineTableFragment->getContents()); - else if (Fragment.getKind() == MCFragment::FT_Align) { + llvm::append_range(mergedData, + CVInlineLineTableFragment->getVarContents()); + } else if (Fragment.getKind() == MCFragment::FT_Align) { auto FragmentSize = Asm.computeFragmentSize(Fragment); raw_svector_ostream OS(mergedData); if (auto E = writeAlignFragment(*this, Fragment, OS, FragmentSize)) return std::move(E); - } else if (Fragment.getFixedSize() != 0) - llvm::append_range(mergedData, Fragment.getContents()); - else - // All other fragment types can be considered empty, see - // getFragmentContents() for all fragments that have contents. - continue; + } else { + if (Fragment.getFixedSize() != 0) + llvm::append_range(mergedData, Fragment.getContents()); + if (Fragment.getVarSize() != 0) + llvm::append_range(mergedData, Fragment.getVarContents()); + } } return mergedData; } From af08d1cec59dbebc8fc5d1db1dab7044e3f387e5 Mon Sep 17 00:00:00 2001 From: Shubham Sandeep Rastogi Date: Tue, 5 Aug 2025 12:43:46 -0700 Subject: [PATCH 27/29] Fixup some tests --- .../test/DebugInfo/CAS/AArch64/debug_unopt.ll | 86 +++++++++---------- llvm/test/tools/llvm-cas-dump/stats-dump.test | 2 + 2 files changed, 45 insertions(+), 43 deletions(-) diff --git a/llvm/test/DebugInfo/CAS/AArch64/debug_unopt.ll b/llvm/test/DebugInfo/CAS/AArch64/debug_unopt.ll index 7fc30b245fae2..651cb0fe58397 100644 --- a/llvm/test/DebugInfo/CAS/AArch64/debug_unopt.ll +++ b/llvm/test/DebugInfo/CAS/AArch64/debug_unopt.ll @@ -2,49 +2,49 @@ ; RUN: llc -debug-info-unopt -O0 --filetype=obj --cas-backend --cas=%t/cas --mccas-casid --mtriple=arm64-apple-darwin %s -o %t/debug_unopt.id ; RUN: llvm-cas-dump --cas=%t/cas --casid-file %t/debug_unopt.id | FileCheck %s -; CHECK: mc:assembler llvmcas:// -; CHECK-NEXT: mc:header llvmcas:// -; CHECK-NEXT: mc:group llvmcas:// -; CHECK-NEXT: mc:section llvmcas:// -; CHECK-NEXT: mc:atom llvmcas:// -; CHECK-NEXT: mc:atom llvmcas:// -; CHECK-NEXT: mc:data llvmcas:// -; CHECK-NEXT: mc:atom llvmcas:// -; CHECK-NEXT: mc:data llvmcas:// -; CHECK-NEXT: mc:padding llvmcas:// -; CHECK-NEXT: mc:debug_abbrev_section llvmcas:// -; CHECK-NEXT: mc:debug_abbrev_unopt llvmcas:// -; CHECK-NEXT: mc:padding llvmcas:// -; CHECK-NEXT: mc:debug_info_section llvmcas:// -; CHECK-NEXT: mc:debug_info_unopt llvmcas:// -; CHECK-NEXT: mc:padding llvmcas:// -; CHECK-NEXT: mc:debug_string_section llvmcas:// -; CHECK-NEXT: mc:debug_string llvmcas:// -; CHECK-NEXT: mc:padding llvmcas:// -; CHECK-NEXT: mc:apple_names_section llvmcas:// -; CHECK-NEXT: mc:apple_names llvmcas:// -; CHECK-NEXT: mc:padding llvmcas:// -; CHECK-NEXT: mc:apple_objc_section llvmcas:// -; CHECK-NEXT: mc:apple_objc llvmcas:// -; CHECK-NEXT: mc:padding llvmcas:// -; CHECK-NEXT: mc:apple_namepsac_section llvmcas:// -; CHECK-NEXT: mc:apple_namespac llvmcas:// -; CHECK-NEXT: mc:padding llvmcas:// -; CHECK-NEXT: mc:apple_types_section llvmcas:// -; CHECK-NEXT: mc:apple_types llvmcas:// -; CHECK-NEXT: mc:padding llvmcas:// -; CHECK-NEXT: mc:section llvmcas:// -; CHECK-NEXT: mc:atom llvmcas:// -; CHECK-NEXT: mc:atom llvmcas:// -; CHECK-NEXT: mc:data llvmcas:// -; CHECK-NEXT: mc:padding llvmcas:// -; CHECK-NEXT: mc:addends llvmcas:// -; CHECK-NEXT: mc:debug_line_section llvmcas:// -; CHECK-NEXT: mc:debug_line_unopt llvmcas:// -; CHECK-NEXT: mc:padding llvmcas:// -; CHECK-NEXT: mc:data_in_code llvmcas:// -; CHECK-NEXT: mc:symbol_table llvmcas:// -; CHECK-NEXT: mc:cstring llvmcas:// +;CHECK: mc:assembler llvmcas:// +;CHECK-NEXT: mc:header llvmcas:// +;CHECK-NEXT: mc:group llvmcas:// +;CHECK-NEXT: mc:section llvmcas:// +;CHECK-NEXT: mc:atom llvmcas:// +;CHECK-NEXT: mc:atom llvmcas:// +;CHECK-NEXT: mc:align llvmcas:// +;CHECK-NEXT: mc:atom llvmcas:// +;CHECK-NEXT: mc:data llvmcas:// +;CHECK-NEXT: mc:padding llvmcas:// +;CHECK-NEXT: mc:debug_abbrev_section llvmcas:// +;CHECK-NEXT: mc:debug_abbrev_unopt llvmcas:// +;CHECK-NEXT: mc:padding llvmcas:// +;CHECK-NEXT: mc:debug_info_section llvmcas:// +;CHECK-NEXT: mc:debug_info_unopt llvmcas:// +;CHECK-NEXT: mc:padding llvmcas:// +;CHECK-NEXT: mc:debug_string_section llvmcas:// +;CHECK-NEXT: mc:debug_string llvmcas:// +;CHECK-NEXT: mc:padding llvmcas:// +;CHECK-NEXT: mc:apple_names_section llvmcas:// +;CHECK-NEXT: mc:apple_names llvmcas:// +;CHECK-NEXT: mc:padding llvmcas:// +;CHECK-NEXT: mc:apple_objc_section llvmcas:// +;CHECK-NEXT: mc:apple_objc llvmcas:// +;CHECK-NEXT: mc:padding llvmcas:// +;CHECK-NEXT: mc:apple_namepsac_section llvmcas:// +;CHECK-NEXT: mc:apple_namespac llvmcas:// +;CHECK-NEXT: mc:padding llvmcas:// +;CHECK-NEXT: mc:apple_types_section llvmcas:// +;CHECK-NEXT: mc:apple_types llvmcas:// +;CHECK-NEXT: mc:padding llvmcas:// +;CHECK-NEXT: mc:section llvmcas:// +;CHECK-NEXT: mc:atom llvmcas:// +;CHECK-NEXT: mc:atom llvmcas:// +;CHECK-NEXT: mc:data llvmcas:// +;CHECK-NEXT: mc:padding llvmcas:// +;CHECK-NEXT: mc:addends llvmcas:// +;CHECK-NEXT: mc:debug_line_section llvmcas:// +;CHECK-NEXT: mc:debug_line_unopt llvmcas:// +;CHECK-NEXT: mc:padding llvmcas:// +;CHECK-NEXT: mc:data_in_code llvmcas:// +;CHECK-NEXT: mc:symbol_table llvmcas:// +;CHECK-NEXT: mc:cstring llvmcas:// define i32 @_Z3fooj(i32 noundef %0) #0 !dbg !10 { ret i32 1, !dbg !18 diff --git a/llvm/test/tools/llvm-cas-dump/stats-dump.test b/llvm/test/tools/llvm-cas-dump/stats-dump.test index cb9053a20155a..4e58b2b27ce91 100644 --- a/llvm/test/tools/llvm-cas-dump/stats-dump.test +++ b/llvm/test/tools/llvm-cas-dump/stats-dump.test @@ -18,6 +18,7 @@ CSV: Kind, Count, Parents, Children, Data (B), Cost (B) CSV-NEXT: builtin:node, {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} CSV-NEXT: builtin:tree, {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} CSV-NEXT: mc:addends, {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} +CSV-NEXT: mc:align, {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} CSV-NEXT: mc:assembler, {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} CSV-NEXT: mc:atom, {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} CSV-NEXT: mc:cstring, {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}} @@ -46,6 +47,7 @@ PRETTY-NEXT: ==== ===== ======= ==== PRETTY: builtin:node {{([0-9]+,)?[0-9]+}} {{[0-9]+\.[0-9]+}}% {{([0-9]+,)?[0-9]+}} {{[0-9]+\.[0-9]+}}% {{([0-9]+,)?[0-9]+}} {{[0-9]+\.[0-9]+}}% {{([0-9]+,)?[0-9]+}} {{[0-9]+\.[0-9]+}}% {{([0-9]+,)?[0-9]+}} {{[0-9]+\.[0-9]+}}% PRETTY-NEXT: builtin:tree {{([0-9]+,)?[0-9]+}} {{[0-9]+\.[0-9]+}}% {{([0-9]+,)?[0-9]+}} {{[0-9]+\.[0-9]+}}% {{([0-9]+,)?[0-9]+}} {{[0-9]+\.[0-9]+}}% {{([0-9]+,)?[0-9]+}} {{[0-9]+\.[0-9]+}}% {{([0-9]+,)?[0-9]+}} {{[0-9]+\.[0-9]+}}% PRETTY-NEXT: mc:addends {{([0-9]+,)?[0-9]+}} {{[0-9]+\.[0-9]+}}% {{([0-9]+,)?[0-9]+}} {{[0-9]+\.[0-9]+}}% {{([0-9]+,)?[0-9]+}} {{[0-9]+\.[0-9]+}}% {{([0-9]+,)?[0-9]+}} {{[0-9]+\.[0-9]+}}% {{([0-9]+,)?[0-9]+}} {{[0-9]+\.[0-9]+}}% +PRETTY-NEXT: mc:align {{([0-9]+,)?[0-9]+}} {{[0-9]+\.[0-9]+}}% {{([0-9]+,)?[0-9]+}} {{[0-9]+\.[0-9]+}}% {{([0-9]+,)?[0-9]+}} {{[0-9]+\.[0-9]+}}% {{([0-9]+,)?[0-9]+}} {{[0-9]+\.[0-9]+}}% {{([0-9]+,)?[0-9]+}} {{[0-9]+\.[0-9]+}}% PRETTY-NEXT: mc:assembler {{([0-9]+,)?[0-9]+}} {{[0-9]+\.[0-9]+}}% {{([0-9]+,)?[0-9]+}} {{[0-9]+\.[0-9]+}}% {{([0-9]+,)?[0-9]+}} {{[0-9]+\.[0-9]+}}% {{([0-9]+,)?[0-9]+}} {{[0-9]+\.[0-9]+}}% {{([0-9]+,)?[0-9]+}} {{[0-9]+\.[0-9]+}}% PRETTY-NEXT: mc:atom {{([0-9]+,)?[0-9]+}} {{[0-9]+\.[0-9]+}}% {{([0-9]+,)?[0-9]+}} {{[0-9]+\.[0-9]+}}% {{([0-9]+,)?[0-9]+}} {{[0-9]+\.[0-9]+}}% {{([0-9]+,)?[0-9]+}} {{[0-9]+\.[0-9]+}}% {{([0-9]+,)?[0-9]+}} {{[0-9]+\.[0-9]+}}% PRETTY-NEXT: mc:cstring {{([0-9]+,)?[0-9]+}} {{[0-9]+\.[0-9]+}}% {{([0-9]+,)?[0-9]+}} {{[0-9]+\.[0-9]+}}% {{([0-9]+,)?[0-9]+}} {{[0-9]+\.[0-9]+}}% {{([0-9]+,)?[0-9]+}} {{[0-9]+\.[0-9]+}}% {{([0-9]+,)?[0-9]+}} {{[0-9]+\.[0-9]+}}% From eb19d4aa82adae1fdec3ff66d064cb50ca7cc74d Mon Sep 17 00:00:00 2001 From: Shubham Sandeep Rastogi Date: Thu, 7 Aug 2025 16:45:22 -0700 Subject: [PATCH 28/29] Added this to make debugging easier --- llvm/lib/MCCAS/MCCASObjectV1.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/llvm/lib/MCCAS/MCCASObjectV1.cpp b/llvm/lib/MCCAS/MCCASObjectV1.cpp index ddf494dfbdbf6..e7a8cb34f95a8 100644 --- a/llvm/lib/MCCAS/MCCASObjectV1.cpp +++ b/llvm/lib/MCCAS/MCCASObjectV1.cpp @@ -3115,6 +3115,7 @@ Error MCCASBuilder::buildFragments() { ArrayRef RelocationBuffer; MCDataFragmentMerger Merger(*this, &Sec); uint64_t RelocationBufferIndex = 0; + uint64_t TotalFragmentWithoutAddendsSize = 0; for (const MCFragment &F : Sec) { auto Relocs = RelMap.find(&F); if (RelocLocation == Atom) { @@ -3158,6 +3159,7 @@ Error MCCASBuilder::buildFragments() { partitionFragment(Asm, Addends, FinalFragmentContents, RelocationBuffer, F, RelocationBufferIndex, ObjectWriter.Target.isLittleEndian()); + TotalFragmentWithoutAddendsSize += FinalFragmentContents.size(); if (auto E = Merger.tryMerge(F, Size, FinalFragmentContents)) return E; @@ -3182,6 +3184,7 @@ Error MCCASBuilder::buildFragments() { if (auto E = finalizeSection()) return E; + TotalFragmentWithoutAddendsSize = 0; } return finalizeGroup(); } From 7612921e929e493f79cf6ba2bbf16de0d76f55e0 Mon Sep 17 00:00:00 2001 From: Shubham Sandeep Rastogi Date: Thu, 7 Aug 2025 16:46:48 -0700 Subject: [PATCH 29/29] Make sure we don't write non-partitioned data into align fragment --- llvm/lib/MCCAS/MCCASObjectV1.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/llvm/lib/MCCAS/MCCASObjectV1.cpp b/llvm/lib/MCCAS/MCCASObjectV1.cpp index e7a8cb34f95a8..f987fd8cdb42b 100644 --- a/llvm/lib/MCCAS/MCCASObjectV1.cpp +++ b/llvm/lib/MCCAS/MCCASObjectV1.cpp @@ -1947,8 +1947,13 @@ Error MCDataFragmentMerger::tryMerge(const MCFragment &F, unsigned Size, } static Error writeAlignFragment(MCCASBuilder &Builder, const MCFragment &AF, - raw_ostream &OS, unsigned FragmentSize) { - OS << StringRef(AF.getContents().data(), AF.getContents().size()); + raw_ostream &OS, unsigned FragmentSize, + bool WriteFragmentContents = true) { + // Do not always write the contents of the FT_Align fragment into the OS, this + // is because that data can contain addend values as well and is undesirable + // when creating AlignFragment CAS Objects. + if (WriteFragmentContents) + OS << StringRef(AF.getContents().data(), AF.getContents().size()); uint64_t Count = (FragmentSize - AF.getFixedSize()) / AF.getAlignFillLen(); if (AF.hasAlignEmitNops()) { if (!Builder.Asm.getBackend().writeNopData(OS, Count, @@ -2006,8 +2011,14 @@ Error MCDataFragmentMerger::emitMergedFragments() { #define MCFRAGMENT_ENCODED_FRAGMENT_ONLY #include "llvm/MCCAS/MCCASObjectV1.def" case MCFragment::FT_Align: { + // Since an FT_Align can contain Addend Values, only write the + // post-fragment partitioned contents into the FragmentData and make sure + // that the writeAlignFragment function doesn't write any of the fragment + // data into FragmentData. + FragmentData.append(CandidateContents); if (auto E = writeAlignFragment(Builder, *Candidate.first, FragmentOS, - Candidate.second)) + Candidate.second, + false /*WriteFragmentContents*/)) return E; break; }