diff --git a/bolt/lib/Core/BinaryEmitter.cpp b/bolt/lib/Core/BinaryEmitter.cpp index d3ed9e8088bfa..7b5cd276fee89 100644 --- a/bolt/lib/Core/BinaryEmitter.cpp +++ b/bolt/lib/Core/BinaryEmitter.cpp @@ -373,8 +373,10 @@ bool BinaryEmitter::emitFunction(BinaryFunction &Function, Streamer.emitLabel(StartSymbol); } + const bool NeedsFDE = + Function.hasCFI() && !(Function.isPatch() && Function.isAnonymous()); // Emit CFI start - if (Function.hasCFI()) { + if (NeedsFDE) { Streamer.emitCFIStartProc(/*IsSimple=*/false); if (Function.getPersonalityFunction() != nullptr) Streamer.emitCFIPersonality(Function.getPersonalityFunction(), @@ -421,7 +423,7 @@ bool BinaryEmitter::emitFunction(BinaryFunction &Function, Streamer.emitBytes(BC.MIB->getTrapFillValue()); // Emit CFI end - if (Function.hasCFI()) + if (NeedsFDE) Streamer.emitCFIEndProc(); MCSymbol *EndSymbol = Function.getFunctionEndLabel(FF.getFragmentNum()); diff --git a/bolt/test/AArch64/lite-mode.s b/bolt/test/AArch64/lite-mode.s index d81206089aaef..a71edbe034669 100644 --- a/bolt/test/AArch64/lite-mode.s +++ b/bolt/test/AArch64/lite-mode.s @@ -11,6 +11,13 @@ # RUN: llvm-objdump -d --disassemble-symbols=cold_function %t.bolt \ # RUN: | FileCheck %s + +## Verify that the number of FDEs matches the number of functions in the output +## binary. There are three original functions and two optimized. +# RUN: llvm-readelf -u %t.bolt | grep -wc FDE \ +# RUN: | FileCheck --check-prefix=CHECK-FDE %s +# CHECK-FDE: 5 + ## In lite mode, optimized code will be separated from the original .text by ## over 128MB, making it impossible for call/bl instructions in cold functions ## to reach optimized functions directly.