[llvm] [BOLT] Use ULEB128 encoding for PIE/DSO exception tables (PR #116911)
Maksim Panchenko via llvm-commits
llvm-commits at lists.llvm.org
Tue Nov 19 19:29:50 PST 2024
https://github.com/maksfb created https://github.com/llvm/llvm-project/pull/116911
Use ULEB128 encoding for call sites in PIE/DSO binaries. The encoding reduces the size of the tables compared to sdata4 and is the default format used by Clang.
Note that for fixed-address executables we still use absolute addressing to cover cases where landing pads can reside in different function fragments.
For testing, we rely on runtime EH tests.
>From 0c3cda3f7cd03e5770ea1f17933481690eae4551 Mon Sep 17 00:00:00 2001
From: Maksim Panchenko <maks at fb.com>
Date: Tue, 19 Nov 2024 19:15:18 -0800
Subject: [PATCH] [BOLT] Use ULEB128 encoding for PIE/DSO exception tables
Use ULEB128 encoding for call sites in PIE/DSO binaries. The encoding
reduces the size of the tables compared to sdata4 and is the default
format used by Clang.
Note that for fixed-address executables we still use absolute
addressing to cover cases where landing pads can reside in different
function fragments.
---
bolt/lib/Core/BinaryEmitter.cpp | 18 +++++++++++++-----
1 file changed, 13 insertions(+), 5 deletions(-)
diff --git a/bolt/lib/Core/BinaryEmitter.cpp b/bolt/lib/Core/BinaryEmitter.cpp
index 408663180935c2..7c4ff960a439d1 100644
--- a/bolt/lib/Core/BinaryEmitter.cpp
+++ b/bolt/lib/Core/BinaryEmitter.cpp
@@ -959,9 +959,9 @@ void BinaryEmitter::emitLSDA(BinaryFunction &BF, const FunctionFragment &FF) {
if (NeedsLPAdjustment)
LPOffsetExpr = MCBinaryExpr::createAdd(
LPOffsetExpr, MCConstantExpr::create(1, *BC.Ctx), *BC.Ctx);
- Streamer.emitValue(LPOffsetExpr, 4);
+ Streamer.emitULEB128Value(LPOffsetExpr);
} else {
- Streamer.emitIntValue(0, 4);
+ Streamer.emitULEB128IntValue(0);
}
};
}
@@ -979,7 +979,10 @@ void BinaryEmitter::emitLSDA(BinaryFunction &BF, const FunctionFragment &FF) {
// Emit the landing pad call site table. We use signed data4 since we can emit
// a landing pad in a different part of the split function that could appear
// earlier in the address space than LPStart.
- Streamer.emitIntValue(dwarf::DW_EH_PE_sdata4, 1);
+ if (BC.HasFixedLoadAddress)
+ Streamer.emitIntValue(dwarf::DW_EH_PE_sdata4, 1);
+ else
+ Streamer.emitIntValue(dwarf::DW_EH_PE_uleb128, 1);
MCSymbol *CSTStartLabel = BC.Ctx->createTempSymbol("CSTStart");
MCSymbol *CSTEndLabel = BC.Ctx->createTempSymbol("CSTEnd");
@@ -996,8 +999,13 @@ void BinaryEmitter::emitLSDA(BinaryFunction &BF, const FunctionFragment &FF) {
// Start of the range is emitted relative to the start of current
// function split part.
- Streamer.emitAbsoluteSymbolDiff(BeginLabel, StartSymbol, 4);
- Streamer.emitAbsoluteSymbolDiff(EndLabel, BeginLabel, 4);
+ if (BC.HasFixedLoadAddress) {
+ Streamer.emitAbsoluteSymbolDiff(BeginLabel, StartSymbol, 4);
+ Streamer.emitAbsoluteSymbolDiff(EndLabel, BeginLabel, 4);
+ } else {
+ Streamer.emitAbsoluteSymbolDiffAsULEB128(BeginLabel, StartSymbol);
+ Streamer.emitAbsoluteSymbolDiffAsULEB128(EndLabel, BeginLabel);
+ }
emitLandingPad(CallSite.LP);
Streamer.emitULEB128IntValue(CallSite.Action);
}
More information about the llvm-commits
mailing list