[llvm] [TLOF][NFC] Make emitLinkerDirectives virtual and public. (PR #123773)
Jason Eckhardt via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 21 08:06:05 PST 2025
https://github.com/nvjle created https://github.com/llvm/llvm-project/pull/123773
Today, emitLinkerDirectives is private to TLOFCOFF-- it isolates parsing and processing of the linker options. Similar processing is also done by other TLOFs inline within emitModuleMetadata. This patch promotes emitLinkerDirectives to a virtual (public) method so that this handling is similarly isolated in the other TLOFs.
This also enables downstream targets to override just this handling instead of the whole of emitModuleMetadata.
>From 7dbf253e4fa34f265728023c98abf9d54947b3b2 Mon Sep 17 00:00:00 2001
From: Jason Eckhardt <jeckhardt at nvidia.com>
Date: Tue, 21 Jan 2025 09:46:24 -0600
Subject: [PATCH] [TLOF][NFC] Make emitLinkerDirectives virtual and public.
Today, emitLinkerDirectives is private to TLOFCOFF-- it isolates
parsing and processing of the linker options. Similar processing
is also done by other TLOFs inline within emitModuleMetadata. This
patch promotes emitLinkerDirectives to a virtual (public) method so
that this handling is similarly isolated in the other TLOFs.
This also enables downstream targets to override just this handling
instead of the whole of emitModuleMetadata.
---
.../CodeGen/TargetLoweringObjectFileImpl.h | 9 ++-
.../llvm/Target/TargetLoweringObjectFile.h | 3 +
.../CodeGen/TargetLoweringObjectFileImpl.cpp | 57 +++++++++++--------
3 files changed, 43 insertions(+), 26 deletions(-)
diff --git a/llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h b/llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
index a2a9e5d499e527..3e2cd05387926c 100644
--- a/llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
+++ b/llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
@@ -60,6 +60,8 @@ class TargetLoweringObjectFileELF : public TargetLoweringObjectFile {
const MCSymbol *Sym,
const MachineModuleInfo *MMI) const;
+ void emitLinkerDirectives(MCStreamer &Streamer, Module &M) const override;
+
/// Given a constant with the SectionKind, return a section that it should be
/// placed in.
MCSection *getSectionForConstant(const DataLayout &DL, SectionKind Kind,
@@ -131,6 +133,8 @@ class TargetLoweringObjectFileMachO : public TargetLoweringObjectFile {
/// Emit the module flags that specify the garbage collection information.
void emitModuleMetadata(MCStreamer &Streamer, Module &M) const override;
+ void emitLinkerDirectives(MCStreamer &Streamer, Module &M) const override;
+
MCSection *SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind,
const TargetMachine &TM) const override;
@@ -192,6 +196,8 @@ class TargetLoweringObjectFileCOFF : public TargetLoweringObjectFile {
/// Emit Obj-C garbage collection and linker options.
void emitModuleMetadata(MCStreamer &Streamer, Module &M) const override;
+ void emitLinkerDirectives(MCStreamer &Streamer, Module &M) const override;
+
MCSection *getStaticCtorSection(unsigned Priority,
const MCSymbol *KeySym) const override;
MCSection *getStaticDtorSection(unsigned Priority,
@@ -206,9 +212,6 @@ class TargetLoweringObjectFileCOFF : public TargetLoweringObjectFile {
MCSection *getSectionForConstant(const DataLayout &DL, SectionKind Kind,
const Constant *C,
Align &Alignment) const override;
-
-private:
- void emitLinkerDirectives(MCStreamer &Streamer, Module &M) const;
};
class TargetLoweringObjectFileWasm : public TargetLoweringObjectFile {
diff --git a/llvm/include/llvm/Target/TargetLoweringObjectFile.h b/llvm/include/llvm/Target/TargetLoweringObjectFile.h
index 4864ba843f4886..b523d6a47b41af 100644
--- a/llvm/include/llvm/Target/TargetLoweringObjectFile.h
+++ b/llvm/include/llvm/Target/TargetLoweringObjectFile.h
@@ -91,6 +91,9 @@ class TargetLoweringObjectFile : public MCObjectFileInfo {
/// Emit Call Graph Profile metadata.
void emitCGProfileMetadata(MCStreamer &Streamer, Module &M) const;
+ /// Process linker options metadata and emit platform-specific bits.
+ virtual void emitLinkerDirectives(MCStreamer &Streamer, Module &M) const {}
+
/// Get the module-level metadata that the platform cares about.
virtual void getModuleMetadata(Module &M) {}
diff --git a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
index be243c0e74e9db..672f739b32b996 100644
--- a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
+++ b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
@@ -306,21 +306,7 @@ void TargetLoweringObjectFileELF::emitModuleMetadata(MCStreamer &Streamer,
Module &M) const {
auto &C = getContext();
- if (NamedMDNode *LinkerOptions = M.getNamedMetadata("llvm.linker.options")) {
- auto *S = C.getELFSection(".linker-options", ELF::SHT_LLVM_LINKER_OPTIONS,
- ELF::SHF_EXCLUDE);
-
- Streamer.switchSection(S);
-
- for (const auto *Operand : LinkerOptions->operands()) {
- if (cast<MDNode>(Operand)->getNumOperands() != 2)
- report_fatal_error("invalid llvm.linker.options");
- for (const auto &Option : cast<MDNode>(Operand)->operands()) {
- Streamer.emitBytes(cast<MDString>(Option)->getString());
- Streamer.emitInt8(0);
- }
- }
- }
+ emitLinkerDirectives(Streamer, M);
if (NamedMDNode *DependentLibraries = M.getNamedMetadata("llvm.dependent-libraries")) {
auto *S = C.getELFSection(".deplibs", ELF::SHT_LLVM_DEPENDENT_LIBRARIES,
@@ -400,6 +386,26 @@ void TargetLoweringObjectFileELF::emitModuleMetadata(MCStreamer &Streamer,
emitCGProfileMetadata(Streamer, M);
}
+void TargetLoweringObjectFileELF::emitLinkerDirectives(MCStreamer &Streamer,
+ Module &M) const {
+ auto &C = getContext();
+ if (NamedMDNode *LinkerOptions = M.getNamedMetadata("llvm.linker.options")) {
+ auto *S = C.getELFSection(".linker-options", ELF::SHT_LLVM_LINKER_OPTIONS,
+ ELF::SHF_EXCLUDE);
+
+ Streamer.switchSection(S);
+
+ for (const auto *Operand : LinkerOptions->operands()) {
+ if (cast<MDNode>(Operand)->getNumOperands() != 2)
+ report_fatal_error("invalid llvm.linker.options");
+ for (const auto &Option : cast<MDNode>(Operand)->operands()) {
+ Streamer.emitBytes(cast<MDString>(Option)->getString());
+ Streamer.emitInt8(0);
+ }
+ }
+ }
+}
+
MCSymbol *TargetLoweringObjectFileELF::getCFIPersonalitySymbol(
const GlobalValue *GV, const TargetMachine &TM,
MachineModuleInfo *MMI) const {
@@ -1238,14 +1244,7 @@ MCSection *TargetLoweringObjectFileMachO::getStaticDtorSection(
void TargetLoweringObjectFileMachO::emitModuleMetadata(MCStreamer &Streamer,
Module &M) const {
// Emit the linker options if present.
- if (auto *LinkerOptions = M.getNamedMetadata("llvm.linker.options")) {
- for (const auto *Option : LinkerOptions->operands()) {
- SmallVector<std::string, 4> StrOptions;
- for (const auto &Piece : cast<MDNode>(Option)->operands())
- StrOptions.push_back(std::string(cast<MDString>(Piece)->getString()));
- Streamer.emitLinkerOptions(StrOptions);
- }
- }
+ emitLinkerDirectives(Streamer, M);
unsigned VersionVal = 0;
unsigned ImageInfoFlags = 0;
@@ -1279,6 +1278,18 @@ void TargetLoweringObjectFileMachO::emitModuleMetadata(MCStreamer &Streamer,
Streamer.addBlankLine();
}
+void TargetLoweringObjectFileMachO::emitLinkerDirectives(MCStreamer &Streamer,
+ Module &M) const {
+ if (auto *LinkerOptions = M.getNamedMetadata("llvm.linker.options")) {
+ for (const auto *Option : LinkerOptions->operands()) {
+ SmallVector<std::string, 4> StrOptions;
+ for (const auto &Piece : cast<MDNode>(Option)->operands())
+ StrOptions.push_back(std::string(cast<MDString>(Piece)->getString()));
+ Streamer.emitLinkerOptions(StrOptions);
+ }
+ }
+}
+
static void checkMachOComdat(const GlobalValue *GV) {
const Comdat *C = GV->getComdat();
if (!C)
More information about the llvm-commits
mailing list