[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 14:18:29 PDT 2009
On Sep 1, 2009, at 1:54 PM, Evan Cheng wrote:
>
> On Sep 1, 2009, at 1:39 PM, Jim Grosbach wrote:
>
>>
>> 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.
>
> 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.
-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