diff options
author | Sterling-Augustine <saugustine@google.com> | 2025-08-12 12:57:31 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-08-12 12:57:31 -0700 |
commit | 2e9944a03e6bdda64f266aa4b9fe88d81fdf16cd (patch) | |
tree | c8c14e249dacbd86b01a7ddb4d0075bbd620ecec /llvm/lib/MC/MCObjectFileInfo.cpp | |
parent | 35892345680b5176d34c9d0dfb65b1a7b39914af (diff) | |
download | llvm-2e9944a03e6bdda64f266aa4b9fe88d81fdf16cd.zip llvm-2e9944a03e6bdda64f266aa4b9fe88d81fdf16cd.tar.gz llvm-2e9944a03e6bdda64f266aa4b9fe88d81fdf16cd.tar.bz2 |
Generate an .sframe section with a skeleton header (#151223)
This continues the sframe implementation discussed previously.
Of note, this also adds some target dependent functions to the object
file. Additional fields will be needed later. It would be possible to do
all of this inside the sframe implementation itself if it feels a little
messy and specialized, but generally I think that target info goes with
target info.
Another question is if we want a sentinel value for unimplemented sframe
abi arches, or a std::optional. Both work.
Diffstat (limited to 'llvm/lib/MC/MCObjectFileInfo.cpp')
-rw-r--r-- | llvm/lib/MC/MCObjectFileInfo.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/llvm/lib/MC/MCObjectFileInfo.cpp b/llvm/lib/MC/MCObjectFileInfo.cpp index 4ac73ab..d274c88 100644 --- a/llvm/lib/MC/MCObjectFileInfo.cpp +++ b/llvm/lib/MC/MCObjectFileInfo.cpp @@ -10,6 +10,7 @@ #include "llvm/ADT/StringExtras.h" #include "llvm/BinaryFormat/COFF.h" #include "llvm/BinaryFormat/ELF.h" +#include "llvm/BinaryFormat/SFrame.h" #include "llvm/BinaryFormat/Wasm.h" #include "llvm/MC/MCAsmInfo.h" #include "llvm/MC/MCContext.h" @@ -380,6 +381,19 @@ void MCObjectFileInfo::initELFMCObjectFileInfo(const Triple &T, bool Large) { unsigned EHSectionType = T.getArch() == Triple::x86_64 ? ELF::SHT_X86_64_UNWIND : ELF::SHT_PROGBITS; + switch (T.getArch()) { + case Triple::x86_64: + SFrameABIArch = sframe::ABI::AMD64EndianLittle; + break; + case Triple::aarch64: + SFrameABIArch = sframe::ABI::AArch64EndianLittle; + break; + case Triple::aarch64_be: + SFrameABIArch = sframe::ABI::AArch64EndianBig; + break; + default: + break; + } // Solaris requires different flags for .eh_frame to seemingly every other // platform. @@ -537,6 +551,9 @@ void MCObjectFileInfo::initELFMCObjectFileInfo(const Triple &T, bool Large) { EHFrameSection = Ctx->getELFSection(".eh_frame", EHSectionType, EHSectionFlags); + SFrameSection = + Ctx->getELFSection(".sframe", ELF::SHT_GNU_SFRAME, ELF::SHF_ALLOC); + CallGraphSection = Ctx->getELFSection(".callgraph", ELF::SHT_PROGBITS, 0); StackSizesSection = Ctx->getELFSection(".stack_sizes", ELF::SHT_PROGBITS, 0); @@ -1064,6 +1081,7 @@ void MCObjectFileInfo::initMCObjectFileInfo(MCContext &MCCtx, bool PIC, CompactUnwindDwarfEHFrameOnly = 0; EHFrameSection = nullptr; // Created on demand. + SFrameSection = nullptr; // Created on demand. CompactUnwindSection = nullptr; // Used only by selected targets. DwarfAccelNamesSection = nullptr; // Used only by selected targets. DwarfAccelObjCSection = nullptr; // Used only by selected targets. |