[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 17:47:11 PDT 2009


On Sep 1, 2009, at 5:38 PM, Evan Cheng wrote:

>
> On Sep 1, 2009, at 4:42 PM, Jim Grosbach wrote:
>
>>
>> On Sep 1, 2009, at 4:09 PM, Evan Cheng wrote:
>>
>>>
>>> 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?
>>
>> It turned out to be a touch more than just that. With the objective- 
>> c++ names, they need to be quoted, and the mangler explicitly won't  
>> add the private label prefix to names starting with 001 when doing  
>> the makeNameProper. I could tweak the mangler, or munge the string  
>> when it comes back, to add it, but that starts to get even more  
>> special purpose and fragile. Alternatively, letting the LSDA symbol  
>> not be an assembler private label some of the time doesn't feel  
>> right either. I wanted to keep this as simple as possible, so I  
>> went with the function number instead. No other reason than that.
>
> Ok. And the quote must be around the private label prefix? If not,  
> then that can be easily fixed.

Yes, the quote must be around the prefix.

>
>>
>> Earlier, I'd also considered adding an attribute to the function  
>> itself for the LSDA name and generating it in the SJLJ pass, then  
>> using it in the asm printer. That added an additional member to the  
>> Function class, plus the accessor methods, though, which seems like  
>> overkill and adds public APIs for the accessors that aren't needed  
>> for anything else, which I don't like.
>>
>> Other than wanting to keep this as simple as possible, I really  
>> don't much care about which details we use. If you prefer a  
>> mangling of the function name, I can do that.
>
> No. If it requires changing the mangler, then just leave it as it  
> is. It's ewww but the alternative is not any better.
>
> [...]
> The issue here is two places are independently constructing the name  
> of the label. The ARM asm printer should not have to do it.

Completely agreed on both counts.

Longer term, I believe the exception table should be constructed such  
that it's available as a GlobalValue and not constructed and emitted  
directly by the AsmPrinter. Then this becomes a GV constant pool  
reference just like any other, and the exception table goes out to the  
assembly file, or the object file, or whatever other emitter we have,  
without duplicating the logic required for constructing it.

Thanks for talking through things.

-Jim


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




More information about the llvm-commits mailing list