diff --git a/llvm/lib/CodeGen/AsmPrinter/EHStreamer.cpp b/llvm/lib/CodeGen/AsmPrinter/EHStreamer.cpp --- a/llvm/lib/CodeGen/AsmPrinter/EHStreamer.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/EHStreamer.cpp @@ -663,9 +663,9 @@ Asm->OutStreamer->emitLabel(CSRange.ExceptionLabel); // Emit the LSDA header. - // If only one call-site range exists, LPStart is omitted as it is the - // same as the function entry. - if (CallSiteRanges.size() == 1) { + // LPStart is omitted if either we have a single call-site range exist, or + // if there are no landing pads. + if (CallSiteRanges.size() == 1 || LandingPadRange == nullptr) { Asm->emitEncodingByte(dwarf::DW_EH_PE_omit, "@LPStart"); } else if (!Asm->isPositionIndependent()) { // For more than one call-site ranges, LPStart must be explicitly diff --git a/llvm/test/CodeGen/X86/gcc_except_table_bb_sections_nolpads.ll b/llvm/test/CodeGen/X86/gcc_except_table_bb_sections_nolpads.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/X86/gcc_except_table_bb_sections_nolpads.ll @@ -0,0 +1,27 @@ +;; Verify that @LPStart is omitted when there are no landing pads. This test +;; uses an unkown personality to force emitting the exception table. + +; RUN: llc -basic-block-sections=all -mtriple=x86_64 -code-model=small < %s | FileCheck %s + +declare void @throwit() +declare i32 @__unknown_ehpersonality(...) + +define void @foo(i1 %cond) uwtable personality ptr @__unknown_ehpersonality { +entry: + br i1 %cond, label %cond.true, label %cond.false + +cond.true: ; preds = %entry + call void @throwit() + unreachable + +cond.false: ; preds = %entry + ret void +} + +; CHECK: GCC_except_table0: +; CHECK-NEXT: .Lexception0: +; CHECK-NEXT: .byte 255 # @LPStart Encoding = omit +; CHECK: .Lexception1: +; CHECK-NEXT: .byte 255 # @LPStart Encoding = omit +; CHECK: .Lexception2: +; CHECK-NEXT: .byte 255 # @LPStart Encoding = omit