[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

Jim Grosbach grosbach at apple.com
Tue Sep 1 13:39:24 PDT 2009


On Sep 1, 2009, at 10:23 AM, Jim Grosbach wrote:

>
> On Sep 1, 2009, at 9:57 AM, Evan Cheng wrote:
>
>>
>> On Sep 1, 2009, at 7:58 AM, Jim Grosbach wrote:
>>
>>> O
>>>>
>>>>
>>>> Is this necessary? DwarfException should be using SubprogramCount,
>>>> no?
>>>
>>> I'd turn the question around. Why is DwarfException adding its own
>>> function counter when one is already available? Is there a reason
>>> we need two that are doing the same thing?
>>
>> These counters should stay private within the class. It's
>> implementation detail, not to be exposed publicly. DwarfException
>> and AsmPrinter counter do not have to be the same, right?
>
> I could use FunctionNumber in the ARM AsmPrinter, and then use
> SubprogramCount in the DwarfException printer. That makes me nervous,
> though, as there's no guarantee, beyond details of the implementation,
> that those two values will always stay in sync. It would introduce an
> additional level of coupling between the two that I'd prefer to avoid.
>
> Note that the SubprogramCount is not visible to the containing
> AsmPrinter, either. In the ARM AsmPrinter, the DwarfException is
> opaque. Exposing that value to the rest of the AsmPrinter would be
> more significant changes than exposing the FunctionNumber.
>
> I want to make sure that both bits of code pulled the information from
> the same place. Exposing the FunctionNumber seems the way to do that.
>

Just to clarify and make sure we're on the same page...

I do agree that exposing getFunctionNumber() is not a perfect  
solution. I just think relying on the SubprogramCount staying in sync  
with the FunctionNumber is even less attractive.

I would prefer to have a single source for that information rather  
than duplicating the counter. I really don't have any strong feelings  
about where that belongs. Exposing getFunctionNumber() was simply the  
least intrusive mechanism. Perhaps there's an appropriate place for a  
private API that both the AsmPrinter and the DwarfWriter can use?

If you have a preference for an alternative, I'm glad to revisit and  
work things differently.

-j



>
>> Evan
>>
>>>
>>> The constant pool entry is part of the ARM AsmPrinter, which has
>>> the getFunctionNumber() directly. It's the most straightforward
>>> solution for the Dwarf writer to use the same interface to output
>>> the table itself.
>>>
>>>>
>>>>
>>>>> /// 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";
>>>
>>> Simply consistency that labels get printed via EmitLabel. No strong
>>> preference either way. I'll change it.
>>>
>>>>
>>>> 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
>>>>
>>>
>>
>
> _______________________________________________
> 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