[llvm-commits] [llvm] r80649 - in /llvm/trunk: include/llvm/CodeGen/AsmPrinter.h lib/CodeGen/AsmPrinter/DwarfException.cpp lib/CodeGen/AsmPrinter/DwarfPrinter.cpp lib/CodeGen/AsmPrinter/DwarfPrinter.h lib/Target/ARM/ARMConstantPoolValue.cpp lib/Target/ARM/ARMConstantPoolValue.h lib/Target/ARM/ARMISelLowering.cpp lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp test/CodeGen/ARM/2009-08-31-LSDA-Name.ll

Evan Cheng evan.cheng at apple.com
Tue Sep 1 00:56:02 PDT 2009


Comments below.

On Aug 31, 2009, at 6:57 PM, Jim Grosbach wrote:

> Author: grosbach
> Date: Mon Aug 31 20:57:56 2009
> New Revision: 80649
>
> URL: http://llvm.org/viewvc/llvm-project?rev=80649&view=rev
> Log:
> Clean up LSDA name generation and use for SJLJ exception handling.  
> This
> makes an eggregious hack somewhat more palatable. Bringing the LSDA  
> forward
> and making it a GV available for reference would be even better, but  
> is
> beyond the scope of what I'm looking to solve at this point.
>
> Objective C++ code could generate function names that broke the  
> previous
> scheme. This fixes that.
>
> Added:
>    llvm/trunk/test/CodeGen/ARM/2009-08-31-LSDA-Name.ll
> Modified:
>    llvm/trunk/include/llvm/CodeGen/AsmPrinter.h
>    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp
>    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfPrinter.cpp
>    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfPrinter.h
>    llvm/trunk/lib/Target/ARM/ARMConstantPoolValue.cpp
>    llvm/trunk/lib/Target/ARM/ARMConstantPoolValue.h
>    llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp
>    llvm/trunk/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp
>
> Modified: llvm/trunk/include/llvm/CodeGen/AsmPrinter.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/AsmPrinter.h?rev=80649&r1=80648&r2=80649&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/include/llvm/CodeGen/AsmPrinter.h (original)
> +++ llvm/trunk/include/llvm/CodeGen/AsmPrinter.h Mon Aug 31 20:57:56  
> 2009
> @@ -172,6 +172,10 @@
>     ///
>     std::string getCurrentFunctionEHName(const MachineFunction *MF)  
> const;
>
> +    /// getFunctionNumber - Return a unique ID for the current  
> function.
> +    ///
> +    unsigned getFunctionNumber() const { return FunctionNumber; }
> +
>   protected:
>     /// getAnalysisUsage - Record analysis usage.
>     ///
> @@ -217,10 +221,6 @@
>     /// is being processed from runOnMachineFunction.
>     void SetupMachineFunction(MachineFunction &MF);
>
> -    /// getFunctionNumber - Return a unique ID for the current  
> function.
> -    ///
> -    unsigned getFunctionNumber() const { return FunctionNumber; }
> -

Is this necessary? DwarfException should be using SubprogramCount, no?


>     /// IncrementFunctionNumber - Increase Function Number.   
> AsmPrinters should
>     /// not normally call this, as the counter is automatically  
> bumped by
>     /// SetupMachineFunction.
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp?rev=80649&r1=80648&r2=80649&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp Mon Aug 31  
> 20:57:56 2009
> @@ -25,9 +25,11 @@
> #include "llvm/Target/TargetOptions.h"
> #include "llvm/Target/TargetRegisterInfo.h"
> #include "llvm/Support/Dwarf.h"
> +#include "llvm/Support/Mangler.h"
> #include "llvm/Support/Timer.h"
> #include "llvm/Support/raw_ostream.h"
> #include "llvm/ADT/StringExtras.h"
> +#include <sstream>
> using namespace llvm;
>
> static TimerGroup &getDwarfTimerGroup() {
> @@ -599,9 +601,12 @@
>
>   EmitLabel("exception", SubprogramCount);
>   if (MAI->getExceptionHandlingType() == ExceptionHandling::SjLj) {
> -    std::string SjLjName = "_lsda_";
> -    SjLjName += MF->getFunction()->getName().str();
> -    EmitLabel(SjLjName.c_str(), 0);
> +    std::stringstream out;
> +    out << Asm->getFunctionNumber();

SubprogramCount?

> +    std::string LSDAName =
> +      Asm->Mang->makeNameProper(std::string("LSDA_") + out.str(),
> +                                Mangler::Private);
> +    EmitLabel(LSDAName.c_str(), 0, false);

Rather than making arbitrary change Dwarf::PrintLabelName and  
Dwarf::EmitLabel to accommodate this, why not just do
out <<  LSDAName << 0 << ":\n";

Evan

>   }
>
>   // Emit the header.
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfPrinter.cpp?rev=80649&r1=80648&r2=80649&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfPrinter.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfPrinter.cpp Mon Aug 31  
> 20:57:56 2009
> @@ -43,21 +43,27 @@
>
> /// PrintLabelName - Print label name in form used by Dwarf writer.
> ///
> -void Dwarf::PrintLabelName(const char *Tag, unsigned Number) const {
> -  O << MAI->getPrivateGlobalPrefix() << Tag;
> +void Dwarf::PrintLabelName(const char *Tag, unsigned Number,
> +                           bool ForcePrivate) const {
> +  if (ForcePrivate)
> +    O << MAI->getPrivateGlobalPrefix();
> +  O << Tag;
>   if (Number) O << Number;
> }
> void Dwarf::PrintLabelName(const char *Tag, unsigned Number,
> -                           const char *Suffix) const {
> -  O << MAI->getPrivateGlobalPrefix() << Tag;
> +                           const char *Suffix, bool ForcePrivate)  
> const {
> +  if (ForcePrivate)
> +    O << MAI->getPrivateGlobalPrefix();
> +  O << Tag;
>   if (Number) O << Number;
>   O << Suffix;
> }
>
> /// EmitLabel - Emit location label for internal use by Dwarf.
> ///
> -void Dwarf::EmitLabel(const char *Tag, unsigned Number) const {
> -  PrintLabelName(Tag, Number);
> +void Dwarf::EmitLabel(const char *Tag, unsigned Number,
> +                      bool ForcePrivate) const {
> +  PrintLabelName(Tag, Number, ForcePrivate);
>   O << ":\n";
> }
>
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfPrinter.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfPrinter.h?rev=80649&r1=80648&r2=80649&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfPrinter.h (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfPrinter.h Mon Aug 31  
> 20:57:56 2009
> @@ -100,16 +100,18 @@
>     void PrintLabelName(const DWLabel &Label) const {
>       PrintLabelName(Label.getTag(), Label.getNumber());
>     }
> -    void PrintLabelName(const char *Tag, unsigned Number) const;
>     void PrintLabelName(const char *Tag, unsigned Number,
> -                        const char *Suffix) const;
> +                        bool ForcePrivate = true) const;
> +    void PrintLabelName(const char *Tag, unsigned Number,
> +                        const char *Suffix, bool ForcePrivate =  
> true) const;
>
>     /// EmitLabel - Emit location label for internal use by Dwarf.
>     ///
>     void EmitLabel(const DWLabel &Label) const {
>       EmitLabel(Label.getTag(), Label.getNumber());
>     }
> -    void EmitLabel(const char *Tag, unsigned Number) const;
> +    void EmitLabel(const char *Tag, unsigned Number,
> +                   bool ForcePrivate = true) const;
>
>     /// EmitReference - Emit a reference to a label.
>     ///
>
> Modified: llvm/trunk/lib/Target/ARM/ARMConstantPoolValue.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMConstantPoolValue.cpp?rev=80649&r1=80648&r2=80649&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/Target/ARM/ARMConstantPoolValue.cpp (original)
> +++ llvm/trunk/lib/Target/ARM/ARMConstantPoolValue.cpp Mon Aug 31  
> 20:57:56 2009
> @@ -20,11 +20,12 @@
> using namespace llvm;
>
> ARMConstantPoolValue::ARMConstantPoolValue(GlobalValue *gv, unsigned  
> id,
> +                                           ARMCP::ARMCPKind K,
>                                            unsigned char PCAdj,
>                                            const char *Modif,
>                                            bool AddCA)
>   : MachineConstantPoolValue((const Type*)gv->getType()),
> -    GV(gv), S(NULL), LabelId(id), PCAdjust(PCAdj),
> +    GV(gv), S(NULL), LabelId(id), Kind(K), PCAdjust(PCAdj),
>     Modifier(Modif), AddCurrentAddress(AddCA) {}
>
> ARMConstantPoolValue::ARMConstantPoolValue(LLVMContext &C,
> @@ -33,12 +34,12 @@
>                                            const char *Modif,
>                                            bool AddCA)
>   : MachineConstantPoolValue((const Type*)Type::getInt32Ty(C)),
> -    GV(NULL), S(strdup(s)), LabelId(id), PCAdjust(PCAdj),
> +    GV(NULL), S(strdup(s)), LabelId(id), Kind(ARMCP::CPValue),  
> PCAdjust(PCAdj),
>     Modifier(Modif), AddCurrentAddress(AddCA) {}
>
> ARMConstantPoolValue::ARMConstantPoolValue(GlobalValue *gv, const  
> char *Modif)
>   : MachineConstantPoolValue((const Type*)Type::getInt32Ty(gv- 
> >getContext())),
> -    GV(gv), S(NULL), LabelId(0), PCAdjust(0),
> +    GV(gv), S(NULL), Kind(ARMCP::CPValue), LabelId(0), PCAdjust(0),
>     Modifier(Modif) {}
>
> int  
> ARMConstantPoolValue::getExistingMachineCPValue(MachineConstantPool  
> *CP,
>
> Modified: llvm/trunk/lib/Target/ARM/ARMConstantPoolValue.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMConstantPoolValue.h?rev=80649&r1=80648&r2=80649&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/Target/ARM/ARMConstantPoolValue.h (original)
> +++ llvm/trunk/lib/Target/ARM/ARMConstantPoolValue.h Mon Aug 31  
> 20:57:56 2009
> @@ -21,12 +21,20 @@
> class GlobalValue;
> class LLVMContext;
>
> +namespace ARMCP {
> +  enum ARMCPKind {
> +    CPValue,
> +    CPLSDA
> +  };
> +}
> +
> /// ARMConstantPoolValue - ARM specific constantpool value. This is  
> used to
> /// represent PC relative displacement between the address of the load
> /// instruction and the global value being loaded, i.e. (&GV-(LPIC 
> +8)).
> class ARMConstantPoolValue : public MachineConstantPoolValue {
>   GlobalValue *GV;         // GlobalValue being loaded.
>   const char *S;           // ExtSymbol being loaded.
> +  ARMCP::ARMCPKind Kind;   // Value or LSDA?
>   unsigned LabelId;        // Label id of the load.
>   unsigned char PCAdjust;  // Extra adjustment if constantpool is pc  
> relative.
>                            // 8 for ARM, 4 for Thumb.
> @@ -35,6 +43,7 @@
>
> public:
>   ARMConstantPoolValue(GlobalValue *gv, unsigned id,
> +                       ARMCP::ARMCPKind Kind = ARMCP::CPValue,
>                        unsigned char PCAdj = 0, const char *Modifier  
> = NULL,
>                        bool AddCurrentAddress = false);
>   ARMConstantPoolValue(LLVMContext &C, const char *s, unsigned id,
> @@ -52,6 +61,7 @@
>   bool mustAddCurrentAddress() const { return AddCurrentAddress; }
>   unsigned getLabelId() const { return LabelId; }
>   unsigned char getPCAdjustment() const { return PCAdjust; }
> +  bool isLSDA() { return Kind == ARMCP::CPLSDA; }
>
>   virtual unsigned getRelocationInfo() const {
>     // FIXME: This is conservatively claiming that these entries  
> require a
>
> Modified: llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp?rev=80649&r1=80648&r2=80649&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp (original)
> +++ llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp Mon Aug 31  
> 20:57:56 2009
> @@ -40,6 +40,7 @@
> #include "llvm/ADT/VectorExtras.h"
> #include "llvm/Support/ErrorHandling.h"
> #include "llvm/Support/MathExtras.h"
> +#include <sstream>
> using namespace llvm;
>
> static bool CC_ARM_APCS_Custom_f64(unsigned &ValNo, EVT &ValVT, EVT  
> &LocVT,
> @@ -969,7 +970,8 @@
>     // tBX takes a register source operand.
>     if (isARMFunc && Subtarget->isThumb1Only() && !Subtarget- 
> >hasV5TOps()) {
>       ARMConstantPoolValue *CPV = new ARMConstantPoolValue(GV,
> -                                                            
> ARMPCLabelIndex, 4);
> +                                                            
> ARMPCLabelIndex,
> +                                                            
> ARMCP::CPValue, 4);
>       SDValue CPAddr = DAG.getTargetConstantPool(CPV,  
> getPointerTy(), 4);
>       CPAddr = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, CPAddr);
>       Callee = DAG.getLoad(getPointerTy(), dl,
> @@ -1166,7 +1168,7 @@
>   unsigned char PCAdj = Subtarget->isThumb() ? 4 : 8;
>   ARMConstantPoolValue *CPV =
>     new ARMConstantPoolValue(GA->getGlobal(), ARMPCLabelIndex,
> -                             PCAdj, "tlsgd", true);
> +                             ARMCP::CPValue, PCAdj, "tlsgd", true);
>   SDValue Argument = DAG.getTargetConstantPool(CPV, PtrVT, 4);
>   Argument = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, Argument);
>   Argument = DAG.getLoad(PtrVT, dl, DAG.getEntryNode(), Argument,  
> NULL, 0);
> @@ -1208,7 +1210,7 @@
>     unsigned char PCAdj = Subtarget->isThumb() ? 4 : 8;
>     ARMConstantPoolValue *CPV =
>       new ARMConstantPoolValue(GA->getGlobal(), ARMPCLabelIndex,
> -                               PCAdj, "gottpoff", true);
> +                               ARMCP::CPValue, PCAdj, "gottpoff",  
> true);
>     Offset = DAG.getTargetConstantPool(CPV, PtrVT, 4);
>     Offset = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, Offset);
>     Offset = DAG.getLoad(PtrVT, dl, Chain, Offset, NULL, 0);
> @@ -1284,7 +1286,7 @@
>   else {
>     unsigned PCAdj = (RelocM != Reloc::PIC_) ? 0 : (Subtarget- 
> >isThumb()?4:8);
>     ARMConstantPoolValue *CPV =
> -      new ARMConstantPoolValue(GV, ARMPCLabelIndex, PCAdj);
> +      new ARMConstantPoolValue(GV, ARMPCLabelIndex, ARMCP::CPValue,  
> PCAdj);
>     CPAddr = DAG.getTargetConstantPool(CPV, PtrVT, 4);
>   }
>   CPAddr = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, CPAddr);
> @@ -1375,10 +1377,6 @@
>     return DAG.getNode(ARMISD::THREAD_POINTER, dl, PtrVT);
>   }
>   case Intrinsic::eh_sjlj_lsda: {
> -    // blah. horrible, horrible hack with the forced magic name.
> -    // really need to clean this up. It belongs in the target- 
> independent
> -    // layer somehow that doesn't require the coupling with the asm
> -    // printer.
>     MachineFunction &MF = DAG.getMachineFunction();
>     EVT PtrVT = getPointerTy();
>     DebugLoc dl = Op.getDebugLoc();
> @@ -1386,13 +1384,9 @@
>     SDValue CPAddr;
>     unsigned PCAdj = (RelocM != Reloc::PIC_)
>       ? 0 : (Subtarget->isThumb() ? 4 : 8);
> -    // Save off the LSDA name for the AsmPrinter to use when it's  
> time
> -    // to emit the table
> -    std::string LSDAName = "L_lsda_";
> -    LSDAName += MF.getFunction()->getName();
>     ARMConstantPoolValue *CPV =
> -      new ARMConstantPoolValue(*DAG.getContext(), LSDAName.c_str(),
> -                               ARMPCLabelIndex, PCAdj);
> +      new ARMConstantPoolValue(MF.getFunction(), ARMPCLabelIndex,
> +                               ARMCP::CPLSDA, PCAdj);
>     CPAddr = DAG.getTargetConstantPool(CPV, PtrVT, 4);
>     CPAddr = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, CPAddr);
>     SDValue Result =
>
> Modified: llvm/trunk/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp?rev=80649&r1=80648&r2=80649&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp (original)
> +++ llvm/trunk/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp Mon Aug  
> 31 20:57:56 2009
> @@ -44,6 +44,7 @@
> #include "llvm/Support/MathExtras.h"
> #include "llvm/Support/FormattedStream.h"
> #include <cctype>
> +#include <sstream>
> using namespace llvm;
>
> STATISTIC(EmittedInsts, "Number of machine instrs printed");
> @@ -159,8 +160,13 @@
>       ARMConstantPoolValue *ACPV =  
> static_cast<ARMConstantPoolValue*>(MCPV);
>       GlobalValue *GV = ACPV->getGV();
>       std::string Name;
> -
> -      if (GV) {
> +
> +      if (ACPV->isLSDA()) {
> +        std::stringstream out;
> +        out << getFunctionNumber();
> +        Name = Mang->makeNameProper(std::string("LSDA_") + out.str(),
> +                                    Mangler::Private);
> +      } else if (GV) {
>         bool isIndirect = Subtarget->isTargetDarwin() &&
>           Subtarget->GVIsIndirectSymbol(GV,
>                                         TM.getRelocationModel() ==  
> Reloc::Static);
> @@ -175,9 +181,7 @@
>           else
>             GVNonLazyPtrs[SymName] = Name;
>         }
> -      } else if (!strncmp(ACPV->getSymbol(), "L_lsda_", 7))
> -        Name = ACPV->getSymbol();
> -      else
> +      } else
>         Name = Mang->makeNameProper(ACPV->getSymbol());
>       O << Name;
>
>
> Added: llvm/trunk/test/CodeGen/ARM/2009-08-31-LSDA-Name.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/2009-08-31-LSDA-Name.ll?rev=80649&view=auto
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/test/CodeGen/ARM/2009-08-31-LSDA-Name.ll (added)
> +++ llvm/trunk/test/CodeGen/ARM/2009-08-31-LSDA-Name.ll Mon Aug 31  
> 20:57:56 2009
> @@ -0,0 +1,103 @@
> +; RUN: llvm-as < %s | llc -march=arm -f | FileCheck %s
> +
> +%struct.A = type { i32* }
> +
> +define arm_apcscc void @"\01-[MyFunction Name:]"() {
> +entry:
> +  %save_filt.1 = alloca i32                       ; <i32*> [#uses=2]
> +  %save_eptr.0 = alloca i8*                       ; <i8**> [#uses=2]
> +  %a = alloca %struct.A                           ; <%struct.A*>  
> [#uses=3]
> +  %eh_exception = alloca i8*                      ; <i8**> [#uses=5]
> +  %eh_selector = alloca i32                       ; <i32*> [#uses=3]
> +  %"alloca point" = bitcast i32 0 to i32          ; <i32> [#uses=0]
> +  call arm_apcscc  void @_ZN1AC1Ev(%struct.A* %a)
> +  invoke arm_apcscc  void @_Z3barv()
> +          to label %invcont unwind label %lpad
> +
> +invcont:                                          ; preds = %entry
> +  call arm_apcscc  void @_ZN1AD1Ev(%struct.A* %a) nounwind
> +  br label %return
> +
> +bb:                                               ; preds = %ppad
> +  %eh_select = load i32* %eh_selector             ; <i32> [#uses=1]
> +  store i32 %eh_select, i32* %save_filt.1, align 4
> +  %eh_value = load i8** %eh_exception             ; <i8*> [#uses=1]
> +  store i8* %eh_value, i8** %save_eptr.0, align 4
> +  call arm_apcscc  void @_ZN1AD1Ev(%struct.A* %a) nounwind
> +  %0 = load i8** %save_eptr.0, align 4            ; <i8*> [#uses=1]
> +  store i8* %0, i8** %eh_exception, align 4
> +  %1 = load i32* %save_filt.1, align 4            ; <i32> [#uses=1]
> +  store i32 %1, i32* %eh_selector, align 4
> +  br label %Unwind
> +
> +return:                                           ; preds = %invcont
> +  ret void
> +
> +lpad:                                             ; preds = %entry
> +  %eh_ptr = call i8* @llvm.eh.exception()         ; <i8*> [#uses=1]
> +  store i8* %eh_ptr, i8** %eh_exception
> +  %eh_ptr1 = load i8** %eh_exception              ; <i8*> [#uses=1]
> +  %eh_select2 = call i32 (i8*, i8*, ...)* @llvm.eh.selector.i32(i8*  
> %eh_ptr1, i8* bitcast (i32 (...)* @__gxx_personality_sj0 to i8*),  
> i32 0) ; <i32> [#uses=1]
> +  store i32 %eh_select2, i32* %eh_selector
> +  br label %ppad
> +
> +ppad:                                             ; preds = %lpad
> +  br label %bb
> +
> +Unwind:                                           ; preds = %bb
> +  %eh_ptr3 = load i8** %eh_exception              ; <i8*> [#uses=1]
> +  call arm_apcscc  void @_Unwind_SjLj_Resume(i8* %eh_ptr3)
> +  unreachable
> +}
> +
> +define linkonce_odr arm_apcscc void @_ZN1AC1Ev(%struct.A* %this) {
> +entry:
> +  %this_addr = alloca %struct.A*                  ; <%struct.A**>  
> [#uses=2]
> +  %"alloca point" = bitcast i32 0 to i32          ; <i32> [#uses=0]
> +  store %struct.A* %this, %struct.A** %this_addr
> +  %0 = call arm_apcscc  i8* @_Znwm(i32 4)         ; <i8*> [#uses=1]
> +  %1 = bitcast i8* %0 to i32*                     ; <i32*> [#uses=1]
> +  %2 = load %struct.A** %this_addr, align 4       ; <%struct.A*>  
> [#uses=1]
> +  %3 = getelementptr inbounds %struct.A* %2, i32 0, i32 0 ; <i32**>  
> [#uses=1]
> +  store i32* %1, i32** %3, align 4
> +  br label %return
> +
> +return:                                           ; preds = %entry
> +  ret void
> +}
> +
> +declare arm_apcscc i8* @_Znwm(i32)
> +
> +define linkonce_odr arm_apcscc void @_ZN1AD1Ev(%struct.A* %this)  
> nounwind {
> +entry:
> +  %this_addr = alloca %struct.A*                  ; <%struct.A**>  
> [#uses=2]
> +  %"alloca point" = bitcast i32 0 to i32          ; <i32> [#uses=0]
> +  store %struct.A* %this, %struct.A** %this_addr
> +  %0 = load %struct.A** %this_addr, align 4       ; <%struct.A*>  
> [#uses=1]
> +  %1 = getelementptr inbounds %struct.A* %0, i32 0, i32 0 ; <i32**>  
> [#uses=1]
> +  %2 = load i32** %1, align 4                     ; <i32*> [#uses=1]
> +  %3 = bitcast i32* %2 to i8*                     ; <i8*> [#uses=1]
> +  call arm_apcscc  void @_ZdlPv(i8* %3) nounwind
> +  br label %bb
> +
> +bb:                                               ; preds = %entry
> +  br label %return
> +
> +return:                                           ; preds = %bb
> +  ret void
> +}
> +;CHECK: L_LSDA_1:
> +
> +declare arm_apcscc void @_ZdlPv(i8*) nounwind
> +
> +declare arm_apcscc void @_Z3barv()
> +
> +declare i8* @llvm.eh.exception() nounwind
> +
> +declare i32 @llvm.eh.selector.i32(i8*, i8*, ...) nounwind
> +
> +declare i32 @llvm.eh.typeid.for.i32(i8*) nounwind
> +
> +declare arm_apcscc i32 @__gxx_personality_sj0(...)
> +
> +declare arm_apcscc void @_Unwind_SjLj_Resume(i8*)
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list