diff --git a/share/qtcreator/patches/README b/share/qtcreator/patches/README
index 14acb50e3b2ef4a6a35358dfaabd562726be4591..28f21ecf456dbee73fb483cb3388114596de93ce 100644
--- a/share/qtcreator/patches/README
+++ b/share/qtcreator/patches/README
@@ -1,9 +1,15 @@
 
-For Linux, MinGW:
+For Linux:
 
     FSF 7.1 release
     + gdb-increased-dcache-line-size.patch
 
+For MinGW:
+
+    FSF 7.1 release
+    + gdb-increased-dcache-line-size.patch
+    + gdb-expand-line-sal-maybe.patch
+
 For Maemo targets:
     (--target=arm-none-linux-gnueabi)
 
diff --git a/share/qtcreator/patches/gdb-expand-line-sal-maybe.patch b/share/qtcreator/patches/gdb-expand-line-sal-maybe.patch
new file mode 100644
index 0000000000000000000000000000000000000000..dbac26ce3f39ce658729d75cb669ba95ac9a8477
--- /dev/null
+++ b/share/qtcreator/patches/gdb-expand-line-sal-maybe.patch
@@ -0,0 +1,138 @@
+
+This is fixing http://bugreports.qt.nokia.com/browse/QTCREATORBUG-2004
+
+-----------------------------------------------------------------------------    
+
+* From: Jan Kratochvil <jan dot kratochvil at redhat dot com>
+    * To: gdb-patches at sourceware dot org
+    * Date: Thu, 29 Jul 2010 00:39:54 +0200
+    * Subject: [patch] Fix internal error on some -O2 -g breakpoints
+
+Hi,
+
+https://bugzilla.redhat.com/show_bug.cgi?id=612253
+(gdb) file ./cc1plus
+(gdb) break add_new_name_mapping
+../../gdb/breakpoint.c:6594: internal-error: expand_line_sal_maybe: Assertion
+`found' failed.
+
+# Test various conditions of prologue analysis on -O2 -g code.  Particularly
+# when the first command of a function is an inlined function from a different
+# symtab.  The inlined function can have also multiple concrete instances.
+# The next first line after the inlined function should have two PC ranges.
+
+expand_line_sal_maybe processes already too complex data it cannot rely on the
+exact input PC would be found between the output resolved results.  There are
+various bugs I was trying to fix which cause such incorrect multiple results
+in this case.  But even after fixing all of them the code would be too fragile
+to stay relying on this conditional.
+
+After this patch GDB will put the breakpoint only _after_ the initial inlined
+call (=incorrectly) in the testcase; it will no longer crash on it, though.
+
+The symtab.c==expand_line_sal change is optional.  I believe it is a correct
+change but I do not find it much important.  With this change GDB will not
+only no longer crash but it will even place the breakpoint correctly in the
+real world cc1plus testcase from the downstream bug above.
+
+Defining -DLEXICAL still crashes FSF GDB HEAD but just with the
+symtab.c==expand_line_sal change it no longer crashes.
+
+Defining -DINLINED crashes FSF GDB HEAD even with the
+symtab.c==expand_line_sal change, therefore also
+breakpoint.c==expand_line_sal_maybe is patches in this patches.
+
+I can remove the LEXICAL part and keep there only the un-#ifdef-ed INLINED
+one if anyone cares about.
+
+<background>
+There remain more issues to solve.  skip_prologue_sal should be called for
+each separate inlined instance (line number alias).  It is called now first
+and then the other instances are being found... Also skip_prologue_sal should
+be able to _decrease_ the PC, not just increase it as it may be needed from
+breakpoint_re_set.  Just reread_symbols contains bugs causing common GDB
+crashes on the reload so I did not try to fix skip_prologue_sal for it now.
+
+Also there is a general problem that GDB now tries to heuristically guess some
+expected defects of the debuginfo in -O2 -g cases (see "For optimized code" in
+expand_line_sal), it is there because GCC does not generate proper is_stmt
+(DW_LNS_negate_stmt).  Moreover very magic skip_prologue_sal is there just
+because GCC does not generate proper DW_LNS_set_prologue_end markers.
+
+As GCC should produce these markers in a foreseeable future I did not want to
+try to do anything with these GDB heuristics.
+
+There remains a question whether the expand_line_sal_maybe patch part should
+not possibly use just the first breakpoint if ORIGINAL_PC cannot be found.
+I find it safer this way without much disadvantages, multi-PC breakpoints are
+very transparent to the user, the other breakpoints are always somehow related
+and more breakpoints is always better than less of them, IMO.
+</background>
+
+
+No regressions on {x86_64,x86_64-m32,i686}-fedora13-linux-gnu.
+
+The testcase may not necessarily crash current FSF GDB HEAD on other arches.
+
+
+Thanks,
+Jan
+-----------------------------------------------------------------------------    
+
+
+
+--- a/gdb/breakpoint.c
++++ b/gdb/breakpoint.c
+@@ -7048,7 +7048,6 @@ expand_line_sal_maybe (struct symtab_and_line sal)
+   struct symtabs_and_lines expanded;
+   CORE_ADDR original_pc = sal.pc;
+   char *original_function = NULL;
+-  int found;
+   int i;
+   struct cleanup *old_chain;
+ 
+@@ -7131,17 +7130,8 @@ expand_line_sal_maybe (struct symtab_and_line sal)
+       return expanded;      
+     }
+ 
+-  if (original_pc)
+-    {
+-      found = 0;
+-      for (i = 0; i < expanded.nelts; ++i)
+-       if (expanded.sals[i].pc == original_pc)
+-         {
+-           found = 1;
+-           break;
+-         }
+-      gdb_assert (found);
+-    }
++  /* ORIGINAL_PC may not be found between EXPANDED.SALS.  expand_line_sal may
++     have skipped too far.  */
+ 
+   return expanded;
+ }
+--- a/gdb/symtab.c
++++ b/gdb/symtab.c
+@@ -4636,11 +4636,20 @@ expand_line_sal (struct symtab_and_line sal)
+   blocks = alloca (ret.nelts * sizeof (struct block *));
+   for (i = 0; i < ret.nelts; ++i)
+     {
++      struct block *bl;
++
+       set_current_program_space (ret.sals[i].pspace);
+ 
+-      filter[i] = 1;
+-      blocks[i] = block_for_pc_sect (ret.sals[i].pc, ret.sals[i].section);
++      /* Place breakpoint only to the first PC in a function, even if some of
++        them are in a lexical sub-block.  Put it too all the function
++        instances incl. the inlined ones.  */
+ 
++      bl = block_for_pc_sect (ret.sals[i].pc, ret.sals[i].section);
++      while (bl != NULL && BLOCK_FUNCTION (bl) == NULL)
++       bl = BLOCK_SUPERBLOCK (bl);
++
++      filter[i] = 1;
++      blocks[i] = bl;
+     }
+   do_cleanups (old_chain);
+