[mips] Remove incorrect DebugLoc entries from prologue
authorPetar Jovanovic <petar.jovanovic@imgtec.com>
Fri, 28 Aug 2015 17:53:26 +0000 (17:53 +0000)
committerPetar Jovanovic <petar.jovanovic@imgtec.com>
Fri, 28 Aug 2015 17:53:26 +0000 (17:53 +0000)
This has been causing the prologue_end to be incorrectly positioned.

Patch by Vladimir Radosavljevic.

Differential Revision: http://reviews.llvm.org/D11293

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@246309 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/Mips/MipsSEFrameLowering.cpp
lib/Target/Mips/MipsSEISelDAGToDAG.cpp
lib/Target/Mips/MipsSEInstrInfo.cpp
test/DebugInfo/Mips/delay-slot.ll
test/DebugInfo/Mips/prologue_end.ll [new file with mode: 0644]

index 5b4608fad2b83b32e448ef583842fc9b0814d9b7..a516e94797556cadf273fe0077d399e807e7875a 100644 (file)
@@ -376,7 +376,7 @@ void MipsSEFrameLowering::emitPrologue(MachineFunction &MF,
       *static_cast<const MipsRegisterInfo *>(STI.getRegisterInfo());
 
   MachineBasicBlock::iterator MBBI = MBB.begin();
-  DebugLoc dl = MBBI != MBB.end() ? MBBI->getDebugLoc() : DebugLoc();
+  DebugLoc dl;
   MipsABIInfo ABI = STI.getABI();
   unsigned SP = ABI.GetStackPtr();
   unsigned FP = ABI.GetFramePtr();
index cb46d731da290ab717e4c725d740868448ccc473..dff30c78bb54832d4e86978945eb3391b4c54844 100644 (file)
@@ -131,7 +131,7 @@ void MipsSEDAGToDAGISel::initGlobalBaseReg(MachineFunction &MF) {
   MachineBasicBlock::iterator I = MBB.begin();
   MachineRegisterInfo &RegInfo = MF.getRegInfo();
   const TargetInstrInfo &TII = *Subtarget->getInstrInfo();
-  DebugLoc DL = I != MBB.end() ? I->getDebugLoc() : DebugLoc();
+  DebugLoc DL;
   unsigned V0, V1, GlobalBaseReg = MipsFI->getGlobalBaseReg();
   const TargetRegisterClass *RC;
   const MipsABIInfo &ABI = static_cast<const MipsTargetMachine &>(TM).getABI();
index 938285f2e519cd15a50ad0e78338bf0749f80ea8..d05f95fbd2bea0e4fa2f4d28e881a530a72b2181 100644 (file)
@@ -182,7 +182,6 @@ storeRegToStack(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
                 const TargetRegisterClass *RC, const TargetRegisterInfo *TRI,
                 int64_t Offset) const {
   DebugLoc DL;
-  if (I != MBB.end()) DL = I->getDebugLoc();
   MachineMemOperand *MMO = GetMemOperand(MBB, FI, MachineMemOperand::MOStore);
 
   unsigned Opc = 0;
@@ -360,7 +359,7 @@ void MipsSEInstrInfo::adjustStackPtr(unsigned SP, int64_t Amount,
                                      MachineBasicBlock &MBB,
                                      MachineBasicBlock::iterator I) const {
   MipsABIInfo ABI = Subtarget.getABI();
-  DebugLoc DL = I != MBB.end() ? I->getDebugLoc() : DebugLoc();
+  DebugLoc DL;
   unsigned ADDu = ABI.GetPtrAdduOp();
   unsigned ADDiu = ABI.GetPtrAddiuOp();
 
index a0fdb196af7d3d99f6f76976c4b00a6e27ce60b8..a7e42ce3fef3a3d0eb8ef7ab31ea427a3c2f42af 100644 (file)
@@ -16,8 +16,8 @@
 ; FIXME: The next address probably ought to be 0x0000000000000004 but there's
 ;        a constant initialization before the prologue's end.
 ; CHECK: 0x0000000000000008      2      0      1   0             0  is_stmt prologue_end
-; CHECK: 0x0000000000000028      3      0      1   0             0  is_stmt
-; CHECK: 0x0000000000000038      4      0      1   0             0  is_stmt
+; CHECK: 0x000000000000002c      3      0      1   0             0  is_stmt
+; CHECK: 0x000000000000003c      4      0      1   0             0  is_stmt
 ; CHECK: 0x0000000000000048      5      0      1   0             0  is_stmt
 ; CHECK: 0x0000000000000058      5      0      1   0             0  is_stmt end_sequence
 
diff --git a/test/DebugInfo/Mips/prologue_end.ll b/test/DebugInfo/Mips/prologue_end.ll
new file mode 100644 (file)
index 0000000..4841a73
--- /dev/null
@@ -0,0 +1,70 @@
+; RUN: llc -O0 -mtriple mips-unknown-linux-gnu -relocation-model=static < %s | FileCheck %s -check-prefix=STATIC
+; RUN: llc -O0 -mtriple mips-unknown-linux-gnu -relocation-model=static -disable-fp-elim < %s | FileCheck %s -check-prefix=STATIC-FP
+; RUN: llc -O0 -mtriple mips-unknown-linux-gnu -relocation-model=pic < %s | FileCheck %s -check-prefix=PIC
+; RUN: llc -O0 -mtriple mips-unknown-linux-gnu -relocation-model=pic -disable-fp-elim < %s | FileCheck %s -check-prefix=PIC-FP
+
+; Generated using clang -O0 -emit-llvm -S -target mipsel-unknown-linux -g test.c -o test.ll
+; test.c:
+;
+; void hello_world(void) {
+;   printf("Hello, World!\n");
+; }
+
+@.str = private unnamed_addr constant [15 x i8] c"Hello, World!\0A\00", align 1
+
+define void @hello_world() #0 {
+entry:
+; STATIC:      addiu   $sp, $sp, -{{[0-9]+}}
+; STATIC:      sw      $ra, {{[0-9]+}}($sp)
+; STATIC:      .loc    1 2 3 prologue_end
+; STATIC:      lui     $[[R0:[0-9]+]], %hi($.str)
+
+; STATIC-FP:   addiu   $sp, $sp, -{{[0-9]+}}
+; STATIC-FP:   sw      $ra, {{[0-9]+}}($sp)
+; STATIC-FP:   sw      $fp, {{[0-9]+}}($sp)
+; STATIC-FP:   move    $fp, $sp
+; STATIC-FP:   .loc    1 2 3 prologue_end
+; STATIC-FP:   lui     $[[R0:[0-9]+]], %hi($.str)
+
+; PIC:         lui     $[[R0:[0-9]+]], %hi(_gp_disp)
+; PIC:         addiu   $[[R0]], $[[R0]], %lo(_gp_disp)
+; PIC:         addiu   $sp, $sp, -{{[0-9]+}}
+; PIC:         sw      $ra, {{[0-9]+}}($sp)
+; PIC:         addu    $[[R1:[0-9]+]], $[[R0]], $25
+; PIC:         .loc    1 2 3 prologue_end
+; PIC:         lw      $[[R2:[0-9]+]], %got($.str)($[[R1]])
+
+; PIC-FP:      lui     $[[R0:[0-9]+]], %hi(_gp_disp)
+; PIC-FP:      addiu   $[[R0]], $[[R0]], %lo(_gp_disp)
+; PIC-FP:      addiu   $sp, $sp, -{{[0-9]+}}
+; PIC-FP:      sw      $ra, {{[0-9]+}}($sp)
+; PIC-FP:      sw      $fp, {{[0-9]+}}($sp)
+; PIC-FP:      move    $fp, $sp
+; PIC-FP:      addu    $[[R1:[0-9]+]], $[[R0]], $25
+; PIC-FP:      .loc    1 2 3 prologue_end
+; PIC-FP:      lw      $[[R2:[0-9]+]], %got($.str)($[[R1]])
+
+  %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str, i32 0, i32 0)), !dbg !10
+  ret void, !dbg !11
+}
+
+declare i32 @printf(i8*, ...)
+
+attributes #0 = { nounwind }
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!7, !8}
+!llvm.ident = !{!9}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 3.8.0", isOptimized: false, runtimeVersion: 0, emissionKind: 1, enums: !2, subprograms: !3)
+!1 = !DIFile(filename: "test.c", directory: "/tmp")
+!2 = !{}
+!3 = !{!4}
+!4 = !DISubprogram(name: "hello_world", scope: !1, file: !1, line: 1, type: !5, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: false, function: void ()* @hello_world, variables: !2)
+!5 = !DISubroutineType(types: !6)
+!6 = !{null}
+!7 = !{i32 2, !"Dwarf Version", i32 4}
+!8 = !{i32 2, !"Debug Info Version", i32 3}
+!9 = !{!"clang version 3.8.0"}
+!10 = !DILocation(line: 2, column: 3, scope: !4)
+!11 = !DILocation(line: 3, column: 1, scope: !4)