[PATCH] Disable X86CallFrameOptimization on Darwin in presence of EH

Kuperstein, Michael M via llvm-commits llvm-commits at lists.llvm.org
Wed Oct 7 23:32:33 PDT 2015


LGTM

Thanks,
  Michael

-----Original Message-----
From: friss at apple.com [mailto:friss at apple.com] 
Sent: Thursday, October 08, 2015 09:25
To: Kuperstein, Michael M
Cc: llvm-commits
Subject: [PATCH] Disable X86CallFrameOptimization on Darwin in presence of EH

Hi Michael,

Here’s a patch to address r249522 issues on Darwin. How does that look?

[X86] Disable X86CallFrameOptimization on Darwin in presence of EH

We emit 1 compact unwind encoding per function, and this can’t represent the varying stack pointer that will be generated by X86CallFrameOptimization. Disable the optimization on Darwin.

(It might be possible to split the function into multiple ranges and emit 1 compact unwind info per range. The compact unwind emission code isn’t ready for that and this kind of info certainly isn’t tested/used anywhere. It might be worth exploring this path if we want to get the space savings at some point though)

--- a/lib/Target/X86/X86CallFrameOptimization.cpp
+++ b/lib/Target/X86/X86CallFrameOptimization.cpp
@@ -26,6 +26,7 @@
 #include "llvm/ADT/Statistic.h"
 #include "llvm/CodeGen/MachineFunctionPass.h"
 #include "llvm/CodeGen/MachineInstrBuilder.h"
+#include "llvm/CodeGen/MachineModuleInfo.h"
 #include "llvm/CodeGen/MachineRegisterInfo.h"
 #include "llvm/CodeGen/Passes.h"
 #include "llvm/IR/Function.h"
@@ -128,6 +129,11 @@ bool X86CallFrameOptimization::isLegal(MachineFunction &MF) {
   if (STI.is64Bit())
     return false;
 
+  // We can't encode multiple DW_CFA_GNU_args_size in the compact  // 
+ unwind encoding that Darwin uses.
+  if (STI.isTargetDarwin() && !MF.getMMI().getLandingPads().empty())
+    return false;
+
   // You would expect straight-line code between call-frame setup and
   // call-frame destroy. You would be wrong. There are circumstances (e.g.
   // CMOV_GR8 expansion of a select that feeds a function call!) where we can diff --git a/test/CodeGen/X86/push-cfi-obj.ll b/test/CodeGen/X86/push-cfi-obj.ll
index fcc18e2..43ab34e 100644
--- a/test/CodeGen/X86/push-cfi-obj.ll
+++ b/test/CodeGen/X86/push-cfi-obj.ll
@@ -1,4 +1,9 @@
 ; RUN: llc < %s -mtriple=i686-pc-linux -filetype=obj | llvm-readobj -s -sr -sd | FileCheck %s
+; RUN: llc < %s -mtriple=i686-darwin-macosx10.7 -filetype=obj | 
+llvm-readobj -sections | FileCheck -check-prefix=DARWIN %s
+
+; On darwin, check that we manage to generate the compact unwind 
+section ; DARWIN: Name: __compact_unwind ; DARWIN: Segment: __LD
 
 ; CHECK:         Index: 8
 ; CHECK-NEXT:    Name: .eh_frame (41)

---------------------------------------------------------------------
Intel Israel (74) Limited

This e-mail and any attachments may contain confidential material for
the sole use of the intended recipient(s). Any review or distribution
by others is strictly prohibited. If you are not the intended
recipient, please contact the sender and delete all copies.


More information about the llvm-commits mailing list