+static void
+msort_code_offsets_internal (gint32 *array, int lo, int hi, gint32 *scratch)
+{
+ int mid = (lo + hi) / 2;
+ int i, t_lo, t_hi;
+
+ if (lo >= hi)
+ return;
+
+ if (hi - lo < 32) {
+ for (i = lo; i < hi; ++i)
+ if (array [(i * 2)] > array [(i * 2) + 2])
+ break;
+ if (i == hi)
+ /* Already sorted */
+ return;
+ }
+
+ msort_code_offsets_internal (array, lo, mid, scratch);
+ msort_code_offsets_internal (array, mid + 1, hi, scratch);
+
+ if (array [mid * 2] < array [(mid + 1) * 2])
+ return;
+
+ /* Merge */
+ t_lo = lo;
+ t_hi = mid + 1;
+ for (i = lo; i <= hi; i ++) {
+ if (t_lo <= mid && ((t_hi > hi) || array [t_lo * 2] < array [t_hi * 2])) {
+ scratch [(i * 2)] = array [t_lo * 2];
+ scratch [(i * 2) + 1] = array [(t_lo *2) + 1];
+ t_lo ++;
+ } else {
+ scratch [(i * 2)] = array [t_hi * 2];
+ scratch [(i * 2) + 1] = array [(t_hi *2) + 1];
+ t_hi ++;
+ }
+ }
+ for (i = lo; i <= hi; ++i) {
+ array [(i * 2)] = scratch [i * 2];
+ array [(i * 2) + 1] = scratch [(i * 2) + 1];
+ }
+}
+
+static void
+msort_code_offsets (gint32 *array, int len)
+{
+ gint32 *scratch;
+
+ scratch = g_new (gint32, len * 2);
+ msort_code_offsets_internal (array, 0, len - 1, scratch);
+ g_free (scratch);
+}
+