[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 16:09:32 PDT 2009


On Sep 1, 2009, at 2:18 PM, Jim Grosbach wrote:

>>>
>>
>> Can you give an example of what the .s looks like? I don't think I  
>> understand why the function number is needed.
>>
>
> Sure.  Here's a snipped from a test case that contains the constant  
> pool entry for the lsda (at LCPI7_0). At the end, the LSDA label  
> which the constant pool entry is referencing is emitted.
>
>       .align  2
>        LCPI7_0:
>        .long   L_LSDA_7-(LPC20+4)
>
>
> Leh_func_end5:
>        .section        __DATA,__gcc_except_tab
>        .align  2
> GCC_except_table5:
>        .byte   0x0                                         @ Padding
> Lexception5:
> L_LSDA_7:
>        .byte   0xFF                                        @  
> @LPStart format (DW_EH_PE_omit)
>
> The labels suffixed by '5' are from the DwarfWriter using the  
> SubprogramCount. The documentation entry for Subprogram counts is  
> slightly inaccurate when it says it's a running count of all  
> functions being compiled; it's actually a count only of those  
> functions which emit EH information (in  
> DwarfException::BeginFunction()). Thus, FunctionNumber and  
> SubprogramCount do indeed get out of sync currently.
>
> There's nothing magic about using the FunctionNumber as the suffix.  
> Anything that's a reproducible way to generate a unique one-per- 
> function label name will do. Using the function name, even mangled,  
> doesn't work well due to the strangeness that is Objective-C++,  
> which is what gave rise to the current implementation.
>
> We could, for a silly example, generate a random string and use that  
> for the label name so long as we could guarantee no repetition in  
> the sequence. The name would need to either be easily  
> rematerializable, or stored off someplace to be retrieved and used  
> by the DwarfException table printer later. The latter would need a  
> new API to support storing and retrieving the name. Keeping that  
> properly hidden away is roughly equivalent to handling the  
> FunctionNumber API reasonably.

Ok. Before this fix you used function name instead of function number,  
right? Function name is guaranteed to be consistent between the two.  
The only problem is DwarfException is not stripping out the '001'  
prefix in the case of objective-c++? Why not fix that problem instead?

Evan

>
> -Jim
>
>>>>>
>>>>>>
>>>>>> 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
>>>
>>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20090901/cdfeb15c/attachment.html>


More information about the llvm-commits mailing list