================
@@ -0,0 +1,1757 @@
+//===- AMDGPUObjectLinking.cpp - AMDGPU link-time resolution 
--------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// Implements link-time resolution and patching for AMDGPU object linking.
+//
+// The linker:
+//   1. Uses the linked image's resolved target e_flags
+//   2. Collects SHN_AMDGPU_LDS and named-barrier symbols
+//   3. Parses .amdgpu.info to build the cross-TU call graph, type-ID
+//      signatures, LDS and named-barrier uses, and per-function resource usage
+//   4. Resolves indirect call edges, function aliases, and kernel entries
+//   5. Validates call-edge wave-size compatibility
+//   6. Builds a shared SCC condensation graph for kernel-reachable functions
+//   7. Computes per-kernel LDS and named-barrier reachability
+//   8. Assigns LDS offsets and named-barrier IDs
+//   9. Propagates resource usage across the SCC graph (MAX for registers, OR
+//      for flags, caller scratch plus maximum callee scratch path)
+//  10. Validates required ABI occupancy and wave-size metadata, call-edge ABI
+//      compatibility, and each kernel's LDS usage against its occupancy
+//
+// After resolution, the linker patches kernel descriptors and HSA metadata
+// with the resolved LDS size, named-barrier count, propagated register usage,
+// scratch size, dynamic-stack flag, and related resource fields.
+//
+//===----------------------------------------------------------------------===//
+
+#include "AMDGPUObjectLinking.h"
+#include "Config.h"
+#include "InputFiles.h"
+#include "InputSection.h"
+#include "SymbolTable.h"
+#include "Symbols.h"
+#include "lld/Common/ErrorHandler.h"
+#include "llvm/BinaryFormat/AMDGPUMetadataVerifier.h"
+#include "llvm/BinaryFormat/ELF.h"
+#include "llvm/BinaryFormat/MsgPackDocument.h"
+#include "llvm/Support/AMDGPUObjLinkingInfo.h"
+#include "llvm/Support/AMDGPUObjectLinkingHelper.h"
+#include "llvm/Support/AMDHSAKernelDescriptor.h"
+#include "llvm/Support/Alignment.h"
+#include "llvm/Support/Allocator.h"
+#include "llvm/Support/Debug.h"
+#include "llvm/Support/Endian.h"
+#include "llvm/Support/TimeProfiler.h"
+#include "llvm/TargetParser/AMDGPUTargetParser.h"
+
+#define DEBUG_TYPE "amdgpu-object-linking"
+
+using namespace llvm;
+using namespace llvm::support::endian;
+using namespace llvm::object;
+using namespace llvm::ELF;
+using namespace lld;
+using namespace lld::elf;
+
+namespace {
+
+// One SHN_AMDGPU_LDS symbol after collection and before it is rewritten to a
+// concrete offset.
+struct LDSSymbolInfo {
+  Symbol *sym = nullptr;
+  uint64_t size = 0;
+  Align alignment = Align(1);
----------------
arsenm wrote:

I think this is the default 

https://github.com/llvm/llvm-project/pull/206787
_______________________________________________
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to