[llvm] [MC] Allocate MCFragment with a bump allocator (PR #96402)
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Sat Jun 22 12:02:15 PDT 2024
https://github.com/MaskRay updated https://github.com/llvm/llvm-project/pull/96402
>From 40a51adc9ee03320b3234c0d472d42986650974d Mon Sep 17 00:00:00 2001
From: Fangrui Song <i at maskray.me>
Date: Sat, 22 Jun 2024 10:50:27 -0700
Subject: [PATCH 1/3] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20in?=
=?UTF-8?q?itial=20version?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Created using spr 1.3.5-bogner
---
llvm/include/llvm/MC/MCContext.h | 6 +++++-
llvm/lib/MC/MCCodeView.cpp | 4 ++--
llvm/lib/MC/MCFragment.cpp | 36 +++++++++++++++-----------------
3 files changed, 24 insertions(+), 22 deletions(-)
diff --git a/llvm/include/llvm/MC/MCContext.h b/llvm/include/llvm/MC/MCContext.h
index 6c977a5bc0f1f..0f18ce5df1701 100644
--- a/llvm/include/llvm/MC/MCContext.h
+++ b/llvm/include/llvm/MC/MCContext.h
@@ -136,6 +136,9 @@ class MCContext {
/// objects.
BumpPtrAllocator Allocator;
+ /// For MCFragment instances.
+ BumpPtrAllocator FragmentAllocator;
+
SpecificBumpPtrAllocator<MCSectionCOFF> COFFAllocator;
SpecificBumpPtrAllocator<MCSectionDXContainer> DXCAllocator;
SpecificBumpPtrAllocator<MCSectionELF> ELFAllocator;
@@ -432,7 +435,8 @@ class MCContext {
MCInst *createMCInst();
template <typename F, typename... Args> F *allocFragment(Args &&...args) {
- return new F(std::forward<Args>(args)...);
+ return new (FragmentAllocator.Allocate(sizeof(F), alignof(F)))
+ F(std::forward<Args>(args)...);
}
/// \name Symbol Management
diff --git a/llvm/lib/MC/MCCodeView.cpp b/llvm/lib/MC/MCCodeView.cpp
index 713ae07c3a730..89b28b4da575f 100644
--- a/llvm/lib/MC/MCCodeView.cpp
+++ b/llvm/lib/MC/MCCodeView.cpp
@@ -29,8 +29,8 @@ using namespace llvm::codeview;
CodeViewContext::~CodeViewContext() {
// If someone inserted strings into the string table but never actually
// emitted them somewhere, clean up the fragment.
- if (!InsertedStrTabFragment)
- delete StrTabFragment;
+ if (!InsertedStrTabFragment && StrTabFragment)
+ StrTabFragment->destroy();
}
/// This is a valid number for use with .cv_loc if we've already seen a .cv_file
diff --git a/llvm/lib/MC/MCFragment.cpp b/llvm/lib/MC/MCFragment.cpp
index d90fd34815bda..5347d99e2a4f3 100644
--- a/llvm/lib/MC/MCFragment.cpp
+++ b/llvm/lib/MC/MCFragment.cpp
@@ -203,59 +203,57 @@ MCFragment::MCFragment(FragmentType Kind, bool HasInstructions)
void MCFragment::destroy() {
// First check if we are the sentinel.
- if (Kind == FragmentType(~0)) {
- delete this;
+ if (Kind == FragmentType(~0))
return;
- }
switch (Kind) {
case FT_Align:
- delete cast<MCAlignFragment>(this);
+ cast<MCAlignFragment>(this)->~MCAlignFragment();
return;
case FT_Data:
- delete cast<MCDataFragment>(this);
+ cast<MCDataFragment>(this)->~MCDataFragment();
return;
case FT_CompactEncodedInst:
- delete cast<MCCompactEncodedInstFragment>(this);
+ cast<MCCompactEncodedInstFragment>(this)->~MCCompactEncodedInstFragment();
return;
case FT_Fill:
- delete cast<MCFillFragment>(this);
+ cast<MCFillFragment>(this)->~MCFillFragment();
return;
case FT_Nops:
- delete cast<MCNopsFragment>(this);
+ cast<MCNopsFragment>(this)->~MCNopsFragment();
return;
case FT_Relaxable:
- delete cast<MCRelaxableFragment>(this);
+ cast<MCRelaxableFragment>(this)->~MCRelaxableFragment();
return;
case FT_Org:
- delete cast<MCOrgFragment>(this);
+ cast<MCOrgFragment>(this)->~MCOrgFragment();
return;
case FT_Dwarf:
- delete cast<MCDwarfLineAddrFragment>(this);
+ cast<MCDwarfLineAddrFragment>(this)->~MCDwarfLineAddrFragment();
return;
case FT_DwarfFrame:
- delete cast<MCDwarfCallFrameFragment>(this);
+ cast<MCDwarfCallFrameFragment>(this)->~MCDwarfCallFrameFragment();
return;
case FT_LEB:
- delete cast<MCLEBFragment>(this);
+ cast<MCLEBFragment>(this)->~MCLEBFragment();
return;
case FT_BoundaryAlign:
- delete cast<MCBoundaryAlignFragment>(this);
+ cast<MCBoundaryAlignFragment>(this)->~MCBoundaryAlignFragment();
return;
case FT_SymbolId:
- delete cast<MCSymbolIdFragment>(this);
+ cast<MCSymbolIdFragment>(this)->~MCSymbolIdFragment();
return;
case FT_CVInlineLines:
- delete cast<MCCVInlineLineTableFragment>(this);
+ cast<MCCVInlineLineTableFragment>(this)->~MCCVInlineLineTableFragment();
return;
case FT_CVDefRange:
- delete cast<MCCVDefRangeFragment>(this);
+ cast<MCCVDefRangeFragment>(this)->~MCCVDefRangeFragment();
return;
case FT_PseudoProbe:
- delete cast<MCPseudoProbeAddrFragment>(this);
+ cast<MCPseudoProbeAddrFragment>(this)->~MCPseudoProbeAddrFragment();
return;
case FT_Dummy:
- delete cast<MCDummyFragment>(this);
+ cast<MCDummyFragment>(this)->~MCDummyFragment();
return;
}
}
>From 1c7dad037a4118bb6bd0834366b8acbf1ba6a56f Mon Sep 17 00:00:00 2001
From: Fangrui Song <i at maskray.me>
Date: Sat, 22 Jun 2024 11:55:37 -0700
Subject: [PATCH 2/3] remove dead condition
Created using spr 1.3.5-bogner
---
llvm/lib/MC/MCFragment.cpp | 4 ----
1 file changed, 4 deletions(-)
diff --git a/llvm/lib/MC/MCFragment.cpp b/llvm/lib/MC/MCFragment.cpp
index 5347d99e2a4f3..b1ed594459da1 100644
--- a/llvm/lib/MC/MCFragment.cpp
+++ b/llvm/lib/MC/MCFragment.cpp
@@ -202,10 +202,6 @@ MCFragment::MCFragment(FragmentType Kind, bool HasInstructions)
: Kind(Kind), HasInstructions(HasInstructions), LinkerRelaxable(false) {}
void MCFragment::destroy() {
- // First check if we are the sentinel.
- if (Kind == FragmentType(~0))
- return;
-
switch (Kind) {
case FT_Align:
cast<MCAlignFragment>(this)->~MCAlignFragment();
>From 7a61f507091ebd5f3b2bf84c156dc94528c70e87 Mon Sep 17 00:00:00 2001
From: Fangrui Song <i at maskray.me>
Date: Sat, 22 Jun 2024 12:02:07 -0700
Subject: [PATCH 3/3] update MCContext::reset
Created using spr 1.3.5-bogner
---
llvm/lib/MC/MCContext.cpp | 1 +
1 file changed, 1 insertion(+)
diff --git a/llvm/lib/MC/MCContext.cpp b/llvm/lib/MC/MCContext.cpp
index bb87682dd2163..6dd81d816f534 100644
--- a/llvm/lib/MC/MCContext.cpp
+++ b/llvm/lib/MC/MCContext.cpp
@@ -155,6 +155,7 @@ void MCContext::reset() {
InlineAsmUsedLabelNames.clear();
Symbols.clear();
Allocator.Reset();
+ FragmentAllocator.Reset();
Instances.clear();
CompilationDir.clear();
MainFileName.clear();
More information about the llvm-commits
mailing list