[llvm] MC: Store fragment content and fixups out-of-line (PR #146307)
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 30 21:28:14 PDT 2025
================
@@ -20,65 +20,102 @@
#include "llvm/Support/Compiler.h"
#include "llvm/Support/raw_ostream.h"
#include <cassert>
+#include <type_traits>
#include <utility>
using namespace llvm;
+static_assert(std::is_trivially_destructible_v<MCDataFragment>,
+ "fragment classes must be trivially destructible");
+
MCFragment::MCFragment(FragmentType Kind, bool HasInstructions)
: Kind(Kind), HasInstructions(HasInstructions), AlignToBundleEnd(false),
LinkerRelaxable(false), AllowAutoPadding(false) {}
-void MCFragment::destroy() {
- switch (Kind) {
- case FT_Align:
- cast<MCAlignFragment>(this)->~MCAlignFragment();
- return;
- case FT_Data:
- cast<MCDataFragment>(this)->~MCDataFragment();
- return;
- case FT_Fill:
- cast<MCFillFragment>(this)->~MCFillFragment();
- return;
- case FT_Nops:
- cast<MCNopsFragment>(this)->~MCNopsFragment();
- return;
- case FT_Relaxable:
- cast<MCRelaxableFragment>(this)->~MCRelaxableFragment();
- return;
- case FT_Org:
- cast<MCOrgFragment>(this)->~MCOrgFragment();
- return;
- case FT_Dwarf:
- cast<MCDwarfLineAddrFragment>(this)->~MCDwarfLineAddrFragment();
- return;
- case FT_DwarfFrame:
- cast<MCDwarfCallFrameFragment>(this)->~MCDwarfCallFrameFragment();
- return;
- case FT_LEB:
- cast<MCLEBFragment>(this)->~MCLEBFragment();
- return;
- case FT_BoundaryAlign:
- cast<MCBoundaryAlignFragment>(this)->~MCBoundaryAlignFragment();
- return;
- case FT_SymbolId:
- cast<MCSymbolIdFragment>(this)->~MCSymbolIdFragment();
- return;
- case FT_CVInlineLines:
- cast<MCCVInlineLineTableFragment>(this)->~MCCVInlineLineTableFragment();
- return;
- case FT_CVDefRange:
- cast<MCCVDefRangeFragment>(this)->~MCCVDefRangeFragment();
- return;
- case FT_PseudoProbe:
- cast<MCPseudoProbeAddrFragment>(this)->~MCPseudoProbeAddrFragment();
- return;
+const MCSymbol *MCFragment::getAtom() const {
+ return cast<MCSectionMachO>(Parent)->getAtom(LayoutOrder);
+}
+
+SmallVectorImpl<char> &MCEncodedFragment::getContentsForAppending() {
+ SmallVectorImpl<char> &S = getParent()->ContentStorage;
+ if (ContentSize == 0) {
+ ContentStart = S.size();
+ } else if (ContentStart + ContentSize != S.size()) {
+ // If not empty and not at the storage end, move to the storage end.
+ auto I = std::exchange(ContentStart, S.size());
+ S.reserve(S.size() + ContentSize);
----------------
MaskRay wrote:
https://reviews.llvm.org/D91744
`S.begin() + I` used by append is invalidated upon reallocation. So we have to call `reserve` first. I'll improve the comment.
https://github.com/llvm/llvm-project/pull/146307
More information about the llvm-commits
mailing list