In my previous post, LLVM integrated assembler: Improving expressions and relocations delved into enhancements made to LLVM's expression resolving and relocation generation. This post covers recent refinements to MC, focusing on sections and symbols.
Sections
Sections are named, contiguous blocks of code or data within an object file. They allow you to logically group related parts of your program. The assembler places code and data into these sections as it processes the source file.
1 | class MCSection { |
In LLVM 20, the MCSection
class used an enum called SectionVariant
to
differentiate between various object file formats, such as ELF, Mach-O,
and COFF. These subclasses are used in contexts where the section type
is known at compile-time, such as in MCStreamer
and MCObjectTargetWriter
.
This change eliminates the need for runtime type information (RTTI)
checks, simplifying the codebase and improving efficiency.
Additionally, the storage for fragments' fixups (adjustments to
addresses and offsets) has been moved into the MCSection
class.
Symbols
Symbols are names that represent memory addresses or values.
1 | class MCSymbol { |
Similar to sections, the MCSymbol
class also used a discriminator enum, SymbolKind, to distinguish
between object file formats. This enum has also been removed.
Furthermore, the MCSymbol
class had an
enum Contents
to specify the kind of symbol. This name was
a bit confusing, so it has been renamed
to enum Kind
for clarity.
- regular symbol
- equated symbol
- common symbol
A special enumerator, SymContentsTargetCommon
, which was
used by AMDGPU for a specific type of common symbol, has also been removed.
The functionality it provided is now handled by updating
ELFObjectWriter
to respect the symbol's section index
(SHN_AMDGPU_LDS
for this special AMDGPU symbol).
sizeof(MCSymbol)
has been reduced to 24 bytes on 64-bit
systems.
The previous blog post LLVM integrated assembler: Improving expressions and relocations describes other changes:
- The
MCSymbol::IsUsed
flag was a workaround for detecting a subset of invalid reassignments and is removed. - The
MCSymbol::IsResolving
flag is added to detect cyclic dependencies of equated symbols.