1Pull in r200617 from upstream llvm trunk (by Venkatraman Govindaraju): 2 3 [Sparc] Set %o7 as the return address register instead of %i7 in MCRegisterInfo. Also, add CFI instructions to initialize the frame correctly. 4 5Introduced here: http://svnweb.freebsd.org/changeset/base/262261 6 7Index: lib/Target/Sparc/MCTargetDesc/SparcMCTargetDesc.cpp 8=================================================================== 9--- lib/Target/Sparc/MCTargetDesc/SparcMCTargetDesc.cpp 10+++ lib/Target/Sparc/MCTargetDesc/SparcMCTargetDesc.cpp 11@@ -33,6 +33,25 @@ 12 13 using namespace llvm; 14 15+ 16+static MCAsmInfo *createSparcMCAsmInfo(const MCRegisterInfo &MRI, 17+ StringRef TT) { 18+ MCAsmInfo *MAI = new SparcELFMCAsmInfo(TT); 19+ unsigned Reg = MRI.getDwarfRegNum(SP::O6, true); 20+ MCCFIInstruction Inst = MCCFIInstruction::createDefCfa(0, Reg, 0); 21+ MAI->addInitialFrameState(Inst); 22+ return MAI; 23+} 24+ 25+static MCAsmInfo *createSparcV9MCAsmInfo(const MCRegisterInfo &MRI, 26+ StringRef TT) { 27+ MCAsmInfo *MAI = new SparcELFMCAsmInfo(TT); 28+ unsigned Reg = MRI.getDwarfRegNum(SP::O6, true); 29+ MCCFIInstruction Inst = MCCFIInstruction::createDefCfa(0, Reg, 2047); 30+ MAI->addInitialFrameState(Inst); 31+ return MAI; 32+} 33+ 34 static MCInstrInfo *createSparcMCInstrInfo() { 35 MCInstrInfo *X = new MCInstrInfo(); 36 InitSparcMCInstrInfo(X); 37@@ -41,7 +60,7 @@ static MCInstrInfo *createSparcMCInstrInfo() { 38 39 static MCRegisterInfo *createSparcMCRegisterInfo(StringRef TT) { 40 MCRegisterInfo *X = new MCRegisterInfo(); 41- InitSparcMCRegisterInfo(X, SP::I7); 42+ InitSparcMCRegisterInfo(X, SP::O7); 43 return X; 44 } 45 46@@ -132,8 +151,8 @@ static MCInstPrinter *createSparcMCInstPrinter(con 47 48 extern "C" void LLVMInitializeSparcTargetMC() { 49 // Register the MC asm info. 50- RegisterMCAsmInfo<SparcELFMCAsmInfo> X(TheSparcTarget); 51- RegisterMCAsmInfo<SparcELFMCAsmInfo> Y(TheSparcV9Target); 52+ RegisterMCAsmInfoFn X(TheSparcTarget, createSparcMCAsmInfo); 53+ RegisterMCAsmInfoFn Y(TheSparcV9Target, createSparcV9MCAsmInfo); 54 55 // Register the MC codegen info. 56 TargetRegistry::RegisterMCCodeGenInfo(TheSparcTarget, 57Index: lib/Target/Sparc/SparcRegisterInfo.cpp 58=================================================================== 59--- lib/Target/Sparc/SparcRegisterInfo.cpp 60+++ lib/Target/Sparc/SparcRegisterInfo.cpp 61@@ -35,7 +35,7 @@ ReserveAppRegisters("sparc-reserve-app-registers", 62 cl::desc("Reserve application registers (%g2-%g4)")); 63 64 SparcRegisterInfo::SparcRegisterInfo(SparcSubtarget &st) 65- : SparcGenRegisterInfo(SP::I7), Subtarget(st) { 66+ : SparcGenRegisterInfo(SP::O7), Subtarget(st) { 67 } 68 69 const uint16_t* SparcRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) 70Index: test/CodeGen/SPARC/exception.ll 71=================================================================== 72--- test/CodeGen/SPARC/exception.ll 73+++ test/CodeGen/SPARC/exception.ll 74@@ -56,7 +56,11 @@ 75 ; V8PIC_NOCFI-NEXT: .word _ZTIi 76 ; V8PIC_NOCFI: .section .eh_frame 77 ; V8PIC_NOCFI-NOT: .section 78+; V8PIC_NOCFI: .byte 15 ! CIE Return Address Column 79 ; V8PIC_NOCFI: .word %r_disp32(DW.ref.__gxx_personality_v0) 80+; V8PIC_NOCFI: .byte 12 ! DW_CFA_def_cfa 81+; V8PIC_NOCFI: .byte 14 ! Reg 14 82+; V8PIC_NOCFI-NEXT: .byte 0 ! Offset 0 83 ; V8PIC_NOCFI: .word %r_disp32(.Ltmp{{.+}}) ! FDE initial location 84 85 86@@ -94,7 +98,11 @@ 87 ; V9PIC_NOCFI-NEXT: .xword _ZTIi 88 ; V9PIC_NOCFI: .section .eh_frame 89 ; V9PIC_NOCFI-NOT: .section 90+; V9PIC_NOCFI: .byte 15 ! CIE Return Address Column 91 ; V9PIC_NOCFI: .word %r_disp32(DW.ref.__gxx_personality_v0) 92+; V9PIC_NOCFI: .byte 12 ! DW_CFA_def_cfa 93+; V9PIC_NOCFI-NEXT: .byte 14 ! Reg 14 94+; V9PIC_NOCFI: .ascii "\377\017" ! Offset 2047 95 ; V9PIC_NOCFI: .word %r_disp32(.Ltmp{{.+}}) ! FDE initial location 96 97 define i32 @main(i32 %argc, i8** nocapture readnone %argv) unnamed_addr #0 { 98