OSDN Git Service

Enable EH for linux/ppc32 targets
authorNicolas Geoffray <nicolas.geoffray@lip6.fr>
Fri, 21 Dec 2007 12:19:44 +0000 (12:19 +0000)
committerNicolas Geoffray <nicolas.geoffray@lip6.fr>
Fri, 21 Dec 2007 12:19:44 +0000 (12:19 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@45281 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/PowerPC/PPCISelLowering.cpp
lib/Target/PowerPC/PPCTargetAsmInfo.cpp

index 5dbe801..411899c 100644 (file)
@@ -167,14 +167,12 @@ PPCTargetLowering::PPCTargetLowering(PPCTargetMachine &TM)
   // Support label based line numbers.
   setOperationAction(ISD::LOCATION, MVT::Other, Expand);
   setOperationAction(ISD::DEBUG_LOC, MVT::Other, Expand);
-  if (!TM.getSubtarget<PPCSubtarget>().isDarwin()) {
-    setOperationAction(ISD::LABEL, MVT::Other, Expand);
-  } else {
-    setOperationAction(ISD::EXCEPTIONADDR, MVT::i64, Expand);
-    setOperationAction(ISD::EHSELECTION,   MVT::i64, Expand);
-    setOperationAction(ISD::EXCEPTIONADDR, MVT::i32, Expand);
-    setOperationAction(ISD::EHSELECTION,   MVT::i32, Expand);
-  }
+  
+  setOperationAction(ISD::EXCEPTIONADDR, MVT::i64, Expand);
+  setOperationAction(ISD::EHSELECTION,   MVT::i64, Expand);
+  setOperationAction(ISD::EXCEPTIONADDR, MVT::i32, Expand);
+  setOperationAction(ISD::EHSELECTION,   MVT::i32, Expand);
+  
   
   // We want to legalize GlobalAddress and ConstantPool nodes into the 
   // appropriate instructions to materialize the address.
@@ -1771,9 +1769,9 @@ static SDOperand LowerCALL(SDOperand Op, SelectionDAG &DAG,
   // If the callee is a GlobalAddress/ExternalSymbol node (quite common, every
   // direct call is) turn it into a TargetGlobalAddress/TargetExternalSymbol
   // node so that legalize doesn't hack it.
-  if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee))
-    Callee = DAG.getTargetGlobalAddress(G->getGlobal(), Callee.getValueType());
-  else if (ExternalSymbolSDNode *S = dyn_cast<ExternalSymbolSDNode>(Callee))
+  //if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee))
+  //  Callee = DAG.getTargetGlobalAddress(G->getGlobal(), Callee.getValueType());
+  if (ExternalSymbolSDNode *S = dyn_cast<ExternalSymbolSDNode>(Callee))
     Callee = DAG.getTargetExternalSymbol(S->getSymbol(), Callee.getValueType());
   else if (SDNode *Dest = isBLACompatibleAddress(Callee, DAG))
     // If this is an absolute destination address, use the munged value.
index 4a37413..f90c0f7 100644 (file)
@@ -28,10 +28,6 @@ PPCTargetAsmInfo::PPCTargetAsmInfo(const PPCTargetMachine &TM) {
   InlineAsmEnd = "# InlineAsm End";
   AssemblerDialect = TM.getSubtargetImpl()->getAsmFlavor();
   
-  NeedsSet = true;
-  DwarfEHFrameSection =
-  ".section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support";
-  DwarfExceptionSection = ".section __DATA,__gcc_except_tab";
 }
 
 DarwinTargetAsmInfo::DarwinTargetAsmInfo(const PPCTargetMachine &TM)
@@ -60,7 +56,12 @@ DarwinTargetAsmInfo::DarwinTargetAsmInfo(const PPCTargetMachine &TM)
   HiddenDirective = "\t.private_extern\t";
   SupportsExceptionHandling = true;
   NeedsIndirectEncoding = true;
+  NeedsSet = true;
   BSSSection = 0;
+  
+  DwarfEHFrameSection =
+  ".section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support";
+  DwarfExceptionSection = ".section __DATA,__gcc_except_tab";
 
   DwarfAbbrevSection = ".section __DWARF,__debug_abbrev,regular,debug";
   DwarfInfoSection = ".section __DWARF,__debug_info,regular,debug";
@@ -98,6 +99,9 @@ LinuxTargetAsmInfo::LinuxTargetAsmInfo(const PPCTargetMachine &TM)
   WeakRefDirective = "\t.weak\t";
   BSSSection = "\t.section\t\".sbss\",\"aw\",@nobits";
 
+  // Debug Information
+  AbsoluteDebugSectionOffsets = true;
+  SupportsDebugInformation = true;
   DwarfAbbrevSection =  "\t.section\t.debug_abbrev,\"\",@progbits";
   DwarfInfoSection =    "\t.section\t.debug_info,\"\",@progbits";
   DwarfLineSection =    "\t.section\t.debug_line,\"\",@progbits";
@@ -109,4 +113,20 @@ LinuxTargetAsmInfo::LinuxTargetAsmInfo(const PPCTargetMachine &TM)
   DwarfARangesSection = "\t.section\t.debug_aranges,\"\",@progbits";
   DwarfRangesSection =  "\t.section\t.debug_ranges,\"\",@progbits";
   DwarfMacInfoSection = "\t.section\t.debug_macinfo,\"\",@progbits";
+
+  ReadOnlySection = "\t.section\t.rodata";
+  FourByteConstantSection = "\t.section\t.rodata.cst4,\"aM\",@progbits,4";
+  EightByteConstantSection = "\t.section\t.rodata.cst8,\"aM\",@progbits,8";
+  SixteenByteConstantSection = "\t.section\t.rodata.cst16,\"aM\",@progbits,16";
+  PCSymbol = ".";
+
+  // Set up DWARF directives
+  HasLEB128 = true;  // Target asm supports leb128 directives (little-endian)
+
+  // Exceptions handling
+  if (!TM.getSubtargetImpl()->isPPC64())
+    SupportsExceptionHandling = true;
+  AbsoluteEHSectionOffsets = false;
+  DwarfEHFrameSection = "\t.section\t.eh_frame,\"aw\",@progbits";
+  DwarfExceptionSection = "\t.section\t.gcc_except_table,\"a\",@progbits";
 }