[llvm] 09a399a - [MC] Move VersionInfo to MachObjectWriter
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Sun Jul 21 13:03:26 PDT 2024
Author: Fangrui Song
Date: 2024-07-21T13:03:21-07:00
New Revision: 09a399a1ddbef1e5e51b77fd6bd1792d34697187
URL: https://github.com/llvm/llvm-project/commit/09a399a1ddbef1e5e51b77fd6bd1792d34697187
DIFF: https://github.com/llvm/llvm-project/commit/09a399a1ddbef1e5e51b77fd6bd1792d34697187.diff
LOG: [MC] Move VersionInfo to MachObjectWriter
Added:
Modified:
llvm/include/llvm/MC/MCAssembler.h
llvm/include/llvm/MC/MCMachObjectWriter.h
llvm/lib/MC/MCAssembler.cpp
llvm/lib/MC/MCMachOStreamer.cpp
llvm/lib/MC/MachObjectWriter.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/MC/MCAssembler.h b/llvm/include/llvm/MC/MCAssembler.h
index 5ffe2ca5fabc3..3852bdf9777d6 100644
--- a/llvm/include/llvm/MC/MCAssembler.h
+++ b/llvm/include/llvm/MC/MCAssembler.h
@@ -15,12 +15,9 @@
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/iterator.h"
#include "llvm/ADT/iterator_range.h"
-#include "llvm/BinaryFormat/MachO.h"
-#include "llvm/MC/MCDirectives.h"
#include "llvm/MC/MCDwarf.h"
#include "llvm/MC/MCSymbol.h"
#include "llvm/Support/SMLoc.h"
-#include "llvm/Support/VersionTuple.h"
#include <algorithm>
#include <cassert>
#include <cstddef>
@@ -58,22 +55,6 @@ class MCAssembler {
using SectionListType = SmallVector<MCSection *, 0>;
using const_iterator = pointee_iterator<SectionListType::const_iterator>;
- /// MachO specific deployment target version info.
- // A Major version of 0 indicates that no version information was supplied
- // and so the corresponding load command should not be emitted.
- using VersionInfoType = struct {
- bool EmitBuildVersion;
- union {
- MCVersionMinType Type; ///< Used when EmitBuildVersion==false.
- MachO::PlatformType Platform; ///< Used when EmitBuildVersion==true.
- } TypeOrPlatform;
- unsigned Major;
- unsigned Minor;
- unsigned Update;
- /// An optional version of the SDK that was used to build the source.
- VersionTuple SDKVersion;
- };
-
private:
MCContext &Context;
@@ -120,9 +101,6 @@ class MCAssembler {
// which flags to be set.
unsigned ELFHeaderEFlags = 0;
- VersionInfoType VersionInfo;
- VersionInfoType DarwinTargetVariantVersionInfo;
-
/// Evaluate a fixup to a relocatable expression and the value which should be
/// placed into the fixup.
///
@@ -226,44 +204,6 @@ class MCAssembler {
unsigned getELFHeaderEFlags() const { return ELFHeaderEFlags; }
void setELFHeaderEFlags(unsigned Flags) { ELFHeaderEFlags = Flags; }
- /// MachO deployment target version information.
- const VersionInfoType &getVersionInfo() const { return VersionInfo; }
- void setVersionMin(MCVersionMinType Type, unsigned Major, unsigned Minor,
- unsigned Update,
- VersionTuple SDKVersion = VersionTuple()) {
- VersionInfo.EmitBuildVersion = false;
- VersionInfo.TypeOrPlatform.Type = Type;
- VersionInfo.Major = Major;
- VersionInfo.Minor = Minor;
- VersionInfo.Update = Update;
- VersionInfo.SDKVersion = SDKVersion;
- }
- void setBuildVersion(MachO::PlatformType Platform, unsigned Major,
- unsigned Minor, unsigned Update,
- VersionTuple SDKVersion = VersionTuple()) {
- VersionInfo.EmitBuildVersion = true;
- VersionInfo.TypeOrPlatform.Platform = Platform;
- VersionInfo.Major = Major;
- VersionInfo.Minor = Minor;
- VersionInfo.Update = Update;
- VersionInfo.SDKVersion = SDKVersion;
- }
-
- const VersionInfoType &getDarwinTargetVariantVersionInfo() const {
- return DarwinTargetVariantVersionInfo;
- }
- void setDarwinTargetVariantBuildVersion(MachO::PlatformType Platform,
- unsigned Major, unsigned Minor,
- unsigned Update,
- VersionTuple SDKVersion) {
- DarwinTargetVariantVersionInfo.EmitBuildVersion = true;
- DarwinTargetVariantVersionInfo.TypeOrPlatform.Platform = Platform;
- DarwinTargetVariantVersionInfo.Major = Major;
- DarwinTargetVariantVersionInfo.Minor = Minor;
- DarwinTargetVariantVersionInfo.Update = Update;
- DarwinTargetVariantVersionInfo.SDKVersion = SDKVersion;
- }
-
/// Reuse an assembler instance
///
void reset();
diff --git a/llvm/include/llvm/MC/MCMachObjectWriter.h b/llvm/include/llvm/MC/MCMachObjectWriter.h
index 60e3e28819724..919b7217f2ea6 100644
--- a/llvm/include/llvm/MC/MCMachObjectWriter.h
+++ b/llvm/include/llvm/MC/MCMachObjectWriter.h
@@ -12,12 +12,14 @@
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/BinaryFormat/MachO.h"
+#include "llvm/MC/MCDirectives.h"
#include "llvm/MC/MCExpr.h"
#include "llvm/MC/MCLinkerOptimizationHint.h"
#include "llvm/MC/MCObjectWriter.h"
#include "llvm/MC/MCSection.h"
#include "llvm/MC/StringTableBuilder.h"
#include "llvm/Support/EndianStream.h"
+#include "llvm/Support/VersionTuple.h"
#include <cstdint>
#include <memory>
#include <string>
@@ -89,6 +91,21 @@ class MachObjectWriter : public MCObjectWriter {
MCSymbol *End;
};
+ // A Major version of 0 indicates that no version information was supplied
+ // and so the corresponding load command should not be emitted.
+ using VersionInfoType = struct {
+ bool EmitBuildVersion;
+ union {
+ MCVersionMinType Type; ///< Used when EmitBuildVersion==false.
+ MachO::PlatformType Platform; ///< Used when EmitBuildVersion==true.
+ } TypeOrPlatform;
+ unsigned Major;
+ unsigned Minor;
+ unsigned Update;
+ /// An optional version of the SDK that was used to build the source.
+ VersionTuple SDKVersion;
+ };
+
private:
/// Helper struct for containing some precomputed information on symbols.
struct MachSymbolData {
@@ -144,6 +161,9 @@ class MachObjectWriter : public MCObjectWriter {
// Used to communicate Linker Optimization Hint information.
MCLOHContainer LOHContainer;
+ VersionInfoType VersionInfo{};
+ VersionInfoType TargetVariantVersionInfo{};
+
MachSymbolData *findSymbolData(const MCSymbol &Sym);
void writeWithPadding(StringRef Str, uint64_t Size);
@@ -197,6 +217,38 @@ class MachObjectWriter : public MCObjectWriter {
bool doesSymbolRequireExternRelocation(const MCSymbol &S);
+ /// Mach-O deployment target version information.
+ void setVersionMin(MCVersionMinType Type, unsigned Major, unsigned Minor,
+ unsigned Update,
+ VersionTuple SDKVersion = VersionTuple()) {
+ VersionInfo.EmitBuildVersion = false;
+ VersionInfo.TypeOrPlatform.Type = Type;
+ VersionInfo.Major = Major;
+ VersionInfo.Minor = Minor;
+ VersionInfo.Update = Update;
+ VersionInfo.SDKVersion = SDKVersion;
+ }
+ void setBuildVersion(MachO::PlatformType Platform, unsigned Major,
+ unsigned Minor, unsigned Update,
+ VersionTuple SDKVersion = VersionTuple()) {
+ VersionInfo.EmitBuildVersion = true;
+ VersionInfo.TypeOrPlatform.Platform = Platform;
+ VersionInfo.Major = Major;
+ VersionInfo.Minor = Minor;
+ VersionInfo.Update = Update;
+ VersionInfo.SDKVersion = SDKVersion;
+ }
+ void setTargetVariantBuildVersion(MachO::PlatformType Platform,
+ unsigned Major, unsigned Minor,
+ unsigned Update, VersionTuple SDKVersion) {
+ TargetVariantVersionInfo.EmitBuildVersion = true;
+ TargetVariantVersionInfo.TypeOrPlatform.Platform = Platform;
+ TargetVariantVersionInfo.Major = Major;
+ TargetVariantVersionInfo.Minor = Minor;
+ TargetVariantVersionInfo.Update = Update;
+ TargetVariantVersionInfo.SDKVersion = SDKVersion;
+ }
+
/// @}
/// \name Target Writer Proxy Accessors
diff --git a/llvm/lib/MC/MCAssembler.cpp b/llvm/lib/MC/MCAssembler.cpp
index 852fa76f84ccc..e731dfccc0560 100644
--- a/llvm/lib/MC/MCAssembler.cpp
+++ b/llvm/lib/MC/MCAssembler.cpp
@@ -84,10 +84,7 @@ MCAssembler::MCAssembler(MCContext &Context,
std::unique_ptr<MCCodeEmitter> Emitter,
std::unique_ptr<MCObjectWriter> Writer)
: Context(Context), Backend(std::move(Backend)),
- Emitter(std::move(Emitter)), Writer(std::move(Writer)) {
- VersionInfo.Major = 0; // Major version == 0 for "none specified"
- DarwinTargetVariantVersionInfo.Major = 0;
-}
+ Emitter(std::move(Emitter)), Writer(std::move(Writer)) {}
MCAssembler::~MCAssembler() = default;
@@ -101,10 +98,6 @@ void MCAssembler::reset() {
ThumbFuncs.clear();
BundleAlignSize = 0;
ELFHeaderEFlags = 0;
- VersionInfo.Major = 0;
- VersionInfo.SDKVersion = VersionTuple();
- DarwinTargetVariantVersionInfo.Major = 0;
- DarwinTargetVariantVersionInfo.SDKVersion = VersionTuple();
// reset objects owned by us
if (getBackendPtr())
diff --git a/llvm/lib/MC/MCMachOStreamer.cpp b/llvm/lib/MC/MCMachOStreamer.cpp
index f83e3096f3238..1d5d1c6ee72f1 100644
--- a/llvm/lib/MC/MCMachOStreamer.cpp
+++ b/llvm/lib/MC/MCMachOStreamer.cpp
@@ -252,21 +252,21 @@ void MCMachOStreamer::emitDataRegion(MCDataRegionType Kind) {
void MCMachOStreamer::emitVersionMin(MCVersionMinType Kind, unsigned Major,
unsigned Minor, unsigned Update,
VersionTuple SDKVersion) {
- getAssembler().setVersionMin(Kind, Major, Minor, Update, SDKVersion);
+ getWriter().setVersionMin(Kind, Major, Minor, Update, SDKVersion);
}
void MCMachOStreamer::emitBuildVersion(unsigned Platform, unsigned Major,
unsigned Minor, unsigned Update,
VersionTuple SDKVersion) {
- getAssembler().setBuildVersion((MachO::PlatformType)Platform, Major, Minor,
- Update, SDKVersion);
+ getWriter().setBuildVersion((MachO::PlatformType)Platform, Major, Minor,
+ Update, SDKVersion);
}
void MCMachOStreamer::emitDarwinTargetVariantBuildVersion(
unsigned Platform, unsigned Major, unsigned Minor, unsigned Update,
VersionTuple SDKVersion) {
- getAssembler().setDarwinTargetVariantBuildVersion(
- (MachO::PlatformType)Platform, Major, Minor, Update, SDKVersion);
+ getWriter().setTargetVariantBuildVersion((MachO::PlatformType)Platform, Major,
+ Minor, Update, SDKVersion);
}
void MCMachOStreamer::emitThumbFunc(MCSymbol *Symbol) {
diff --git a/llvm/lib/MC/MachObjectWriter.cpp b/llvm/lib/MC/MachObjectWriter.cpp
index 3c67f16e3d102..cc29c1ae6ccd6 100644
--- a/llvm/lib/MC/MachObjectWriter.cpp
+++ b/llvm/lib/MC/MachObjectWriter.cpp
@@ -56,6 +56,10 @@ void MachObjectWriter::reset() {
ExternalSymbolData.clear();
UndefinedSymbolData.clear();
LOHContainer.reset();
+ VersionInfo.Major = 0;
+ VersionInfo.SDKVersion = VersionTuple();
+ TargetVariantVersionInfo.Major = 0;
+ TargetVariantVersionInfo.SDKVersion = VersionTuple();
MCObjectWriter::reset();
}
@@ -803,7 +807,6 @@ uint64_t MachObjectWriter::writeObject(MCAssembler &Asm) {
}
unsigned NumSections = Asm.end() - Asm.begin();
- const MCAssembler::VersionInfoType &VersionInfo = Asm.getVersionInfo();
// The section data starts after the header, the segment load command (and
// section headers) and the symbol table.
@@ -821,9 +824,6 @@ uint64_t MachObjectWriter::writeObject(MCAssembler &Asm) {
LoadCommandsSize += sizeof(MachO::version_min_command);
}
- const MCAssembler::VersionInfoType &TargetVariantVersionInfo =
- Asm.getDarwinTargetVariantVersionInfo();
-
// Add the target variant version info load command size, if used.
if (TargetVariantVersionInfo.Major != 0) {
++NumLoadCommands;
@@ -928,7 +928,7 @@ uint64_t MachObjectWriter::writeObject(MCAssembler &Asm) {
// Write out the deployment target information, if it's available.
auto EmitDeploymentTargetVersion =
- [&](const MCAssembler::VersionInfoType &VersionInfo) {
+ [&](const VersionInfoType &VersionInfo) {
auto EncodeVersion = [](VersionTuple V) -> uint32_t {
assert(!V.empty() && "empty version");
unsigned Update = V.getSubminor().value_or(0);
More information about the llvm-commits
mailing list