[2e59d11] | 1 | Submitted By: Jim Gifford (jim at cross-lfs dot org)
|
---|
[88af5df] | 2 | Date: 11-01-2013
|
---|
[2e59d11] | 3 | Initial Package Version: 4.8.2
|
---|
| 4 | Origin: Upstream
|
---|
| 5 | Upstream Status: Applied
|
---|
| 6 | Description: This is a branch update for gcc-4.8.2, and should be
|
---|
| 7 | rechecked periodically.
|
---|
| 8 |
|
---|
[88af5df] | 9 | Includes PR tree-optimization/54094
|
---|
[2e59d11] | 10 |
|
---|
[88af5df] | 11 | This patch was made from Revision # 204292.
|
---|
| 12 |
|
---|
| 13 | diff -Naur gcc-4.8.2.orig/ChangeLog gcc-4.8.2/ChangeLog
|
---|
| 14 | --- gcc-4.8.2.orig/ChangeLog 2013-10-16 07:18:46.000000000 +0000
|
---|
| 15 | +++ gcc-4.8.2/ChangeLog 2013-11-01 16:12:34.459877324 +0000
|
---|
| 16 | @@ -7,6 +7,13 @@
|
---|
| 17 | * configure.ac: Also allow ISL 0.12.
|
---|
| 18 | * configure: Regenerated.
|
---|
| 19 |
|
---|
| 20 | + PR tree-optimization/54094
|
---|
| 21 | + * graphite-clast-to-gimple.c (translate_clast_for_loop): Derive the
|
---|
| 22 | + scheduling dimension for the parallelism check from the polyhedral
|
---|
| 23 | + information in the AST.
|
---|
| 24 | + * graphite-dependences.c (carries_deps): Do not assume the schedule is
|
---|
| 25 | + in 2D + 1 form.
|
---|
| 26 | +
|
---|
| 27 | 2013-05-31 Release Manager
|
---|
| 28 |
|
---|
| 29 | * GCC 4.8.1 released.
|
---|
[2e59d11] | 30 | diff -Naur gcc-4.8.2.orig/contrib/gcc_update gcc-4.8.2/contrib/gcc_update
|
---|
[88af5df] | 31 | --- gcc-4.8.2.orig/contrib/gcc_update 2012-11-14 11:09:00.000000000 +0000
|
---|
| 32 | +++ gcc-4.8.2/contrib/gcc_update 2013-11-01 16:12:29.807076533 +0000
|
---|
[2e59d11] | 33 | @@ -382,7 +382,7 @@
|
---|
| 34 | fi
|
---|
| 35 |
|
---|
| 36 | revision=`$GCC_SVN info | awk '/Revision:/ { print $2 }'`
|
---|
| 37 | - branch=`$GCC_SVN info | sed -ne "/URL:/ {
|
---|
| 38 | + branch=`$GCC_SVN info | sed -ne "/^URL:/ {
|
---|
| 39 | s,.*/trunk,trunk,
|
---|
| 40 | s,.*/branches/,,
|
---|
| 41 | s,.*/tags/,,
|
---|
[88af5df] | 42 | diff -Naur gcc-4.8.2.orig/gcc/DATESTAMP gcc-4.8.2/gcc/DATESTAMP
|
---|
| 43 | --- gcc-4.8.2.orig/gcc/DATESTAMP 2013-10-16 00:16:34.000000000 +0000
|
---|
| 44 | +++ gcc-4.8.2/gcc/DATESTAMP 2013-11-01 16:12:33.423698996 +0000
|
---|
| 45 | @@ -1 +1 @@
|
---|
| 46 | -20131016
|
---|
| 47 | +20131101
|
---|
[2e59d11] | 48 | diff -Naur gcc-4.8.2.orig/gcc/ada/gcc-interface/utils.c gcc-4.8.2/gcc/ada/gcc-interface/utils.c
|
---|
[88af5df] | 49 | --- gcc-4.8.2.orig/gcc/ada/gcc-interface/utils.c 2013-06-13 07:51:32.000000000 +0000
|
---|
| 50 | +++ gcc-4.8.2/gcc/ada/gcc-interface/utils.c 2013-11-01 16:12:30.359171559 +0000
|
---|
[2e59d11] | 51 | @@ -232,6 +232,7 @@
|
---|
| 52 | static tree split_plus (tree, tree *);
|
---|
| 53 | static tree float_type_for_precision (int, enum machine_mode);
|
---|
| 54 | static tree convert_to_fat_pointer (tree, tree);
|
---|
| 55 | +static unsigned int scale_by_factor_of (tree, unsigned int);
|
---|
| 56 | static bool potential_alignment_gap (tree, tree, tree);
|
---|
| 57 | static void process_attributes (tree, struct attrib *);
|
---|
| 58 | |
---|
| 59 |
|
---|
| 60 | @@ -532,6 +533,22 @@
|
---|
| 61 | free_binding_level = level;
|
---|
| 62 | }
|
---|
| 63 | |
---|
| 64 |
|
---|
| 65 | +/* Set the context of TYPE and its parallel types (if any) to CONTEXT. */
|
---|
| 66 | +
|
---|
| 67 | +static void
|
---|
| 68 | +gnat_set_type_context (tree type, tree context)
|
---|
| 69 | +{
|
---|
| 70 | + tree decl = TYPE_STUB_DECL (type);
|
---|
| 71 | +
|
---|
| 72 | + TYPE_CONTEXT (type) = context;
|
---|
| 73 | +
|
---|
| 74 | + while (decl && DECL_PARALLEL_TYPE (decl))
|
---|
| 75 | + {
|
---|
| 76 | + TYPE_CONTEXT (DECL_PARALLEL_TYPE (decl)) = context;
|
---|
| 77 | + decl = TYPE_STUB_DECL (DECL_PARALLEL_TYPE (decl));
|
---|
| 78 | + }
|
---|
| 79 | +}
|
---|
| 80 | +
|
---|
| 81 | /* Record DECL as belonging to the current lexical scope and use GNAT_NODE
|
---|
| 82 | for location information and flag propagation. */
|
---|
| 83 |
|
---|
| 84 | @@ -613,7 +630,7 @@
|
---|
| 85 | if (TREE_CODE (t) == POINTER_TYPE)
|
---|
| 86 | TYPE_NEXT_PTR_TO (t) = tt;
|
---|
| 87 | TYPE_NAME (tt) = DECL_NAME (decl);
|
---|
| 88 | - TYPE_CONTEXT (tt) = DECL_CONTEXT (decl);
|
---|
| 89 | + gnat_set_type_context (tt, DECL_CONTEXT (decl));
|
---|
| 90 | TYPE_STUB_DECL (tt) = TYPE_STUB_DECL (t);
|
---|
| 91 | DECL_ORIGINAL_TYPE (decl) = tt;
|
---|
| 92 | }
|
---|
| 93 | @@ -623,7 +640,7 @@
|
---|
| 94 | /* We need a variant for the placeholder machinery to work. */
|
---|
| 95 | tree tt = build_variant_type_copy (t);
|
---|
| 96 | TYPE_NAME (tt) = decl;
|
---|
| 97 | - TYPE_CONTEXT (tt) = DECL_CONTEXT (decl);
|
---|
| 98 | + gnat_set_type_context (tt, DECL_CONTEXT (decl));
|
---|
| 99 | TREE_USED (tt) = TREE_USED (t);
|
---|
| 100 | TREE_TYPE (decl) = tt;
|
---|
| 101 | if (DECL_ORIGINAL_TYPE (TYPE_NAME (t)))
|
---|
| 102 | @@ -645,7 +662,7 @@
|
---|
| 103 | if (!(TYPE_NAME (t) && TREE_CODE (TYPE_NAME (t)) == TYPE_DECL))
|
---|
| 104 | {
|
---|
| 105 | TYPE_NAME (t) = decl;
|
---|
| 106 | - TYPE_CONTEXT (t) = DECL_CONTEXT (decl);
|
---|
| 107 | + gnat_set_type_context (t, DECL_CONTEXT (decl));
|
---|
| 108 | }
|
---|
| 109 | }
|
---|
| 110 | }
|
---|
| 111 | @@ -1692,93 +1709,74 @@
|
---|
| 112 | TYPE_SIZE_UNIT (new_record_type)
|
---|
| 113 | = size_int (TYPE_ALIGN (record_type) / BITS_PER_UNIT);
|
---|
| 114 |
|
---|
| 115 | - /* Now scan all the fields, replacing each field with a new
|
---|
| 116 | - field corresponding to the new encoding. */
|
---|
| 117 | + /* Now scan all the fields, replacing each field with a new field
|
---|
| 118 | + corresponding to the new encoding. */
|
---|
| 119 | for (old_field = TYPE_FIELDS (record_type); old_field;
|
---|
| 120 | old_field = DECL_CHAIN (old_field))
|
---|
| 121 | {
|
---|
| 122 | tree field_type = TREE_TYPE (old_field);
|
---|
| 123 | tree field_name = DECL_NAME (old_field);
|
---|
| 124 | - tree new_field;
|
---|
| 125 | tree curpos = bit_position (old_field);
|
---|
| 126 | + tree pos, new_field;
|
---|
| 127 | bool var = false;
|
---|
| 128 | unsigned int align = 0;
|
---|
| 129 | - tree pos;
|
---|
| 130 | -
|
---|
| 131 | - /* See how the position was modified from the last position.
|
---|
| 132 |
|
---|
| 133 | - There are two basic cases we support: a value was added
|
---|
| 134 | - to the last position or the last position was rounded to
|
---|
| 135 | - a boundary and they something was added. Check for the
|
---|
| 136 | - first case first. If not, see if there is any evidence
|
---|
| 137 | - of rounding. If so, round the last position and try
|
---|
| 138 | - again.
|
---|
| 139 | + /* We're going to do some pattern matching below so remove as many
|
---|
| 140 | + conversions as possible. */
|
---|
| 141 | + curpos = remove_conversions (curpos, true);
|
---|
| 142 |
|
---|
| 143 | - If this is a union, the position can be taken as zero. */
|
---|
| 144 | + /* See how the position was modified from the last position.
|
---|
| 145 |
|
---|
| 146 | - /* Some computations depend on the shape of the position expression,
|
---|
| 147 | - so strip conversions to make sure it's exposed. */
|
---|
| 148 | - curpos = remove_conversions (curpos, true);
|
---|
| 149 | + There are two basic cases we support: a value was added
|
---|
| 150 | + to the last position or the last position was rounded to
|
---|
| 151 | + a boundary and they something was added. Check for the
|
---|
| 152 | + first case first. If not, see if there is any evidence
|
---|
| 153 | + of rounding. If so, round the last position and retry.
|
---|
| 154 |
|
---|
| 155 | + If this is a union, the position can be taken as zero. */
|
---|
| 156 | if (TREE_CODE (new_record_type) == UNION_TYPE)
|
---|
| 157 | - pos = bitsize_zero_node, align = 0;
|
---|
| 158 | + pos = bitsize_zero_node;
|
---|
| 159 | else
|
---|
| 160 | pos = compute_related_constant (curpos, last_pos);
|
---|
| 161 |
|
---|
| 162 | - if (!pos && TREE_CODE (curpos) == MULT_EXPR
|
---|
| 163 | + if (!pos
|
---|
| 164 | + && TREE_CODE (curpos) == MULT_EXPR
|
---|
| 165 | && host_integerp (TREE_OPERAND (curpos, 1), 1))
|
---|
| 166 | {
|
---|
| 167 | tree offset = TREE_OPERAND (curpos, 0);
|
---|
| 168 | align = tree_low_cst (TREE_OPERAND (curpos, 1), 1);
|
---|
| 169 | -
|
---|
| 170 | - /* An offset which is a bitwise AND with a mask increases the
|
---|
| 171 | - alignment according to the number of trailing zeros. */
|
---|
| 172 | - offset = remove_conversions (offset, true);
|
---|
| 173 | - if (TREE_CODE (offset) == BIT_AND_EXPR
|
---|
| 174 | - && TREE_CODE (TREE_OPERAND (offset, 1)) == INTEGER_CST)
|
---|
| 175 | - {
|
---|
| 176 | - unsigned HOST_WIDE_INT mask
|
---|
| 177 | - = TREE_INT_CST_LOW (TREE_OPERAND (offset, 1));
|
---|
| 178 | - unsigned int i;
|
---|
| 179 | -
|
---|
| 180 | - for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
|
---|
| 181 | - {
|
---|
| 182 | - if (mask & 1)
|
---|
| 183 | - break;
|
---|
| 184 | - mask >>= 1;
|
---|
| 185 | - align *= 2;
|
---|
| 186 | - }
|
---|
| 187 | - }
|
---|
| 188 | -
|
---|
| 189 | - pos = compute_related_constant (curpos,
|
---|
| 190 | - round_up (last_pos, align));
|
---|
| 191 | + align = scale_by_factor_of (offset, align);
|
---|
| 192 | + last_pos = round_up (last_pos, align);
|
---|
| 193 | + pos = compute_related_constant (curpos, last_pos);
|
---|
| 194 | }
|
---|
| 195 | - else if (!pos && TREE_CODE (curpos) == PLUS_EXPR
|
---|
| 196 | - && TREE_CODE (TREE_OPERAND (curpos, 1)) == INTEGER_CST
|
---|
| 197 | + else if (!pos
|
---|
| 198 | + && TREE_CODE (curpos) == PLUS_EXPR
|
---|
| 199 | + && host_integerp (TREE_OPERAND (curpos, 1), 1)
|
---|
| 200 | && TREE_CODE (TREE_OPERAND (curpos, 0)) == MULT_EXPR
|
---|
| 201 | - && host_integerp (TREE_OPERAND
|
---|
| 202 | - (TREE_OPERAND (curpos, 0), 1),
|
---|
| 203 | - 1))
|
---|
| 204 | + && host_integerp
|
---|
| 205 | + (TREE_OPERAND (TREE_OPERAND (curpos, 0), 1), 1))
|
---|
| 206 | {
|
---|
| 207 | + tree offset = TREE_OPERAND (TREE_OPERAND (curpos, 0), 0);
|
---|
| 208 | + unsigned HOST_WIDE_INT addend
|
---|
| 209 | + = tree_low_cst (TREE_OPERAND (curpos, 1), 1);
|
---|
| 210 | align
|
---|
| 211 | - = tree_low_cst
|
---|
| 212 | - (TREE_OPERAND (TREE_OPERAND (curpos, 0), 1), 1);
|
---|
| 213 | - pos = compute_related_constant (curpos,
|
---|
| 214 | - round_up (last_pos, align));
|
---|
| 215 | + = tree_low_cst (TREE_OPERAND (TREE_OPERAND (curpos, 0), 1), 1);
|
---|
| 216 | + align = scale_by_factor_of (offset, align);
|
---|
| 217 | + align = MIN (align, addend & -addend);
|
---|
| 218 | + last_pos = round_up (last_pos, align);
|
---|
| 219 | + pos = compute_related_constant (curpos, last_pos);
|
---|
| 220 | }
|
---|
| 221 | - else if (potential_alignment_gap (prev_old_field, old_field,
|
---|
| 222 | - pos))
|
---|
| 223 | + else if (potential_alignment_gap (prev_old_field, old_field, pos))
|
---|
| 224 | {
|
---|
| 225 | align = TYPE_ALIGN (field_type);
|
---|
| 226 | - pos = compute_related_constant (curpos,
|
---|
| 227 | - round_up (last_pos, align));
|
---|
| 228 | + last_pos = round_up (last_pos, align);
|
---|
| 229 | + pos = compute_related_constant (curpos, last_pos);
|
---|
| 230 | }
|
---|
| 231 |
|
---|
| 232 | /* If we can't compute a position, set it to zero.
|
---|
| 233 |
|
---|
| 234 | - ??? We really should abort here, but it's too much work
|
---|
| 235 | - to get this correct for all cases. */
|
---|
| 236 | -
|
---|
| 237 | + ??? We really should abort here, but it's too much work
|
---|
| 238 | + to get this correct for all cases. */
|
---|
| 239 | if (!pos)
|
---|
| 240 | pos = bitsize_zero_node;
|
---|
| 241 |
|
---|
| 242 | @@ -2553,6 +2551,32 @@
|
---|
| 243 | return false;
|
---|
| 244 | }
|
---|
| 245 |
|
---|
| 246 | +/* Return VALUE scaled by the biggest power-of-2 factor of EXPR. */
|
---|
| 247 | +
|
---|
| 248 | +static unsigned int
|
---|
| 249 | +scale_by_factor_of (tree expr, unsigned int value)
|
---|
| 250 | +{
|
---|
| 251 | + expr = remove_conversions (expr, true);
|
---|
| 252 | +
|
---|
| 253 | + /* An expression which is a bitwise AND with a mask has a power-of-2 factor
|
---|
| 254 | + corresponding to the number of trailing zeros of the mask. */
|
---|
| 255 | + if (TREE_CODE (expr) == BIT_AND_EXPR
|
---|
| 256 | + && TREE_CODE (TREE_OPERAND (expr, 1)) == INTEGER_CST)
|
---|
| 257 | + {
|
---|
| 258 | + unsigned HOST_WIDE_INT mask = TREE_INT_CST_LOW (TREE_OPERAND (expr, 1));
|
---|
| 259 | + unsigned int i = 0;
|
---|
| 260 | +
|
---|
| 261 | + while ((mask & 1) == 0 && i < HOST_BITS_PER_WIDE_INT)
|
---|
| 262 | + {
|
---|
| 263 | + mask >>= 1;
|
---|
| 264 | + value *= 2;
|
---|
| 265 | + i++;
|
---|
| 266 | + }
|
---|
| 267 | + }
|
---|
| 268 | +
|
---|
| 269 | + return value;
|
---|
| 270 | +}
|
---|
| 271 | +
|
---|
| 272 | /* Given two consecutive field decls PREV_FIELD and CURR_FIELD, return true
|
---|
[88af5df] | 273 | unless we can prove these 2 fields are laid out in such a way that no gap
|
---|
| 274 | exist between the end of PREV_FIELD and the beginning of CURR_FIELD. OFFSET
|
---|
| 275 | diff -Naur gcc-4.8.2.orig/gcc/alias.c gcc-4.8.2/gcc/alias.c
|
---|
| 276 | --- gcc-4.8.2.orig/gcc/alias.c 2013-03-05 09:40:38.000000000 +0000
|
---|
| 277 | +++ gcc-4.8.2/gcc/alias.c 2013-11-01 16:12:30.359171559 +0000
|
---|
| 278 | @@ -2871,16 +2871,13 @@
|
---|
| 279 | /* Wipe the reg_seen array clean. */
|
---|
| 280 | bitmap_clear (reg_seen);
|
---|
| 281 |
|
---|
| 282 | - /* Mark all hard registers which may contain an address.
|
---|
| 283 | - The stack, frame and argument pointers may contain an address.
|
---|
| 284 | - An argument register which can hold a Pmode value may contain
|
---|
| 285 | - an address even if it is not in BASE_REGS.
|
---|
| 286 | -
|
---|
| 287 | - The address expression is VOIDmode for an argument and
|
---|
| 288 | - Pmode for other registers. */
|
---|
| 289 | -
|
---|
| 290 | - memcpy (new_reg_base_value, static_reg_base_value,
|
---|
| 291 | - FIRST_PSEUDO_REGISTER * sizeof (rtx));
|
---|
| 292 | + /* Initialize the alias information for this pass. */
|
---|
| 293 | + for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
|
---|
| 294 | + if (static_reg_base_value[i])
|
---|
| 295 | + {
|
---|
| 296 | + new_reg_base_value[i] = static_reg_base_value[i];
|
---|
| 297 | + bitmap_set_bit (reg_seen, i);
|
---|
| 298 | + }
|
---|
| 299 |
|
---|
| 300 | /* Walk the insns adding values to the new_reg_base_value array. */
|
---|
| 301 | for (i = 0; i < rpo_cnt; i++)
|
---|
| 302 | diff -Naur gcc-4.8.2.orig/gcc/cfgexpand.c gcc-4.8.2/gcc/cfgexpand.c
|
---|
| 303 | --- gcc-4.8.2.orig/gcc/cfgexpand.c 2013-03-05 22:31:50.000000000 +0000
|
---|
| 304 | +++ gcc-4.8.2/gcc/cfgexpand.c 2013-11-01 16:12:30.363172247 +0000
|
---|
| 305 | @@ -4707,14 +4707,18 @@
|
---|
| 306 | if (e->insns.r)
|
---|
| 307 | {
|
---|
| 308 | rebuild_jump_labels_chain (e->insns.r);
|
---|
| 309 | - /* Avoid putting insns before parm_birth_insn. */
|
---|
| 310 | + /* Put insns after parm birth, but before
|
---|
| 311 | + NOTE_INSNS_FUNCTION_BEG. */
|
---|
| 312 | if (e->src == ENTRY_BLOCK_PTR
|
---|
| 313 | - && single_succ_p (ENTRY_BLOCK_PTR)
|
---|
| 314 | - && parm_birth_insn)
|
---|
| 315 | + && single_succ_p (ENTRY_BLOCK_PTR))
|
---|
| 316 | {
|
---|
| 317 | rtx insns = e->insns.r;
|
---|
| 318 | e->insns.r = NULL_RTX;
|
---|
| 319 | - emit_insn_after_noloc (insns, parm_birth_insn, e->dest);
|
---|
| 320 | + if (NOTE_P (parm_birth_insn)
|
---|
| 321 | + && NOTE_KIND (parm_birth_insn) == NOTE_INSN_FUNCTION_BEG)
|
---|
| 322 | + emit_insn_before_noloc (insns, parm_birth_insn, e->dest);
|
---|
| 323 | + else
|
---|
| 324 | + emit_insn_after_noloc (insns, parm_birth_insn, e->dest);
|
---|
| 325 | }
|
---|
| 326 | else
|
---|
| 327 | commit_one_edge_insertion (e);
|
---|
| 328 | diff -Naur gcc-4.8.2.orig/gcc/cgraph.c gcc-4.8.2/gcc/cgraph.c
|
---|
| 329 | --- gcc-4.8.2.orig/gcc/cgraph.c 2013-05-22 07:50:40.000000000 +0000
|
---|
| 330 | +++ gcc-4.8.2/gcc/cgraph.c 2013-11-01 16:12:30.367172935 +0000
|
---|
| 331 | @@ -2596,4 +2596,47 @@
|
---|
| 332 | FOR_EACH_FUNCTION (node)
|
---|
| 333 | verify_cgraph_node (node);
|
---|
| 334 | }
|
---|
| 335 | +
|
---|
| 336 | +/* Create external decl node for DECL.
|
---|
| 337 | + The difference i nbetween cgraph_get_create_node and
|
---|
| 338 | + cgraph_get_create_real_symbol_node is that cgraph_get_create_node
|
---|
| 339 | + may return inline clone, while cgraph_get_create_real_symbol_node
|
---|
| 340 | + will create a new node in this case.
|
---|
| 341 | + FIXME: This function should be removed once clones are put out of decl
|
---|
| 342 | + hash. */
|
---|
| 343 | +
|
---|
| 344 | +struct cgraph_node *
|
---|
| 345 | +cgraph_get_create_real_symbol_node (tree decl)
|
---|
| 346 | +{
|
---|
| 347 | + struct cgraph_node *first_clone = cgraph_get_node (decl);
|
---|
| 348 | + struct cgraph_node *node;
|
---|
| 349 | + /* create symbol table node. even if inline clone exists, we can not take
|
---|
| 350 | + it as a target of non-inlined call. */
|
---|
| 351 | + node = cgraph_get_node (decl);
|
---|
| 352 | + if (node && !node->global.inlined_to)
|
---|
| 353 | + return node;
|
---|
| 354 | +
|
---|
| 355 | + node = cgraph_create_node (decl);
|
---|
| 356 | +
|
---|
| 357 | + /* ok, we previously inlined the function, then removed the offline copy and
|
---|
| 358 | + now we want it back for external call. this can happen when devirtualizing
|
---|
| 359 | + while inlining function called once that happens after extern inlined and
|
---|
| 360 | + virtuals are already removed. in this case introduce the external node
|
---|
| 361 | + and make it available for call. */
|
---|
| 362 | + if (first_clone)
|
---|
| 363 | + {
|
---|
| 364 | + first_clone->clone_of = node;
|
---|
| 365 | + node->clones = first_clone;
|
---|
| 366 | + symtab_prevail_in_asm_name_hash ((symtab_node) node);
|
---|
| 367 | + symtab_insert_node_to_hashtable ((symtab_node) node);
|
---|
| 368 | + if (dump_file)
|
---|
| 369 | + fprintf (dump_file, "Introduced new external node "
|
---|
| 370 | + "(%s/%i) and turned into root of the clone tree.\n",
|
---|
| 371 | + xstrdup (cgraph_node_name (node)), node->uid);
|
---|
| 372 | + }
|
---|
| 373 | + else if (dump_file)
|
---|
| 374 | + fprintf (dump_file, "Introduced new external node "
|
---|
| 375 | + "(%s/%i).\n", xstrdup (cgraph_node_name (node)), node->uid);
|
---|
| 376 | + return node;
|
---|
| 377 | +}
|
---|
| 378 | #include "gt-cgraph.h"
|
---|
| 379 | diff -Naur gcc-4.8.2.orig/gcc/cgraph.h gcc-4.8.2/gcc/cgraph.h
|
---|
| 380 | --- gcc-4.8.2.orig/gcc/cgraph.h 2013-01-17 11:43:14.000000000 +0000
|
---|
| 381 | +++ gcc-4.8.2/gcc/cgraph.h 2013-11-01 16:12:30.371173624 +0000
|
---|
| 382 | @@ -575,6 +575,7 @@
|
---|
| 383 | struct cgraph_node * cgraph_create_node (tree);
|
---|
| 384 | struct cgraph_node * cgraph_create_empty_node (void);
|
---|
| 385 | struct cgraph_node * cgraph_get_create_node (tree);
|
---|
| 386 | +struct cgraph_node * cgraph_get_create_real_symbol_node (tree);
|
---|
| 387 | struct cgraph_node * cgraph_same_body_alias (struct cgraph_node *, tree, tree);
|
---|
| 388 | struct cgraph_node * cgraph_add_thunk (struct cgraph_node *, tree, tree, bool, HOST_WIDE_INT,
|
---|
| 389 | HOST_WIDE_INT, tree, tree);
|
---|
| 390 | diff -Naur gcc-4.8.2.orig/gcc/cgraphbuild.c gcc-4.8.2/gcc/cgraphbuild.c
|
---|
| 391 | --- gcc-4.8.2.orig/gcc/cgraphbuild.c 2013-01-10 20:38:27.000000000 +0000
|
---|
| 392 | +++ gcc-4.8.2/gcc/cgraphbuild.c 2013-11-01 16:12:30.367172935 +0000
|
---|
| 393 | @@ -73,7 +73,7 @@
|
---|
| 394 | decl = get_base_var (*tp);
|
---|
| 395 | if (TREE_CODE (decl) == FUNCTION_DECL)
|
---|
| 396 | {
|
---|
| 397 | - struct cgraph_node *node = cgraph_get_create_node (decl);
|
---|
| 398 | + struct cgraph_node *node = cgraph_get_create_real_symbol_node (decl);
|
---|
| 399 | if (!ctx->only_vars)
|
---|
| 400 | cgraph_mark_address_taken_node (node);
|
---|
| 401 | ipa_record_reference ((symtab_node)ctx->varpool_node,
|
---|
| 402 | @@ -143,7 +143,7 @@
|
---|
| 403 | {
|
---|
| 404 | struct cgraph_node *per_node;
|
---|
| 405 |
|
---|
| 406 | - per_node = cgraph_get_create_node (DECL_FUNCTION_PERSONALITY (node->symbol.decl));
|
---|
| 407 | + per_node = cgraph_get_create_real_symbol_node (DECL_FUNCTION_PERSONALITY (node->symbol.decl));
|
---|
| 408 | ipa_record_reference ((symtab_node)node, (symtab_node)per_node, IPA_REF_ADDR, NULL);
|
---|
| 409 | cgraph_mark_address_taken_node (per_node);
|
---|
| 410 | }
|
---|
| 411 | @@ -223,7 +223,7 @@
|
---|
| 412 | addr = get_base_address (addr);
|
---|
| 413 | if (TREE_CODE (addr) == FUNCTION_DECL)
|
---|
| 414 | {
|
---|
| 415 | - struct cgraph_node *node = cgraph_get_create_node (addr);
|
---|
| 416 | + struct cgraph_node *node = cgraph_get_create_real_symbol_node (addr);
|
---|
| 417 | cgraph_mark_address_taken_node (node);
|
---|
| 418 | ipa_record_reference ((symtab_node)data,
|
---|
| 419 | (symtab_node)node,
|
---|
| 420 | @@ -252,7 +252,7 @@
|
---|
| 421 | {
|
---|
| 422 | /* ??? This can happen on platforms with descriptors when these are
|
---|
| 423 | directly manipulated in the code. Pretend that it's an address. */
|
---|
| 424 | - struct cgraph_node *node = cgraph_get_create_node (t);
|
---|
| 425 | + struct cgraph_node *node = cgraph_get_create_real_symbol_node (t);
|
---|
| 426 | cgraph_mark_address_taken_node (node);
|
---|
| 427 | ipa_record_reference ((symtab_node)data,
|
---|
| 428 | (symtab_node)node,
|
---|
| 429 | @@ -330,7 +330,7 @@
|
---|
| 430 | {
|
---|
| 431 | tree fn = gimple_omp_parallel_child_fn (stmt);
|
---|
| 432 | ipa_record_reference ((symtab_node)node,
|
---|
| 433 | - (symtab_node)cgraph_get_create_node (fn),
|
---|
| 434 | + (symtab_node)cgraph_get_create_real_symbol_node (fn),
|
---|
| 435 | IPA_REF_ADDR, stmt);
|
---|
| 436 | }
|
---|
| 437 | if (gimple_code (stmt) == GIMPLE_OMP_TASK)
|
---|
| 438 | @@ -338,12 +338,12 @@
|
---|
| 439 | tree fn = gimple_omp_task_child_fn (stmt);
|
---|
| 440 | if (fn)
|
---|
| 441 | ipa_record_reference ((symtab_node)node,
|
---|
| 442 | - (symtab_node) cgraph_get_create_node (fn),
|
---|
| 443 | + (symtab_node) cgraph_get_create_real_symbol_node (fn),
|
---|
| 444 | IPA_REF_ADDR, stmt);
|
---|
| 445 | fn = gimple_omp_task_copy_fn (stmt);
|
---|
| 446 | if (fn)
|
---|
| 447 | ipa_record_reference ((symtab_node)node,
|
---|
| 448 | - (symtab_node)cgraph_get_create_node (fn),
|
---|
| 449 | + (symtab_node)cgraph_get_create_real_symbol_node (fn),
|
---|
| 450 | IPA_REF_ADDR, stmt);
|
---|
| 451 | }
|
---|
| 452 | }
|
---|
| 453 | diff -Naur gcc-4.8.2.orig/gcc/combine.c gcc-4.8.2/gcc/combine.c
|
---|
| 454 | --- gcc-4.8.2.orig/gcc/combine.c 2013-05-03 13:19:51.000000000 +0000
|
---|
| 455 | +++ gcc-4.8.2/gcc/combine.c 2013-11-01 16:12:30.379175001 +0000
|
---|
| 456 | @@ -5798,8 +5798,15 @@
|
---|
| 457 | return x;
|
---|
| 458 | }
|
---|
| 459 |
|
---|
| 460 | - /* If the code changed, return a whole new comparison. */
|
---|
| 461 | - if (new_code != code)
|
---|
| 462 | + /* If the code changed, return a whole new comparison.
|
---|
| 463 | + We also need to avoid using SUBST in cases where
|
---|
| 464 | + simplify_comparison has widened a comparison with a CONST_INT,
|
---|
| 465 | + since in that case the wider CONST_INT may fail the sanity
|
---|
| 466 | + checks in do_SUBST. */
|
---|
| 467 | + if (new_code != code
|
---|
| 468 | + || (CONST_INT_P (op1)
|
---|
| 469 | + && GET_MODE (op0) != GET_MODE (XEXP (x, 0))
|
---|
| 470 | + && GET_MODE (op0) != GET_MODE (XEXP (x, 1))))
|
---|
| 471 | return gen_rtx_fmt_ee (new_code, mode, op0, op1);
|
---|
[2e59d11] | 472 |
|
---|
[88af5df] | 473 | /* Otherwise, keep this operation, but maybe change its operands.
|
---|
| 474 | diff -Naur gcc-4.8.2.orig/gcc/config/i386/i386.c gcc-4.8.2/gcc/config/i386/i386.c
|
---|
[2e59d11] | 475 | --- gcc-4.8.2.orig/gcc/config/i386/i386.c 2013-08-23 10:01:34.000000000 +0000
|
---|
| 476 | +++ gcc-4.8.2/gcc/config/i386/i386.c 2013-11-01 16:12:30.487193593 +0000
|
---|
| 477 | @@ -2983,7 +2983,7 @@
|
---|
| 478 | {"bdver3", PROCESSOR_BDVER3, CPU_BDVER3,
|
---|
| 479 | PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
|
---|
| 480 | | PTA_SSE4A | PTA_CX16 | PTA_ABM | PTA_SSSE3 | PTA_SSE4_1
|
---|
| 481 | - | PTA_SSE4_2 | PTA_AES | PTA_PCLMUL | PTA_AVX
|
---|
| 482 | + | PTA_SSE4_2 | PTA_AES | PTA_PCLMUL | PTA_AVX | PTA_FMA4
|
---|
| 483 | | PTA_XOP | PTA_LWP | PTA_BMI | PTA_TBM | PTA_F16C
|
---|
[88af5df] | 484 | | PTA_FMA | PTA_PRFCHW | PTA_FXSR | PTA_XSAVE
|
---|
| 485 | | PTA_XSAVEOPT},
|
---|
| 486 | @@ -7235,9 +7235,15 @@
|
---|
| 487 | switch (regno)
|
---|
| 488 | {
|
---|
| 489 | case AX_REG:
|
---|
| 490 | + case DX_REG:
|
---|
| 491 | return true;
|
---|
| 492 | -
|
---|
| 493 | - case FIRST_FLOAT_REG:
|
---|
| 494 | + case DI_REG:
|
---|
| 495 | + case SI_REG:
|
---|
| 496 | + return TARGET_64BIT && ix86_abi != MS_ABI;
|
---|
| 497 | +
|
---|
| 498 | + /* Complex values are returned in %st(0)/%st(1) pair. */
|
---|
| 499 | + case ST0_REG:
|
---|
| 500 | + case ST1_REG:
|
---|
| 501 | /* TODO: The function should depend on current function ABI but
|
---|
| 502 | builtins.c would need updating then. Therefore we use the
|
---|
| 503 | default ABI. */
|
---|
| 504 | @@ -7245,10 +7251,12 @@
|
---|
| 505 | return false;
|
---|
| 506 | return TARGET_FLOAT_RETURNS_IN_80387;
|
---|
| 507 |
|
---|
| 508 | - case FIRST_SSE_REG:
|
---|
| 509 | + /* Complex values are returned in %xmm0/%xmm1 pair. */
|
---|
| 510 | + case XMM0_REG:
|
---|
| 511 | + case XMM1_REG:
|
---|
| 512 | return TARGET_SSE;
|
---|
| 513 |
|
---|
| 514 | - case FIRST_MMX_REG:
|
---|
| 515 | + case MM0_REG:
|
---|
| 516 | if (TARGET_MACHO || TARGET_64BIT)
|
---|
| 517 | return false;
|
---|
| 518 | return TARGET_MMX;
|
---|
| 519 | @@ -13817,8 +13825,6 @@
|
---|
| 520 | Those same assemblers have the same but opposite lossage on cmov. */
|
---|
| 521 | if (mode == CCmode)
|
---|
| 522 | suffix = fp ? "nbe" : "a";
|
---|
| 523 | - else if (mode == CCCmode)
|
---|
| 524 | - suffix = "b";
|
---|
| 525 | else
|
---|
| 526 | gcc_unreachable ();
|
---|
| 527 | break;
|
---|
| 528 | @@ -13840,8 +13846,12 @@
|
---|
| 529 | }
|
---|
| 530 | break;
|
---|
| 531 | case LTU:
|
---|
| 532 | - gcc_assert (mode == CCmode || mode == CCCmode);
|
---|
| 533 | - suffix = "b";
|
---|
| 534 | + if (mode == CCmode)
|
---|
| 535 | + suffix = "b";
|
---|
| 536 | + else if (mode == CCCmode)
|
---|
| 537 | + suffix = "c";
|
---|
| 538 | + else
|
---|
| 539 | + gcc_unreachable ();
|
---|
| 540 | break;
|
---|
| 541 | case GE:
|
---|
| 542 | switch (mode)
|
---|
| 543 | @@ -13861,20 +13871,20 @@
|
---|
| 544 | }
|
---|
| 545 | break;
|
---|
| 546 | case GEU:
|
---|
| 547 | - /* ??? As above. */
|
---|
| 548 | - gcc_assert (mode == CCmode || mode == CCCmode);
|
---|
| 549 | - suffix = fp ? "nb" : "ae";
|
---|
| 550 | + if (mode == CCmode)
|
---|
| 551 | + suffix = fp ? "nb" : "ae";
|
---|
| 552 | + else if (mode == CCCmode)
|
---|
| 553 | + suffix = "nc";
|
---|
| 554 | + else
|
---|
| 555 | + gcc_unreachable ();
|
---|
| 556 | break;
|
---|
| 557 | case LE:
|
---|
| 558 | gcc_assert (mode == CCmode || mode == CCGCmode || mode == CCNOmode);
|
---|
| 559 | suffix = "le";
|
---|
| 560 | break;
|
---|
| 561 | case LEU:
|
---|
| 562 | - /* ??? As above. */
|
---|
| 563 | if (mode == CCmode)
|
---|
| 564 | suffix = "be";
|
---|
| 565 | - else if (mode == CCCmode)
|
---|
| 566 | - suffix = fp ? "nb" : "ae";
|
---|
| 567 | else
|
---|
| 568 | gcc_unreachable ();
|
---|
| 569 | break;
|
---|
| 570 | @@ -18486,12 +18496,7 @@
|
---|
| 571 | return CCmode;
|
---|
| 572 | case GTU: /* CF=0 & ZF=0 */
|
---|
| 573 | case LEU: /* CF=1 | ZF=1 */
|
---|
| 574 | - /* Detect overflow checks. They need just the carry flag. */
|
---|
| 575 | - if (GET_CODE (op0) == MINUS
|
---|
| 576 | - && rtx_equal_p (op1, XEXP (op0, 0)))
|
---|
| 577 | - return CCCmode;
|
---|
| 578 | - else
|
---|
| 579 | - return CCmode;
|
---|
| 580 | + return CCmode;
|
---|
| 581 | /* Codes possibly doable only with sign flag when
|
---|
| 582 | comparing against zero. */
|
---|
| 583 | case GE: /* SF=OF or SF=0 */
|
---|
| 584 | diff -Naur gcc-4.8.2.orig/gcc/config/i386/i386.md gcc-4.8.2/gcc/config/i386/i386.md
|
---|
| 585 | --- gcc-4.8.2.orig/gcc/config/i386/i386.md 2013-08-13 12:45:06.000000000 +0000
|
---|
| 586 | +++ gcc-4.8.2/gcc/config/i386/i386.md 2013-11-01 16:12:31.467362295 +0000
|
---|
| 587 | @@ -6589,7 +6589,7 @@
|
---|
| 588 | (set_attr "use_carry" "1")
|
---|
| 589 | (set_attr "mode" "<MODE>")])
|
---|
| 590 | |
---|
| 591 |
|
---|
| 592 | -;; Overflow setting add and subtract instructions
|
---|
| 593 | +;; Overflow setting add instructions
|
---|
| 594 |
|
---|
| 595 | (define_insn "*add<mode>3_cconly_overflow"
|
---|
| 596 | [(set (reg:CCC FLAGS_REG)
|
---|
| 597 | @@ -6604,43 +6604,31 @@
|
---|
| 598 | [(set_attr "type" "alu")
|
---|
| 599 | (set_attr "mode" "<MODE>")])
|
---|
| 600 |
|
---|
| 601 | -(define_insn "*sub<mode>3_cconly_overflow"
|
---|
| 602 | +(define_insn "*add<mode>3_cc_overflow"
|
---|
| 603 | [(set (reg:CCC FLAGS_REG)
|
---|
| 604 | (compare:CCC
|
---|
| 605 | - (minus:SWI
|
---|
| 606 | - (match_operand:SWI 0 "nonimmediate_operand" "<r>m,<r>")
|
---|
| 607 | - (match_operand:SWI 1 "<general_operand>" "<r><i>,<r>m"))
|
---|
| 608 | - (match_dup 0)))]
|
---|
| 609 | - ""
|
---|
| 610 | - "cmp{<imodesuffix>}\t{%1, %0|%0, %1}"
|
---|
| 611 | - [(set_attr "type" "icmp")
|
---|
| 612 | - (set_attr "mode" "<MODE>")])
|
---|
| 613 | -
|
---|
| 614 | -(define_insn "*<plusminus_insn><mode>3_cc_overflow"
|
---|
| 615 | - [(set (reg:CCC FLAGS_REG)
|
---|
| 616 | - (compare:CCC
|
---|
| 617 | - (plusminus:SWI
|
---|
| 618 | - (match_operand:SWI 1 "nonimmediate_operand" "<comm>0,0")
|
---|
| 619 | + (plus:SWI
|
---|
| 620 | + (match_operand:SWI 1 "nonimmediate_operand" "%0,0")
|
---|
| 621 | (match_operand:SWI 2 "<general_operand>" "<r><i>,<r>m"))
|
---|
| 622 | (match_dup 1)))
|
---|
| 623 | (set (match_operand:SWI 0 "nonimmediate_operand" "=<r>m,<r>")
|
---|
| 624 | - (plusminus:SWI (match_dup 1) (match_dup 2)))]
|
---|
| 625 | - "ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
|
---|
| 626 | - "<plusminus_mnemonic>{<imodesuffix>}\t{%2, %0|%0, %2}"
|
---|
| 627 | + (plus:SWI (match_dup 1) (match_dup 2)))]
|
---|
| 628 | + "ix86_binary_operator_ok (PLUS, <MODE>mode, operands)"
|
---|
| 629 | + "add{<imodesuffix>}\t{%2, %0|%0, %2}"
|
---|
| 630 | [(set_attr "type" "alu")
|
---|
| 631 | (set_attr "mode" "<MODE>")])
|
---|
| 632 |
|
---|
| 633 | -(define_insn "*<plusminus_insn>si3_zext_cc_overflow"
|
---|
| 634 | +(define_insn "*addsi3_zext_cc_overflow"
|
---|
| 635 | [(set (reg:CCC FLAGS_REG)
|
---|
| 636 | (compare:CCC
|
---|
| 637 | - (plusminus:SI
|
---|
| 638 | - (match_operand:SI 1 "nonimmediate_operand" "<comm>0")
|
---|
| 639 | + (plus:SI
|
---|
| 640 | + (match_operand:SI 1 "nonimmediate_operand" "%0")
|
---|
| 641 | (match_operand:SI 2 "x86_64_general_operand" "rme"))
|
---|
| 642 | (match_dup 1)))
|
---|
| 643 | (set (match_operand:DI 0 "register_operand" "=r")
|
---|
| 644 | - (zero_extend:DI (plusminus:SI (match_dup 1) (match_dup 2))))]
|
---|
| 645 | - "TARGET_64BIT && ix86_binary_operator_ok (<CODE>, SImode, operands)"
|
---|
| 646 | - "<plusminus_mnemonic>{l}\t{%2, %k0|%k0, %2}"
|
---|
| 647 | + (zero_extend:DI (plus:SI (match_dup 1) (match_dup 2))))]
|
---|
| 648 | + "TARGET_64BIT && ix86_binary_operator_ok (PLUS, SImode, operands)"
|
---|
| 649 | + "add{l}\t{%2, %k0|%k0, %2}"
|
---|
[2e59d11] | 650 | [(set_attr "type" "alu")
|
---|
[88af5df] | 651 | (set_attr "mode" "SI")])
|
---|
| 652 |
|
---|
[2e59d11] | 653 | diff -Naur gcc-4.8.2.orig/gcc/config/rs6000/rs6000.md gcc-4.8.2/gcc/config/rs6000/rs6000.md
|
---|
| 654 | --- gcc-4.8.2.orig/gcc/config/rs6000/rs6000.md 2013-09-23 14:27:06.000000000 +0000
|
---|
| 655 | +++ gcc-4.8.2/gcc/config/rs6000/rs6000.md 2013-11-01 16:12:31.479364360 +0000
|
---|
| 656 | @@ -2412,7 +2412,7 @@
|
---|
| 657 | (match_operand:SI 2 "gpc_reg_operand" "r,r"))
|
---|
| 658 | (const_int 0)))
|
---|
| 659 | (clobber (match_scratch:SI 3 "=r,r"))]
|
---|
| 660 | - ""
|
---|
| 661 | + "TARGET_32BIT"
|
---|
| 662 | "@
|
---|
| 663 | mullw. %3,%1,%2
|
---|
| 664 | #"
|
---|
| 665 | @@ -2425,7 +2425,7 @@
|
---|
| 666 | (match_operand:SI 2 "gpc_reg_operand" ""))
|
---|
| 667 | (const_int 0)))
|
---|
| 668 | (clobber (match_scratch:SI 3 ""))]
|
---|
| 669 | - "reload_completed"
|
---|
| 670 | + "TARGET_32BIT && reload_completed"
|
---|
| 671 | [(set (match_dup 3)
|
---|
| 672 | (mult:SI (match_dup 1) (match_dup 2)))
|
---|
| 673 | (set (match_dup 0)
|
---|
| 674 | @@ -2440,7 +2440,7 @@
|
---|
| 675 | (const_int 0)))
|
---|
| 676 | (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
|
---|
| 677 | (mult:SI (match_dup 1) (match_dup 2)))]
|
---|
| 678 | - ""
|
---|
| 679 | + "TARGET_32BIT"
|
---|
| 680 | "@
|
---|
| 681 | mullw. %0,%1,%2
|
---|
| 682 | #"
|
---|
| 683 | @@ -2454,7 +2454,7 @@
|
---|
| 684 | (const_int 0)))
|
---|
| 685 | (set (match_operand:SI 0 "gpc_reg_operand" "")
|
---|
| 686 | (mult:SI (match_dup 1) (match_dup 2)))]
|
---|
| 687 | - "reload_completed"
|
---|
| 688 | + "TARGET_32BIT && reload_completed"
|
---|
| 689 | [(set (match_dup 0)
|
---|
[88af5df] | 690 | (mult:SI (match_dup 1) (match_dup 2)))
|
---|
| 691 | (set (match_dup 3)
|
---|
[2e59d11] | 692 | diff -Naur gcc-4.8.2.orig/gcc/config/sh/sh.opt gcc-4.8.2/gcc/config/sh/sh.opt
|
---|
| 693 | --- gcc-4.8.2.orig/gcc/config/sh/sh.opt 2013-03-13 18:09:10.000000000 +0000
|
---|
| 694 | +++ gcc-4.8.2/gcc/config/sh/sh.opt 2013-11-01 16:12:32.375518598 +0000
|
---|
| 695 | @@ -21,7 +21,7 @@
|
---|
| 696 | ;; Used for various architecture options.
|
---|
| 697 | Mask(SH_E)
|
---|
| 698 |
|
---|
| 699 | -;; Set if the default precision of th FPU is single.
|
---|
| 700 | +;; Set if the default precision of the FPU is single.
|
---|
| 701 | Mask(FPU_SINGLE)
|
---|
[88af5df] | 702 |
|
---|
| 703 | ;; Set if the a double-precision FPU is present but is restricted to
|
---|
[2e59d11] | 704 | diff -Naur gcc-4.8.2.orig/gcc/cp/decl2.c gcc-4.8.2/gcc/cp/decl2.c
|
---|
| 705 | --- gcc-4.8.2.orig/gcc/cp/decl2.c 2013-05-20 13:37:44.000000000 +0000
|
---|
| 706 | +++ gcc-4.8.2/gcc/cp/decl2.c 2013-11-01 16:12:32.379519286 +0000
|
---|
| 707 | @@ -3960,6 +3960,22 @@
|
---|
| 708 | expand_or_defer_fn (finish_function (0));
|
---|
| 709 | }
|
---|
| 710 |
|
---|
| 711 | +/* The entire file is now complete. If requested, dump everything
|
---|
| 712 | + to a file. */
|
---|
| 713 | +
|
---|
| 714 | +static void
|
---|
| 715 | +dump_tu (void)
|
---|
| 716 | +{
|
---|
| 717 | + int flags;
|
---|
| 718 | + FILE *stream = dump_begin (TDI_tu, &flags);
|
---|
| 719 | +
|
---|
| 720 | + if (stream)
|
---|
| 721 | + {
|
---|
| 722 | + dump_node (global_namespace, flags & ~TDF_SLIM, stream);
|
---|
| 723 | + dump_end (TDI_tu, stream);
|
---|
| 724 | + }
|
---|
| 725 | +}
|
---|
| 726 | +
|
---|
| 727 | /* This routine is called at the end of compilation.
|
---|
| 728 | Its job is to create all the code needed to initialize and
|
---|
| 729 | destroy the global aggregates. We do the destruction
|
---|
| 730 | @@ -3990,6 +4006,7 @@
|
---|
| 731 | if (pch_file)
|
---|
| 732 | {
|
---|
| 733 | c_common_write_pch ();
|
---|
| 734 | + dump_tu ();
|
---|
| 735 | return;
|
---|
| 736 | }
|
---|
| 737 |
|
---|
| 738 | @@ -4359,16 +4376,7 @@
|
---|
| 739 |
|
---|
| 740 | /* The entire file is now complete. If requested, dump everything
|
---|
| 741 | to a file. */
|
---|
| 742 | - {
|
---|
| 743 | - int flags;
|
---|
| 744 | - FILE *stream = dump_begin (TDI_tu, &flags);
|
---|
| 745 | -
|
---|
| 746 | - if (stream)
|
---|
| 747 | - {
|
---|
| 748 | - dump_node (global_namespace, flags & ~TDF_SLIM, stream);
|
---|
| 749 | - dump_end (TDI_tu, stream);
|
---|
| 750 | - }
|
---|
| 751 | - }
|
---|
| 752 | + dump_tu ();
|
---|
[88af5df] | 753 |
|
---|
| 754 | if (flag_detailed_statistics)
|
---|
| 755 | {
|
---|
| 756 | diff -Naur gcc-4.8.2.orig/gcc/cp/except.c gcc-4.8.2/gcc/cp/except.c
|
---|
| 757 | --- gcc-4.8.2.orig/gcc/cp/except.c 2013-01-10 20:38:27.000000000 +0000
|
---|
| 758 | +++ gcc-4.8.2/gcc/cp/except.c 2013-11-01 16:12:32.995625323 +0000
|
---|
| 759 | @@ -380,6 +380,9 @@
|
---|
| 760 | {
|
---|
| 761 | tree type = body ? TREE_TYPE (body) : void_type_node;
|
---|
| 762 |
|
---|
| 763 | + if (!flag_exceptions)
|
---|
| 764 | + return body;
|
---|
| 765 | +
|
---|
[2e59d11] | 766 | if (cond && !value_dependent_expression_p (cond))
|
---|
[88af5df] | 767 | {
|
---|
| 768 | cond = cxx_constant_value (cond);
|
---|
[2e59d11] | 769 | diff -Naur gcc-4.8.2.orig/gcc/cp/parser.c gcc-4.8.2/gcc/cp/parser.c
|
---|
| 770 | --- gcc-4.8.2.orig/gcc/cp/parser.c 2013-10-02 18:27:30.000000000 +0000
|
---|
| 771 | +++ gcc-4.8.2/gcc/cp/parser.c 2013-11-01 16:12:33.015628766 +0000
|
---|
| 772 | @@ -6421,10 +6421,6 @@
|
---|
| 773 | /* Look for the `~'. */
|
---|
| 774 | cp_parser_require (parser, CPP_COMPL, RT_COMPL);
|
---|
| 775 |
|
---|
| 776 | - /* Once we see the ~, this has to be a pseudo-destructor. */
|
---|
| 777 | - if (!processing_template_decl && !cp_parser_error_occurred (parser))
|
---|
| 778 | - cp_parser_commit_to_tentative_parse (parser);
|
---|
| 779 | -
|
---|
| 780 | /* Look for the type-name again. We are not responsible for
|
---|
[88af5df] | 781 | checking that it matches the first type-name. */
|
---|
| 782 | *type = cp_parser_nonclass_name (parser);
|
---|
[2e59d11] | 783 | diff -Naur gcc-4.8.2.orig/gcc/cp/semantics.c gcc-4.8.2/gcc/cp/semantics.c
|
---|
| 784 | --- gcc-4.8.2.orig/gcc/cp/semantics.c 2013-10-08 22:29:49.000000000 +0000
|
---|
| 785 | +++ gcc-4.8.2/gcc/cp/semantics.c 2013-11-01 16:12:33.423698996 +0000
|
---|
| 786 | @@ -9481,7 +9481,14 @@
|
---|
| 787 | /* In unevaluated context this isn't an odr-use, so just return the
|
---|
| 788 | nearest 'this'. */
|
---|
| 789 | if (cp_unevaluated_operand)
|
---|
| 790 | - return lookup_name (this_identifier);
|
---|
| 791 | + {
|
---|
| 792 | + /* In an NSDMI the fake 'this' pointer that we're using for
|
---|
| 793 | + parsing is in scope_chain. */
|
---|
| 794 | + if (LAMBDA_EXPR_EXTRA_SCOPE (lambda)
|
---|
| 795 | + && TREE_CODE (LAMBDA_EXPR_EXTRA_SCOPE (lambda)) == FIELD_DECL)
|
---|
| 796 | + return scope_chain->x_current_class_ptr;
|
---|
| 797 | + return lookup_name (this_identifier);
|
---|
| 798 | + }
|
---|
[88af5df] | 799 |
|
---|
| 800 | /* Try to default capture 'this' if we can. */
|
---|
| 801 | if (!this_capture
|
---|
| 802 | diff -Naur gcc-4.8.2.orig/gcc/gimple-fold.c gcc-4.8.2/gcc/gimple-fold.c
|
---|
| 803 | --- gcc-4.8.2.orig/gcc/gimple-fold.c 2013-01-13 12:33:43.000000000 +0000
|
---|
| 804 | +++ gcc-4.8.2/gcc/gimple-fold.c 2013-11-01 16:12:33.427699685 +0000
|
---|
| 805 | @@ -178,7 +178,7 @@
|
---|
| 806 | /* Make sure we create a cgraph node for functions we'll reference.
|
---|
| 807 | They can be non-existent if the reference comes from an entry
|
---|
| 808 | of an external vtable for example. */
|
---|
| 809 | - cgraph_get_create_node (base);
|
---|
| 810 | + cgraph_get_create_real_symbol_node (base);
|
---|
| 811 | }
|
---|
| 812 | /* Fixup types in global initializers. */
|
---|
| 813 | if (TREE_TYPE (TREE_TYPE (cval)) != TREE_TYPE (TREE_OPERAND (cval, 0)))
|
---|
| 814 | diff -Naur gcc-4.8.2.orig/gcc/go/go-gcc.cc gcc-4.8.2/gcc/go/go-gcc.cc
|
---|
| 815 | --- gcc-4.8.2.orig/gcc/go/go-gcc.cc 2013-10-04 18:07:35.000000000 +0000
|
---|
| 816 | +++ gcc-4.8.2/gcc/go/go-gcc.cc 2013-11-01 16:12:34.067809850 +0000
|
---|
| 817 | @@ -232,6 +232,9 @@
|
---|
| 818 | Bexpression*
|
---|
| 819 | convert_expression(Btype* type, Bexpression* expr, Location);
|
---|
| 820 |
|
---|
| 821 | + Bexpression*
|
---|
| 822 | + function_code_expression(Bfunction*, Location);
|
---|
| 823 | +
|
---|
| 824 | // Statements.
|
---|
| 825 |
|
---|
| 826 | Bstatement*
|
---|
| 827 | @@ -334,6 +337,17 @@
|
---|
| 828 | Bexpression*
|
---|
| 829 | label_address(Blabel*, Location);
|
---|
| 830 |
|
---|
| 831 | + // Functions.
|
---|
| 832 | +
|
---|
| 833 | + Bfunction*
|
---|
| 834 | + error_function()
|
---|
| 835 | + { return this->make_function(error_mark_node); }
|
---|
| 836 | +
|
---|
| 837 | + Bfunction*
|
---|
| 838 | + function(Btype* fntype, const std::string& name, const std::string& asm_name,
|
---|
| 839 | + bool is_visible, bool is_declaration, bool is_inlinable,
|
---|
| 840 | + bool disable_split_stack, bool in_unique_section, Location);
|
---|
| 841 | +
|
---|
| 842 | private:
|
---|
| 843 | // Make a Bexpression from a tree.
|
---|
| 844 | Bexpression*
|
---|
| 845 | @@ -350,6 +364,10 @@
|
---|
| 846 | make_type(tree t)
|
---|
| 847 | { return new Btype(t); }
|
---|
| 848 |
|
---|
| 849 | + Bfunction*
|
---|
| 850 | + make_function(tree t)
|
---|
| 851 | + { return new Bfunction(t); }
|
---|
| 852 | +
|
---|
| 853 | Btype*
|
---|
| 854 | fill_in_struct(Btype*, const std::vector<Btyped_identifier>&);
|
---|
| 855 |
|
---|
| 856 | @@ -966,6 +984,19 @@
|
---|
| 857 | return tree_to_expr(ret);
|
---|
| 858 | }
|
---|
| 859 |
|
---|
| 860 | +// Get the address of a function.
|
---|
| 861 | +
|
---|
| 862 | +Bexpression*
|
---|
| 863 | +Gcc_backend::function_code_expression(Bfunction* bfunc, Location location)
|
---|
| 864 | +{
|
---|
| 865 | + tree func = bfunc->get_tree();
|
---|
| 866 | + if (func == error_mark_node)
|
---|
| 867 | + return this->error_expression();
|
---|
| 868 | +
|
---|
| 869 | + tree ret = build_fold_addr_expr_loc(location.gcc_location(), func);
|
---|
| 870 | + return this->make_expression(ret);
|
---|
| 871 | +}
|
---|
| 872 | +
|
---|
| 873 | // An expression as a statement.
|
---|
| 874 |
|
---|
| 875 | Bstatement*
|
---|
| 876 | @@ -1724,6 +1755,56 @@
|
---|
| 877 | return this->make_expression(ret);
|
---|
| 878 | }
|
---|
| 879 |
|
---|
| 880 | +// Declare or define a new function.
|
---|
| 881 | +
|
---|
| 882 | +Bfunction*
|
---|
| 883 | +Gcc_backend::function(Btype* fntype, const std::string& name,
|
---|
| 884 | + const std::string& asm_name, bool is_visible,
|
---|
| 885 | + bool is_declaration, bool is_inlinable,
|
---|
| 886 | + bool disable_split_stack, bool in_unique_section,
|
---|
| 887 | + Location location)
|
---|
| 888 | +{
|
---|
| 889 | + tree functype = fntype->get_tree();
|
---|
| 890 | + if (functype != error_mark_node)
|
---|
| 891 | + {
|
---|
| 892 | + gcc_assert(FUNCTION_POINTER_TYPE_P(functype));
|
---|
| 893 | + functype = TREE_TYPE(functype);
|
---|
| 894 | + }
|
---|
| 895 | + tree id = get_identifier_from_string(name);
|
---|
| 896 | + if (functype == error_mark_node || id == error_mark_node)
|
---|
| 897 | + return this->error_function();
|
---|
| 898 | +
|
---|
| 899 | + tree decl = build_decl(location.gcc_location(), FUNCTION_DECL, id, functype);
|
---|
| 900 | + if (!asm_name.empty())
|
---|
| 901 | + SET_DECL_ASSEMBLER_NAME(decl, get_identifier_from_string(asm_name));
|
---|
| 902 | + if (is_visible)
|
---|
| 903 | + TREE_PUBLIC(decl) = 1;
|
---|
| 904 | + if (is_declaration)
|
---|
| 905 | + DECL_EXTERNAL(decl) = 1;
|
---|
| 906 | + else
|
---|
| 907 | + {
|
---|
| 908 | + tree restype = TREE_TYPE(functype);
|
---|
| 909 | + tree resdecl =
|
---|
| 910 | + build_decl(location.gcc_location(), RESULT_DECL, NULL_TREE, restype);
|
---|
| 911 | + DECL_ARTIFICIAL(resdecl) = 1;
|
---|
| 912 | + DECL_IGNORED_P(resdecl) = 1;
|
---|
| 913 | + DECL_CONTEXT(resdecl) = decl;
|
---|
| 914 | + DECL_RESULT(decl) = resdecl;
|
---|
| 915 | + }
|
---|
| 916 | + if (!is_inlinable)
|
---|
| 917 | + DECL_UNINLINABLE(decl) = 1;
|
---|
| 918 | + if (disable_split_stack)
|
---|
| 919 | + {
|
---|
| 920 | + tree attr = get_identifier("__no_split_stack__");
|
---|
| 921 | + DECL_ATTRIBUTES(decl) = tree_cons(attr, NULL_TREE, NULL_TREE);
|
---|
| 922 | + }
|
---|
| 923 | + if (in_unique_section)
|
---|
| 924 | + resolve_unique_section(decl, 0, 1);
|
---|
| 925 | +
|
---|
| 926 | + go_preserve_from_gc(decl);
|
---|
| 927 | + return new Bfunction(decl);
|
---|
| 928 | +}
|
---|
| 929 | +
|
---|
| 930 | // The single backend.
|
---|
| 931 |
|
---|
| 932 | static Gcc_backend gcc_backend;
|
---|
| 933 | @@ -1799,3 +1880,9 @@
|
---|
| 934 | {
|
---|
| 935 | return bv->get_tree();
|
---|
| 936 | }
|
---|
| 937 | +
|
---|
| 938 | +tree
|
---|
| 939 | +function_to_tree(Bfunction* bf)
|
---|
[2e59d11] | 940 | +{
|
---|
[88af5df] | 941 | + return bf->get_tree();
|
---|
| 942 | +}
|
---|
[2e59d11] | 943 | diff -Naur gcc-4.8.2.orig/gcc/go/gofrontend/backend.h gcc-4.8.2/gcc/go/gofrontend/backend.h
|
---|
| 944 | --- gcc-4.8.2.orig/gcc/go/gofrontend/backend.h 2013-10-04 18:07:35.000000000 +0000
|
---|
| 945 | +++ gcc-4.8.2/gcc/go/gofrontend/backend.h 2013-11-01 16:12:33.427699685 +0000
|
---|
| 946 | @@ -23,7 +23,7 @@
|
---|
| 947 | // The backend representation of a statement.
|
---|
| 948 | class Bstatement;
|
---|
| 949 |
|
---|
| 950 | -// The backend representation of a function definition.
|
---|
| 951 | +// The backend representation of a function definition or declaration.
|
---|
| 952 | class Bfunction;
|
---|
| 953 |
|
---|
| 954 | // The backend representation of a block.
|
---|
| 955 | @@ -266,6 +266,11 @@
|
---|
| 956 | virtual Bexpression*
|
---|
| 957 | convert_expression(Btype* type, Bexpression* expr, Location) = 0;
|
---|
| 958 |
|
---|
| 959 | + // Create an expression for the address of a function. This is used to
|
---|
| 960 | + // get the address of the code for a function.
|
---|
| 961 | + virtual Bexpression*
|
---|
| 962 | + function_code_expression(Bfunction*, Location) = 0;
|
---|
| 963 | +
|
---|
| 964 | // Statements.
|
---|
| 965 |
|
---|
| 966 | // Create an error statement. This is used for cases which should
|
---|
| 967 | @@ -498,6 +503,32 @@
|
---|
| 968 | // recover.
|
---|
| 969 | virtual Bexpression*
|
---|
| 970 | label_address(Blabel*, Location) = 0;
|
---|
| 971 | +
|
---|
| 972 | + // Functions.
|
---|
| 973 | +
|
---|
| 974 | + // Create an error function. This is used for cases which should
|
---|
| 975 | + // not occur in a correct program, in order to keep the compilation
|
---|
| 976 | + // going without crashing.
|
---|
| 977 | + virtual Bfunction*
|
---|
| 978 | + error_function() = 0;
|
---|
| 979 | +
|
---|
| 980 | + // Declare or define a function of FNTYPE.
|
---|
| 981 | + // NAME is the Go name of the function. ASM_NAME, if not the empty string, is
|
---|
| 982 | + // the name that should be used in the symbol table; this will be non-empty if
|
---|
| 983 | + // a magic extern comment is used.
|
---|
| 984 | + // IS_VISIBLE is true if this function should be visible outside of the
|
---|
| 985 | + // current compilation unit. IS_DECLARATION is true if this is a function
|
---|
| 986 | + // declaration rather than a definition; the function definition will be in
|
---|
| 987 | + // another compilation unit.
|
---|
| 988 | + // IS_INLINABLE is true if the function can be inlined.
|
---|
| 989 | + // DISABLE_SPLIT_STACK is true if this function may not split the stack; this
|
---|
| 990 | + // is used for the implementation of recover.
|
---|
| 991 | + // IN_UNIQUE_SECTION is true if this function should be put into a unique
|
---|
| 992 | + // location if possible; this is used for field tracking.
|
---|
| 993 | + virtual Bfunction*
|
---|
| 994 | + function(Btype* fntype, const std::string& name, const std::string& asm_name,
|
---|
| 995 | + bool is_visible, bool is_declaration, bool is_inlinable,
|
---|
| 996 | + bool disable_split_stack, bool in_unique_section, Location) = 0;
|
---|
| 997 | };
|
---|
| 998 |
|
---|
| 999 | // The backend interface has to define this function.
|
---|
| 1000 | @@ -517,5 +548,6 @@
|
---|
| 1001 | extern tree stat_to_tree(Bstatement*);
|
---|
| 1002 | extern tree block_to_tree(Bblock*);
|
---|
| 1003 | extern tree var_to_tree(Bvariable*);
|
---|
| 1004 | +extern tree function_to_tree(Bfunction*);
|
---|
[88af5df] | 1005 |
|
---|
| 1006 | #endif // !defined(GO_BACKEND_H)
|
---|
[2e59d11] | 1007 | diff -Naur gcc-4.8.2.orig/gcc/go/gofrontend/expressions.cc gcc-4.8.2/gcc/go/gofrontend/expressions.cc
|
---|
| 1008 | --- gcc-4.8.2.orig/gcc/go/gofrontend/expressions.cc 2013-10-08 23:54:31.000000000 +0000
|
---|
| 1009 | +++ gcc-4.8.2/gcc/go/gofrontend/expressions.cc 2013-11-01 16:12:33.435701062 +0000
|
---|
| 1010 | @@ -1219,7 +1219,7 @@
|
---|
| 1011 |
|
---|
| 1012 | // Get the tree for the code of a function expression.
|
---|
| 1013 |
|
---|
| 1014 | -tree
|
---|
| 1015 | +Bexpression*
|
---|
| 1016 | Func_expression::get_code_pointer(Gogo* gogo, Named_object* no, Location loc)
|
---|
| 1017 | {
|
---|
| 1018 | Function_type* fntype;
|
---|
| 1019 | @@ -1237,25 +1237,18 @@
|
---|
| 1020 | error_at(loc,
|
---|
| 1021 | "invalid use of special builtin function %qs; must be called",
|
---|
| 1022 | no->message_name().c_str());
|
---|
| 1023 | - return error_mark_node;
|
---|
| 1024 | + return gogo->backend()->error_expression();
|
---|
| 1025 | }
|
---|
| 1026 |
|
---|
| 1027 | - tree id = no->get_id(gogo);
|
---|
| 1028 | - if (id == error_mark_node)
|
---|
| 1029 | - return error_mark_node;
|
---|
| 1030 | -
|
---|
| 1031 | - tree fndecl;
|
---|
| 1032 | + Bfunction* fndecl;
|
---|
| 1033 | if (no->is_function())
|
---|
| 1034 | - fndecl = no->func_value()->get_or_make_decl(gogo, no, id);
|
---|
| 1035 | + fndecl = no->func_value()->get_or_make_decl(gogo, no);
|
---|
| 1036 | else if (no->is_function_declaration())
|
---|
| 1037 | - fndecl = no->func_declaration_value()->get_or_make_decl(gogo, no, id);
|
---|
| 1038 | + fndecl = no->func_declaration_value()->get_or_make_decl(gogo, no);
|
---|
| 1039 | else
|
---|
| 1040 | go_unreachable();
|
---|
| 1041 |
|
---|
| 1042 | - if (fndecl == error_mark_node)
|
---|
| 1043 | - return error_mark_node;
|
---|
| 1044 | -
|
---|
| 1045 | - return build_fold_addr_expr_loc(loc.gcc_location(), fndecl);
|
---|
| 1046 | + return gogo->backend()->function_code_expression(fndecl, loc);
|
---|
| 1047 | }
|
---|
| 1048 |
|
---|
| 1049 | // Get the tree for a function expression. This is used when we take
|
---|
| 1050 | @@ -1492,8 +1485,10 @@
|
---|
| 1051 | tree
|
---|
| 1052 | Func_code_reference_expression::do_get_tree(Translate_context* context)
|
---|
| 1053 | {
|
---|
| 1054 | - return Func_expression::get_code_pointer(context->gogo(), this->function_,
|
---|
| 1055 | - this->location());
|
---|
| 1056 | + Bexpression* ret =
|
---|
| 1057 | + Func_expression::get_code_pointer(context->gogo(), this->function_,
|
---|
| 1058 | + this->location());
|
---|
| 1059 | + return expr_to_tree(ret);
|
---|
| 1060 | }
|
---|
| 1061 |
|
---|
| 1062 | // Make a reference to the code of a function.
|
---|
| 1063 | @@ -3055,8 +3050,7 @@
|
---|
| 1064 | do_lower(Gogo*, Named_object*, Statement_inserter*, int);
|
---|
| 1065 |
|
---|
| 1066 | bool
|
---|
| 1067 | - do_is_constant() const
|
---|
| 1068 | - { return this->expr_->is_constant(); }
|
---|
| 1069 | + do_is_constant() const;
|
---|
| 1070 |
|
---|
| 1071 | bool
|
---|
| 1072 | do_numeric_constant_value(Numeric_constant*) const;
|
---|
| 1073 | @@ -3198,6 +3192,27 @@
|
---|
| 1074 | return this;
|
---|
| 1075 | }
|
---|
| 1076 |
|
---|
| 1077 | +// Return whether a type conversion is a constant.
|
---|
| 1078 | +
|
---|
| 1079 | +bool
|
---|
| 1080 | +Type_conversion_expression::do_is_constant() const
|
---|
| 1081 | +{
|
---|
| 1082 | + if (!this->expr_->is_constant())
|
---|
| 1083 | + return false;
|
---|
| 1084 | +
|
---|
| 1085 | + // A conversion to a type that may not be used as a constant is not
|
---|
| 1086 | + // a constant. For example, []byte(nil).
|
---|
| 1087 | + Type* type = this->type_;
|
---|
| 1088 | + if (type->integer_type() == NULL
|
---|
| 1089 | + && type->float_type() == NULL
|
---|
| 1090 | + && type->complex_type() == NULL
|
---|
| 1091 | + && !type->is_boolean_type()
|
---|
| 1092 | + && !type->is_string_type())
|
---|
| 1093 | + return false;
|
---|
| 1094 | +
|
---|
| 1095 | + return true;
|
---|
| 1096 | +}
|
---|
| 1097 | +
|
---|
| 1098 | // Return the constant numeric value if there is one.
|
---|
| 1099 |
|
---|
| 1100 | bool
|
---|
| 1101 | @@ -5586,6 +5601,15 @@
|
---|
| 1102 | subcontext.type = NULL;
|
---|
| 1103 | }
|
---|
| 1104 |
|
---|
| 1105 | + if (this->op_ == OPERATOR_ANDAND || this->op_ == OPERATOR_OROR)
|
---|
| 1106 | + {
|
---|
| 1107 | + // For a logical operation, the context does not determine the
|
---|
| 1108 | + // types of the operands. The operands must be some boolean
|
---|
| 1109 | + // type but if the context has a boolean type they do not
|
---|
| 1110 | + // inherit it. See http://golang.org/issue/3924.
|
---|
| 1111 | + subcontext.type = NULL;
|
---|
| 1112 | + }
|
---|
| 1113 | +
|
---|
| 1114 | // Set the context for the left hand operand.
|
---|
| 1115 | if (is_shift_op)
|
---|
| 1116 | {
|
---|
| 1117 | @@ -5967,6 +5991,43 @@
|
---|
| 1118 | right);
|
---|
| 1119 | }
|
---|
| 1120 |
|
---|
| 1121 | + // For complex division Go wants slightly different results than the
|
---|
| 1122 | + // GCC library provides, so we have our own runtime routine.
|
---|
| 1123 | + if (this->op_ == OPERATOR_DIV && this->left_->type()->complex_type() != NULL)
|
---|
| 1124 | + {
|
---|
| 1125 | + const char *name;
|
---|
| 1126 | + tree *pdecl;
|
---|
| 1127 | + Type* ctype;
|
---|
| 1128 | + static tree complex64_div_decl;
|
---|
| 1129 | + static tree complex128_div_decl;
|
---|
| 1130 | + switch (this->left_->type()->complex_type()->bits())
|
---|
| 1131 | + {
|
---|
| 1132 | + case 64:
|
---|
| 1133 | + name = "__go_complex64_div";
|
---|
| 1134 | + pdecl = &complex64_div_decl;
|
---|
| 1135 | + ctype = Type::lookup_complex_type("complex64");
|
---|
| 1136 | + break;
|
---|
| 1137 | + case 128:
|
---|
| 1138 | + name = "__go_complex128_div";
|
---|
| 1139 | + pdecl = &complex128_div_decl;
|
---|
| 1140 | + ctype = Type::lookup_complex_type("complex128");
|
---|
| 1141 | + break;
|
---|
| 1142 | + default:
|
---|
| 1143 | + go_unreachable();
|
---|
| 1144 | + }
|
---|
| 1145 | + Btype* cbtype = ctype->get_backend(gogo);
|
---|
| 1146 | + tree ctype_tree = type_to_tree(cbtype);
|
---|
| 1147 | + return Gogo::call_builtin(pdecl,
|
---|
| 1148 | + this->location(),
|
---|
| 1149 | + name,
|
---|
| 1150 | + 2,
|
---|
| 1151 | + ctype_tree,
|
---|
| 1152 | + ctype_tree,
|
---|
| 1153 | + fold_convert_loc(gccloc, ctype_tree, left),
|
---|
| 1154 | + type,
|
---|
| 1155 | + fold_convert_loc(gccloc, ctype_tree, right));
|
---|
| 1156 | + }
|
---|
| 1157 | +
|
---|
| 1158 | tree compute_type = excess_precision_type(type);
|
---|
| 1159 | if (compute_type != NULL_TREE)
|
---|
| 1160 | {
|
---|
| 1161 | @@ -7191,6 +7252,15 @@
|
---|
| 1162 | if (this->code_ == BUILTIN_OFFSETOF)
|
---|
| 1163 | {
|
---|
| 1164 | Expression* arg = this->one_arg();
|
---|
| 1165 | +
|
---|
| 1166 | + if (arg->bound_method_expression() != NULL
|
---|
| 1167 | + || arg->interface_field_reference_expression() != NULL)
|
---|
| 1168 | + {
|
---|
| 1169 | + this->report_error(_("invalid use of method value as argument "
|
---|
| 1170 | + "of Offsetof"));
|
---|
| 1171 | + return this;
|
---|
| 1172 | + }
|
---|
| 1173 | +
|
---|
| 1174 | Field_reference_expression* farg = arg->field_reference_expression();
|
---|
| 1175 | while (farg != NULL)
|
---|
| 1176 | {
|
---|
| 1177 | @@ -7200,7 +7270,8 @@
|
---|
| 1178 | // it must not be reached through pointer indirections.
|
---|
| 1179 | if (farg->expr()->deref() != farg->expr())
|
---|
| 1180 | {
|
---|
| 1181 | - this->report_error(_("argument of Offsetof implies indirection of an embedded field"));
|
---|
| 1182 | + this->report_error(_("argument of Offsetof implies "
|
---|
| 1183 | + "indirection of an embedded field"));
|
---|
| 1184 | return this;
|
---|
| 1185 | }
|
---|
| 1186 | // Go up until we reach the original base.
|
---|
| 1187 | @@ -7476,7 +7547,7 @@
|
---|
| 1188 | switch (nc.to_unsigned_long(&v))
|
---|
| 1189 | {
|
---|
| 1190 | case Numeric_constant::NC_UL_VALID:
|
---|
| 1191 | - return true;
|
---|
| 1192 | + break;
|
---|
| 1193 | case Numeric_constant::NC_UL_NOTINT:
|
---|
| 1194 | error_at(e->location(), "non-integer %s argument to make",
|
---|
| 1195 | is_length ? "len" : "cap");
|
---|
| 1196 | @@ -7488,8 +7559,23 @@
|
---|
| 1197 | case Numeric_constant::NC_UL_BIG:
|
---|
| 1198 | // We don't want to give a compile-time error for a 64-bit
|
---|
| 1199 | // value on a 32-bit target.
|
---|
| 1200 | - return true;
|
---|
| 1201 | + break;
|
---|
| 1202 | }
|
---|
| 1203 | +
|
---|
| 1204 | + mpz_t val;
|
---|
| 1205 | + if (!nc.to_int(&val))
|
---|
| 1206 | + go_unreachable();
|
---|
| 1207 | + int bits = mpz_sizeinbase(val, 2);
|
---|
| 1208 | + mpz_clear(val);
|
---|
| 1209 | + Type* int_type = Type::lookup_integer_type("int");
|
---|
| 1210 | + if (bits >= int_type->integer_type()->bits())
|
---|
| 1211 | + {
|
---|
| 1212 | + error_at(e->location(), "%s argument too large for make",
|
---|
| 1213 | + is_length ? "len" : "cap");
|
---|
| 1214 | + return false;
|
---|
| 1215 | + }
|
---|
| 1216 | +
|
---|
| 1217 | + return true;
|
---|
| 1218 | }
|
---|
| 1219 |
|
---|
| 1220 | if (e->type()->integer_type() != NULL)
|
---|
| 1221 | @@ -7595,6 +7681,8 @@
|
---|
| 1222 | bool
|
---|
| 1223 | Builtin_call_expression::do_is_constant() const
|
---|
| 1224 | {
|
---|
| 1225 | + if (this->is_error_expression())
|
---|
| 1226 | + return true;
|
---|
| 1227 | switch (this->code_)
|
---|
| 1228 | {
|
---|
| 1229 | case BUILTIN_LEN:
|
---|
| 1230 | @@ -9744,14 +9832,8 @@
|
---|
| 1231 | }
|
---|
| 1232 |
|
---|
| 1233 | tree fntype_tree = type_to_tree(fntype->get_backend(gogo));
|
---|
| 1234 | - if (fntype_tree == error_mark_node)
|
---|
| 1235 | - return error_mark_node;
|
---|
| 1236 | - go_assert(POINTER_TYPE_P(fntype_tree));
|
---|
| 1237 | - if (TREE_TYPE(fntype_tree) == error_mark_node)
|
---|
| 1238 | - return error_mark_node;
|
---|
| 1239 | - go_assert(TREE_CODE(TREE_TYPE(fntype_tree)) == RECORD_TYPE);
|
---|
| 1240 | - tree fnfield_type = TREE_TYPE(TYPE_FIELDS(TREE_TYPE(fntype_tree)));
|
---|
| 1241 | - if (fnfield_type == error_mark_node)
|
---|
| 1242 | + tree fnfield_type = type_to_tree(fntype->get_backend_fntype(gogo));
|
---|
| 1243 | + if (fntype_tree == error_mark_node || fnfield_type == error_mark_node)
|
---|
| 1244 | return error_mark_node;
|
---|
| 1245 | go_assert(FUNCTION_POINTER_TYPE_P(fnfield_type));
|
---|
| 1246 | tree rettype = TREE_TYPE(TREE_TYPE(fnfield_type));
|
---|
| 1247 | @@ -9763,7 +9845,7 @@
|
---|
| 1248 | if (func != NULL)
|
---|
| 1249 | {
|
---|
| 1250 | Named_object* no = func->named_object();
|
---|
| 1251 | - fn = Func_expression::get_code_pointer(gogo, no, location);
|
---|
| 1252 | + fn = expr_to_tree(Func_expression::get_code_pointer(gogo, no, location));
|
---|
| 1253 | if (!has_closure)
|
---|
| 1254 | closure_tree = NULL_TREE;
|
---|
| 1255 | else
|
---|
| 1256 | @@ -10817,11 +10899,20 @@
|
---|
| 1257 | void
|
---|
| 1258 | String_index_expression::do_check_types(Gogo*)
|
---|
| 1259 | {
|
---|
| 1260 | - if (this->start_->type()->integer_type() == NULL)
|
---|
| 1261 | + Numeric_constant nc;
|
---|
| 1262 | + unsigned long v;
|
---|
| 1263 | + if (this->start_->type()->integer_type() == NULL
|
---|
| 1264 | + && !this->start_->type()->is_error()
|
---|
| 1265 | + && (!this->start_->numeric_constant_value(&nc)
|
---|
| 1266 | + || nc.to_unsigned_long(&v) == Numeric_constant::NC_UL_NOTINT))
|
---|
| 1267 | this->report_error(_("index must be integer"));
|
---|
| 1268 | if (this->end_ != NULL
|
---|
| 1269 | && this->end_->type()->integer_type() == NULL
|
---|
| 1270 | - && !this->end_->is_nil_expression())
|
---|
| 1271 | + && !this->end_->type()->is_error()
|
---|
| 1272 | + && !this->end_->is_nil_expression()
|
---|
| 1273 | + && !this->end_->is_error_expression()
|
---|
| 1274 | + && (!this->end_->numeric_constant_value(&nc)
|
---|
| 1275 | + || nc.to_unsigned_long(&v) == Numeric_constant::NC_UL_NOTINT))
|
---|
| 1276 | this->report_error(_("slice end must be integer"));
|
---|
[88af5df] | 1277 |
|
---|
| 1278 | std::string sval;
|
---|
[2e59d11] | 1279 | diff -Naur gcc-4.8.2.orig/gcc/go/gofrontend/expressions.h gcc-4.8.2/gcc/go/gofrontend/expressions.h
|
---|
| 1280 | --- gcc-4.8.2.orig/gcc/go/gofrontend/expressions.h 2013-10-08 23:54:31.000000000 +0000
|
---|
| 1281 | +++ gcc-4.8.2/gcc/go/gofrontend/expressions.h 2013-11-01 16:12:33.963791948 +0000
|
---|
| 1282 | @@ -1514,8 +1514,8 @@
|
---|
| 1283 | closure()
|
---|
| 1284 | { return this->closure_; }
|
---|
| 1285 |
|
---|
| 1286 | - // Return a tree for the code for a function.
|
---|
| 1287 | - static tree
|
---|
| 1288 | + // Return a backend expression for the code of a function.
|
---|
| 1289 | + static Bexpression*
|
---|
[88af5df] | 1290 | get_code_pointer(Gogo*, Named_object* function, Location loc);
|
---|
| 1291 |
|
---|
| 1292 | protected:
|
---|
| 1293 | diff -Naur gcc-4.8.2.orig/gcc/go/gofrontend/gogo-tree.cc gcc-4.8.2/gcc/go/gofrontend/gogo-tree.cc
|
---|
| 1294 | --- gcc-4.8.2.orig/gcc/go/gofrontend/gogo-tree.cc 2013-09-28 20:23:56.000000000 +0000
|
---|
[2e59d11] | 1295 | +++ gcc-4.8.2/gcc/go/gofrontend/gogo-tree.cc 2013-11-01 16:12:33.975794014 +0000
|
---|
| 1296 | @@ -985,74 +985,6 @@
|
---|
| 1297 | delete[] vec;
|
---|
| 1298 | }
|
---|
| 1299 |
|
---|
| 1300 | -// Get a tree for the identifier for a named object.
|
---|
| 1301 | -
|
---|
| 1302 | -tree
|
---|
| 1303 | -Named_object::get_id(Gogo* gogo)
|
---|
| 1304 | -{
|
---|
| 1305 | - go_assert(!this->is_variable() && !this->is_result_variable());
|
---|
| 1306 | - std::string decl_name;
|
---|
| 1307 | - if (this->is_function_declaration()
|
---|
| 1308 | - && !this->func_declaration_value()->asm_name().empty())
|
---|
| 1309 | - decl_name = this->func_declaration_value()->asm_name();
|
---|
| 1310 | - else if (this->is_type()
|
---|
| 1311 | - && Linemap::is_predeclared_location(this->type_value()->location()))
|
---|
| 1312 | - {
|
---|
| 1313 | - // We don't need the package name for builtin types.
|
---|
| 1314 | - decl_name = Gogo::unpack_hidden_name(this->name_);
|
---|
| 1315 | - }
|
---|
| 1316 | - else
|
---|
| 1317 | - {
|
---|
| 1318 | - std::string package_name;
|
---|
| 1319 | - if (this->package_ == NULL)
|
---|
| 1320 | - package_name = gogo->package_name();
|
---|
| 1321 | - else
|
---|
| 1322 | - package_name = this->package_->package_name();
|
---|
| 1323 | -
|
---|
| 1324 | - // Note that this will be misleading if this is an unexported
|
---|
| 1325 | - // method generated for an embedded imported type. In that case
|
---|
| 1326 | - // the unexported method should have the package name of the
|
---|
| 1327 | - // package from which it is imported, but we are going to give
|
---|
| 1328 | - // it our package name. Fixing this would require knowing the
|
---|
| 1329 | - // package name, but we only know the package path. It might be
|
---|
| 1330 | - // better to use package paths here anyhow. This doesn't affect
|
---|
| 1331 | - // the assembler code, because we always set that name in
|
---|
| 1332 | - // Function::get_or_make_decl anyhow. FIXME.
|
---|
| 1333 | -
|
---|
| 1334 | - decl_name = package_name + '.' + Gogo::unpack_hidden_name(this->name_);
|
---|
| 1335 | -
|
---|
| 1336 | - Function_type* fntype;
|
---|
| 1337 | - if (this->is_function())
|
---|
| 1338 | - fntype = this->func_value()->type();
|
---|
| 1339 | - else if (this->is_function_declaration())
|
---|
| 1340 | - fntype = this->func_declaration_value()->type();
|
---|
| 1341 | - else
|
---|
| 1342 | - fntype = NULL;
|
---|
| 1343 | - if (fntype != NULL && fntype->is_method())
|
---|
| 1344 | - {
|
---|
| 1345 | - decl_name.push_back('.');
|
---|
| 1346 | - decl_name.append(fntype->receiver()->type()->mangled_name(gogo));
|
---|
| 1347 | - }
|
---|
| 1348 | - }
|
---|
| 1349 | - if (this->is_type())
|
---|
| 1350 | - {
|
---|
| 1351 | - unsigned int index;
|
---|
| 1352 | - const Named_object* in_function = this->type_value()->in_function(&index);
|
---|
| 1353 | - if (in_function != NULL)
|
---|
| 1354 | - {
|
---|
| 1355 | - decl_name += '$' + Gogo::unpack_hidden_name(in_function->name());
|
---|
| 1356 | - if (index > 0)
|
---|
| 1357 | - {
|
---|
| 1358 | - char buf[30];
|
---|
| 1359 | - snprintf(buf, sizeof buf, "%u", index);
|
---|
| 1360 | - decl_name += '$';
|
---|
| 1361 | - decl_name += buf;
|
---|
| 1362 | - }
|
---|
| 1363 | - }
|
---|
| 1364 | - }
|
---|
| 1365 | - return get_identifier_from_string(decl_name);
|
---|
| 1366 | -}
|
---|
| 1367 | -
|
---|
| 1368 | // Get a tree for a named object.
|
---|
| 1369 |
|
---|
| 1370 | tree
|
---|
| 1371 | @@ -1067,11 +999,6 @@
|
---|
| 1372 | return error_mark_node;
|
---|
| 1373 | }
|
---|
| 1374 |
|
---|
| 1375 | - tree name;
|
---|
| 1376 | - if (this->classification_ == NAMED_OBJECT_TYPE)
|
---|
| 1377 | - name = NULL_TREE;
|
---|
| 1378 | - else
|
---|
| 1379 | - name = this->get_id(gogo);
|
---|
| 1380 | tree decl;
|
---|
| 1381 | switch (this->classification_)
|
---|
| 1382 | {
|
---|
| 1383 | @@ -1099,6 +1026,7 @@
|
---|
| 1384 | decl = error_mark_node;
|
---|
| 1385 | else if (INTEGRAL_TYPE_P(TREE_TYPE(expr_tree)))
|
---|
| 1386 | {
|
---|
| 1387 | + tree name = get_identifier_from_string(this->get_id(gogo));
|
---|
| 1388 | decl = build_decl(named_constant->location().gcc_location(),
|
---|
| 1389 | CONST_DECL, name, TREE_TYPE(expr_tree));
|
---|
| 1390 | DECL_INITIAL(decl) = expr_tree;
|
---|
| 1391 | @@ -1161,7 +1089,7 @@
|
---|
| 1392 | case NAMED_OBJECT_FUNC:
|
---|
| 1393 | {
|
---|
| 1394 | Function* func = this->u_.func_value;
|
---|
| 1395 | - decl = func->get_or_make_decl(gogo, this, name);
|
---|
| 1396 | + decl = function_to_tree(func->get_or_make_decl(gogo, this));
|
---|
| 1397 | if (decl != error_mark_node)
|
---|
| 1398 | {
|
---|
| 1399 | if (func->block() != NULL)
|
---|
| 1400 | @@ -1286,123 +1214,12 @@
|
---|
| 1401 | return block_tree;
|
---|
| 1402 | }
|
---|
| 1403 |
|
---|
| 1404 | -// Get a tree for a function decl.
|
---|
| 1405 | +// Get the backend representation.
|
---|
| 1406 |
|
---|
| 1407 | -tree
|
---|
| 1408 | -Function::get_or_make_decl(Gogo* gogo, Named_object* no, tree id)
|
---|
| 1409 | +Bfunction*
|
---|
| 1410 | +Function_declaration::get_or_make_decl(Gogo* gogo, Named_object* no)
|
---|
| 1411 | {
|
---|
| 1412 | - if (this->fndecl_ == NULL_TREE)
|
---|
| 1413 | - {
|
---|
| 1414 | - tree functype = type_to_tree(this->type_->get_backend(gogo));
|
---|
| 1415 | -
|
---|
| 1416 | - if (functype != error_mark_node)
|
---|
| 1417 | - {
|
---|
| 1418 | - // The type of a function comes back as a pointer to a
|
---|
| 1419 | - // struct whose first field is the function, but we want the
|
---|
| 1420 | - // real function type for a function declaration.
|
---|
| 1421 | - go_assert(POINTER_TYPE_P(functype)
|
---|
| 1422 | - && TREE_CODE(TREE_TYPE(functype)) == RECORD_TYPE);
|
---|
| 1423 | - functype = TREE_TYPE(TYPE_FIELDS(TREE_TYPE(functype)));
|
---|
| 1424 | - go_assert(FUNCTION_POINTER_TYPE_P(functype));
|
---|
| 1425 | - functype = TREE_TYPE(functype);
|
---|
| 1426 | - }
|
---|
| 1427 | -
|
---|
| 1428 | - if (functype == error_mark_node)
|
---|
| 1429 | - this->fndecl_ = error_mark_node;
|
---|
| 1430 | - else
|
---|
| 1431 | - {
|
---|
| 1432 | - tree decl = build_decl(this->location().gcc_location(), FUNCTION_DECL,
|
---|
| 1433 | - id, functype);
|
---|
| 1434 | -
|
---|
| 1435 | - this->fndecl_ = decl;
|
---|
| 1436 | -
|
---|
| 1437 | - if (no->package() != NULL)
|
---|
| 1438 | - ;
|
---|
| 1439 | - else if (this->enclosing_ != NULL || Gogo::is_thunk(no))
|
---|
| 1440 | - ;
|
---|
| 1441 | - else if (Gogo::unpack_hidden_name(no->name()) == "init"
|
---|
| 1442 | - && !this->type_->is_method())
|
---|
| 1443 | - ;
|
---|
| 1444 | - else if (Gogo::unpack_hidden_name(no->name()) == "main"
|
---|
| 1445 | - && gogo->is_main_package())
|
---|
| 1446 | - TREE_PUBLIC(decl) = 1;
|
---|
| 1447 | - // Methods have to be public even if they are hidden because
|
---|
| 1448 | - // they can be pulled into type descriptors when using
|
---|
| 1449 | - // anonymous fields.
|
---|
| 1450 | - else if (!Gogo::is_hidden_name(no->name())
|
---|
| 1451 | - || this->type_->is_method())
|
---|
| 1452 | - {
|
---|
| 1453 | - TREE_PUBLIC(decl) = 1;
|
---|
| 1454 | - std::string pkgpath = gogo->pkgpath_symbol();
|
---|
| 1455 | - if (this->type_->is_method()
|
---|
| 1456 | - && Gogo::is_hidden_name(no->name())
|
---|
| 1457 | - && Gogo::hidden_name_pkgpath(no->name()) != gogo->pkgpath())
|
---|
| 1458 | - {
|
---|
| 1459 | - // This is a method we created for an unexported
|
---|
| 1460 | - // method of an imported embedded type. We need to
|
---|
| 1461 | - // use the pkgpath of the imported package to avoid
|
---|
| 1462 | - // a possible name collision. See bug478 for a test
|
---|
| 1463 | - // case.
|
---|
| 1464 | - pkgpath = Gogo::hidden_name_pkgpath(no->name());
|
---|
| 1465 | - pkgpath = Gogo::pkgpath_for_symbol(pkgpath);
|
---|
| 1466 | - }
|
---|
| 1467 | -
|
---|
| 1468 | - std::string asm_name = pkgpath;
|
---|
| 1469 | - asm_name.append(1, '.');
|
---|
| 1470 | - asm_name.append(Gogo::unpack_hidden_name(no->name()));
|
---|
| 1471 | - if (this->type_->is_method())
|
---|
| 1472 | - {
|
---|
| 1473 | - asm_name.append(1, '.');
|
---|
| 1474 | - Type* rtype = this->type_->receiver()->type();
|
---|
| 1475 | - asm_name.append(rtype->mangled_name(gogo));
|
---|
| 1476 | - }
|
---|
| 1477 | - SET_DECL_ASSEMBLER_NAME(decl,
|
---|
| 1478 | - get_identifier_from_string(asm_name));
|
---|
| 1479 | - }
|
---|
| 1480 | -
|
---|
| 1481 | - // Why do we have to do this in the frontend?
|
---|
| 1482 | - tree restype = TREE_TYPE(functype);
|
---|
| 1483 | - tree resdecl =
|
---|
| 1484 | - build_decl(this->location().gcc_location(), RESULT_DECL, NULL_TREE,
|
---|
| 1485 | - restype);
|
---|
| 1486 | - DECL_ARTIFICIAL(resdecl) = 1;
|
---|
| 1487 | - DECL_IGNORED_P(resdecl) = 1;
|
---|
| 1488 | - DECL_CONTEXT(resdecl) = decl;
|
---|
| 1489 | - DECL_RESULT(decl) = resdecl;
|
---|
| 1490 | -
|
---|
| 1491 | - // If a function calls the predeclared recover function, we
|
---|
| 1492 | - // can't inline it, because recover behaves differently in a
|
---|
| 1493 | - // function passed directly to defer. If this is a recover
|
---|
| 1494 | - // thunk that we built to test whether a function can be
|
---|
| 1495 | - // recovered, we can't inline it, because that will mess up
|
---|
| 1496 | - // our return address comparison.
|
---|
| 1497 | - if (this->calls_recover_ || this->is_recover_thunk_)
|
---|
| 1498 | - DECL_UNINLINABLE(decl) = 1;
|
---|
| 1499 | -
|
---|
| 1500 | - // If this is a thunk created to call a function which calls
|
---|
| 1501 | - // the predeclared recover function, we need to disable
|
---|
| 1502 | - // stack splitting for the thunk.
|
---|
| 1503 | - if (this->is_recover_thunk_)
|
---|
| 1504 | - {
|
---|
| 1505 | - tree attr = get_identifier("__no_split_stack__");
|
---|
| 1506 | - DECL_ATTRIBUTES(decl) = tree_cons(attr, NULL_TREE, NULL_TREE);
|
---|
| 1507 | - }
|
---|
| 1508 | -
|
---|
| 1509 | - if (this->in_unique_section_)
|
---|
| 1510 | - resolve_unique_section (decl, 0, 1);
|
---|
| 1511 | -
|
---|
| 1512 | - go_preserve_from_gc(decl);
|
---|
| 1513 | - }
|
---|
| 1514 | - }
|
---|
| 1515 | - return this->fndecl_;
|
---|
| 1516 | -}
|
---|
| 1517 | -
|
---|
| 1518 | -// Get a tree for a function declaration.
|
---|
| 1519 | -
|
---|
| 1520 | -tree
|
---|
| 1521 | -Function_declaration::get_or_make_decl(Gogo* gogo, Named_object* no, tree id)
|
---|
| 1522 | -{
|
---|
| 1523 | - if (this->fndecl_ == NULL_TREE)
|
---|
| 1524 | + if (this->fndecl_ == NULL)
|
---|
| 1525 | {
|
---|
| 1526 | // Let Go code use an asm declaration to pick up a builtin
|
---|
| 1527 | // function.
|
---|
| 1528 | @@ -1412,56 +1229,44 @@
|
---|
| 1529 | builtin_functions.find(this->asm_name_);
|
---|
| 1530 | if (p != builtin_functions.end())
|
---|
| 1531 | {
|
---|
| 1532 | - this->fndecl_ = p->second;
|
---|
| 1533 | + this->fndecl_ = tree_to_function(p->second);
|
---|
| 1534 | return this->fndecl_;
|
---|
| 1535 | }
|
---|
| 1536 | }
|
---|
| 1537 |
|
---|
| 1538 | - tree functype = type_to_tree(this->fntype_->get_backend(gogo));
|
---|
| 1539 | + std::string asm_name;
|
---|
| 1540 | + if (this->asm_name_.empty())
|
---|
| 1541 | + {
|
---|
| 1542 | + asm_name = (no->package() == NULL
|
---|
| 1543 | + ? gogo->pkgpath_symbol()
|
---|
| 1544 | + : no->package()->pkgpath_symbol());
|
---|
| 1545 | + asm_name.append(1, '.');
|
---|
| 1546 | + asm_name.append(Gogo::unpack_hidden_name(no->name()));
|
---|
| 1547 | + if (this->fntype_->is_method())
|
---|
| 1548 | + {
|
---|
| 1549 | + asm_name.append(1, '.');
|
---|
| 1550 | + Type* rtype = this->fntype_->receiver()->type();
|
---|
| 1551 | + asm_name.append(rtype->mangled_name(gogo));
|
---|
| 1552 | + }
|
---|
| 1553 | + }
|
---|
| 1554 | +
|
---|
| 1555 | + Btype* functype = this->fntype_->get_backend_fntype(gogo);
|
---|
| 1556 | + this->fndecl_ =
|
---|
| 1557 | + gogo->backend()->function(functype, no->get_id(gogo), asm_name,
|
---|
| 1558 | + true, true, true, false, false,
|
---|
| 1559 | + this->location());
|
---|
| 1560 | + }
|
---|
| 1561 |
|
---|
| 1562 | - if (functype != error_mark_node)
|
---|
| 1563 | - {
|
---|
| 1564 | - // The type of a function comes back as a pointer to a
|
---|
| 1565 | - // struct whose first field is the function, but we want the
|
---|
| 1566 | - // real function type for a function declaration.
|
---|
| 1567 | - go_assert(POINTER_TYPE_P(functype)
|
---|
| 1568 | - && TREE_CODE(TREE_TYPE(functype)) == RECORD_TYPE);
|
---|
| 1569 | - functype = TREE_TYPE(TYPE_FIELDS(TREE_TYPE(functype)));
|
---|
| 1570 | - go_assert(FUNCTION_POINTER_TYPE_P(functype));
|
---|
| 1571 | - functype = TREE_TYPE(functype);
|
---|
| 1572 | - }
|
---|
| 1573 | + return this->fndecl_;
|
---|
| 1574 | +}
|
---|
| 1575 |
|
---|
| 1576 | - tree decl;
|
---|
| 1577 | - if (functype == error_mark_node)
|
---|
| 1578 | - decl = error_mark_node;
|
---|
| 1579 | - else
|
---|
| 1580 | - {
|
---|
| 1581 | - decl = build_decl(this->location().gcc_location(), FUNCTION_DECL, id,
|
---|
| 1582 | - functype);
|
---|
| 1583 | - TREE_PUBLIC(decl) = 1;
|
---|
| 1584 | - DECL_EXTERNAL(decl) = 1;
|
---|
| 1585 | +// Return the function's decl after it has been built.
|
---|
| 1586 |
|
---|
| 1587 | - if (this->asm_name_.empty())
|
---|
| 1588 | - {
|
---|
| 1589 | - std::string asm_name = (no->package() == NULL
|
---|
| 1590 | - ? gogo->pkgpath_symbol()
|
---|
| 1591 | - : no->package()->pkgpath_symbol());
|
---|
| 1592 | - asm_name.append(1, '.');
|
---|
| 1593 | - asm_name.append(Gogo::unpack_hidden_name(no->name()));
|
---|
| 1594 | - if (this->fntype_->is_method())
|
---|
| 1595 | - {
|
---|
| 1596 | - asm_name.append(1, '.');
|
---|
| 1597 | - Type* rtype = this->fntype_->receiver()->type();
|
---|
| 1598 | - asm_name.append(rtype->mangled_name(gogo));
|
---|
| 1599 | - }
|
---|
| 1600 | - SET_DECL_ASSEMBLER_NAME(decl,
|
---|
| 1601 | - get_identifier_from_string(asm_name));
|
---|
| 1602 | - }
|
---|
| 1603 | - }
|
---|
| 1604 | - this->fndecl_ = decl;
|
---|
| 1605 | - go_preserve_from_gc(decl);
|
---|
| 1606 | - }
|
---|
| 1607 | - return this->fndecl_;
|
---|
| 1608 | +tree
|
---|
| 1609 | +Function::get_decl() const
|
---|
| 1610 | +{
|
---|
| 1611 | + go_assert(this->fndecl_ != NULL);
|
---|
[88af5df] | 1612 | + return function_to_tree(this->fndecl_);
|
---|
| 1613 | }
|
---|
| 1614 |
|
---|
| 1615 | // We always pass the receiver to a method as a pointer. If the
|
---|
| 1616 | @@ -1558,7 +1363,7 @@
|
---|
| 1617 | void
|
---|
| 1618 | Function::build_tree(Gogo* gogo, Named_object* named_function)
|
---|
| 1619 | {
|
---|
| 1620 | - tree fndecl = this->fndecl_;
|
---|
| 1621 | + tree fndecl = this->get_decl();
|
---|
| 1622 | go_assert(fndecl != NULL_TREE);
|
---|
| 1623 |
|
---|
| 1624 | tree params = NULL_TREE;
|
---|
| 1625 | @@ -1796,7 +1601,7 @@
|
---|
| 1626 | set = NULL_TREE;
|
---|
| 1627 | else
|
---|
| 1628 | set = fold_build2_loc(end_loc.gcc_location(), MODIFY_EXPR, void_type_node,
|
---|
| 1629 | - DECL_RESULT(this->fndecl_), retval);
|
---|
| 1630 | + DECL_RESULT(this->get_decl()), retval);
|
---|
| 1631 | tree ret_stmt = fold_build1_loc(end_loc.gcc_location(), RETURN_EXPR,
|
---|
| 1632 | void_type_node, set);
|
---|
| 1633 | append_to_statement_list(ret_stmt, &stmt_list);
|
---|
| 1634 | @@ -1851,7 +1656,7 @@
|
---|
| 1635 | retval = this->return_value(gogo, named_function, end_loc,
|
---|
| 1636 | &stmt_list);
|
---|
| 1637 | set = fold_build2_loc(end_loc.gcc_location(), MODIFY_EXPR, void_type_node,
|
---|
| 1638 | - DECL_RESULT(this->fndecl_), retval);
|
---|
| 1639 | + DECL_RESULT(this->get_decl()), retval);
|
---|
| 1640 | ret_stmt = fold_build1_loc(end_loc.gcc_location(), RETURN_EXPR,
|
---|
| 1641 | void_type_node, set);
|
---|
| 1642 |
|
---|
| 1643 | @@ -1869,7 +1674,7 @@
|
---|
| 1644 | *fini = stmt_list;
|
---|
| 1645 | }
|
---|
| 1646 |
|
---|
| 1647 | -// Return the value to assign to DECL_RESULT(this->fndecl_). This may
|
---|
| 1648 | +// Return the value to assign to DECL_RESULT(this->get_decl()). This may
|
---|
| 1649 | // also add statements to STMT_LIST, which need to be executed before
|
---|
| 1650 | // the assignment. This is used for a return statement with no
|
---|
| 1651 | // explicit values.
|
---|
| 1652 | @@ -1902,7 +1707,7 @@
|
---|
| 1653 | }
|
---|
| 1654 | else
|
---|
| 1655 | {
|
---|
| 1656 | - tree rettype = TREE_TYPE(DECL_RESULT(this->fndecl_));
|
---|
| 1657 | + tree rettype = TREE_TYPE(DECL_RESULT(this->get_decl()));
|
---|
| 1658 | retval = create_tmp_var(rettype, "RESULT");
|
---|
| 1659 | tree field = TYPE_FIELDS(rettype);
|
---|
| 1660 | int index = 0;
|
---|
| 1661 | @@ -2323,18 +2128,14 @@
|
---|
| 1662 | go_assert(m != NULL);
|
---|
| 1663 |
|
---|
| 1664 | Named_object* no = m->named_object();
|
---|
| 1665 | -
|
---|
| 1666 | - tree fnid = no->get_id(this);
|
---|
| 1667 | -
|
---|
| 1668 | - tree fndecl;
|
---|
| 1669 | + Bfunction* bf;
|
---|
| 1670 | if (no->is_function())
|
---|
| 1671 | - fndecl = no->func_value()->get_or_make_decl(this, no, fnid);
|
---|
| 1672 | + bf = no->func_value()->get_or_make_decl(this, no);
|
---|
| 1673 | else if (no->is_function_declaration())
|
---|
| 1674 | - fndecl = no->func_declaration_value()->get_or_make_decl(this, no,
|
---|
| 1675 | - fnid);
|
---|
| 1676 | + bf = no->func_declaration_value()->get_or_make_decl(this, no);
|
---|
| 1677 | else
|
---|
| 1678 | go_unreachable();
|
---|
| 1679 | - fndecl = build_fold_addr_expr(fndecl);
|
---|
| 1680 | + tree fndecl = build_fold_addr_expr(function_to_tree(bf));
|
---|
| 1681 |
|
---|
| 1682 | elt = pointers->quick_push(empty);
|
---|
| 1683 | elt->index = size_int(i);
|
---|
| 1684 | @@ -2353,10 +2154,11 @@
|
---|
| 1685 | TREE_CONSTANT(decl) = 1;
|
---|
| 1686 | DECL_INITIAL(decl) = constructor;
|
---|
| 1687 |
|
---|
| 1688 | - // If the interface type has hidden methods, then this is the only
|
---|
| 1689 | - // definition of the table. Otherwise it is a comdat table which
|
---|
| 1690 | - // may be defined in multiple packages.
|
---|
| 1691 | - if (has_hidden_methods)
|
---|
| 1692 | + // If the interface type has hidden methods, and the table is for a
|
---|
| 1693 | + // named type, then this is the only definition of the table.
|
---|
| 1694 | + // Otherwise it is a comdat table which may be defined in multiple
|
---|
| 1695 | + // packages.
|
---|
| 1696 | + if (has_hidden_methods && type->named_type() != NULL)
|
---|
| 1697 | TREE_PUBLIC(decl) = 1;
|
---|
| 1698 | else
|
---|
| 1699 | {
|
---|
| 1700 | diff -Naur gcc-4.8.2.orig/gcc/go/gofrontend/gogo.cc gcc-4.8.2/gcc/go/gofrontend/gogo.cc
|
---|
| 1701 | --- gcc-4.8.2.orig/gcc/go/gofrontend/gogo.cc 2013-09-28 20:23:56.000000000 +0000
|
---|
| 1702 | +++ gcc-4.8.2/gcc/go/gofrontend/gogo.cc 2013-11-01 16:12:33.967792637 +0000
|
---|
| 1703 | @@ -3320,7 +3320,8 @@
|
---|
| 1704 | closure_var_(NULL), block_(block), location_(location), labels_(),
|
---|
| 1705 | local_type_count_(0), descriptor_(NULL), fndecl_(NULL), defer_stack_(NULL),
|
---|
| 1706 | is_sink_(false), results_are_named_(false), nointerface_(false),
|
---|
| 1707 | - calls_recover_(false), is_recover_thunk_(false), has_recover_thunk_(false),
|
---|
| 1708 | + is_unnamed_type_stub_method_(false), calls_recover_(false),
|
---|
| 1709 | + is_recover_thunk_(false), has_recover_thunk_(false),
|
---|
| 1710 | in_unique_section_(false)
|
---|
| 1711 | {
|
---|
| 1712 | }
|
---|
| 1713 | @@ -3819,6 +3820,81 @@
|
---|
| 1714 | *presults = results;
|
---|
| 1715 | }
|
---|
| 1716 |
|
---|
| 1717 | +// Get the backend representation.
|
---|
| 1718 | +
|
---|
| 1719 | +Bfunction*
|
---|
| 1720 | +Function::get_or_make_decl(Gogo* gogo, Named_object* no)
|
---|
| 1721 | +{
|
---|
| 1722 | + if (this->fndecl_ == NULL)
|
---|
| 1723 | + {
|
---|
| 1724 | + std::string asm_name;
|
---|
| 1725 | + bool is_visible = false;
|
---|
| 1726 | + if (no->package() != NULL)
|
---|
| 1727 | + ;
|
---|
| 1728 | + else if (this->enclosing_ != NULL || Gogo::is_thunk(no))
|
---|
| 1729 | + ;
|
---|
| 1730 | + else if (Gogo::unpack_hidden_name(no->name()) == "init"
|
---|
| 1731 | + && !this->type_->is_method())
|
---|
| 1732 | + ;
|
---|
| 1733 | + else if (Gogo::unpack_hidden_name(no->name()) == "main"
|
---|
| 1734 | + && gogo->is_main_package())
|
---|
| 1735 | + is_visible = true;
|
---|
| 1736 | + // Methods have to be public even if they are hidden because
|
---|
| 1737 | + // they can be pulled into type descriptors when using
|
---|
| 1738 | + // anonymous fields.
|
---|
| 1739 | + else if (!Gogo::is_hidden_name(no->name())
|
---|
| 1740 | + || this->type_->is_method())
|
---|
| 1741 | + {
|
---|
| 1742 | + if (!this->is_unnamed_type_stub_method_)
|
---|
| 1743 | + is_visible = true;
|
---|
| 1744 | + std::string pkgpath = gogo->pkgpath_symbol();
|
---|
| 1745 | + if (this->type_->is_method()
|
---|
| 1746 | + && Gogo::is_hidden_name(no->name())
|
---|
| 1747 | + && Gogo::hidden_name_pkgpath(no->name()) != gogo->pkgpath())
|
---|
| 1748 | + {
|
---|
| 1749 | + // This is a method we created for an unexported
|
---|
| 1750 | + // method of an imported embedded type. We need to
|
---|
| 1751 | + // use the pkgpath of the imported package to avoid
|
---|
| 1752 | + // a possible name collision. See bug478 for a test
|
---|
| 1753 | + // case.
|
---|
| 1754 | + pkgpath = Gogo::hidden_name_pkgpath(no->name());
|
---|
| 1755 | + pkgpath = Gogo::pkgpath_for_symbol(pkgpath);
|
---|
| 1756 | + }
|
---|
| 1757 | +
|
---|
| 1758 | + asm_name = pkgpath;
|
---|
| 1759 | + asm_name.append(1, '.');
|
---|
| 1760 | + asm_name.append(Gogo::unpack_hidden_name(no->name()));
|
---|
| 1761 | + if (this->type_->is_method())
|
---|
| 1762 | + {
|
---|
| 1763 | + asm_name.append(1, '.');
|
---|
| 1764 | + Type* rtype = this->type_->receiver()->type();
|
---|
| 1765 | + asm_name.append(rtype->mangled_name(gogo));
|
---|
| 1766 | + }
|
---|
| 1767 | + }
|
---|
| 1768 | +
|
---|
| 1769 | + // If a function calls the predeclared recover function, we
|
---|
| 1770 | + // can't inline it, because recover behaves differently in a
|
---|
| 1771 | + // function passed directly to defer. If this is a recover
|
---|
| 1772 | + // thunk that we built to test whether a function can be
|
---|
| 1773 | + // recovered, we can't inline it, because that will mess up
|
---|
| 1774 | + // our return address comparison.
|
---|
| 1775 | + bool is_inlinable = !(this->calls_recover_ || this->is_recover_thunk_);
|
---|
| 1776 | +
|
---|
| 1777 | + // If this is a thunk created to call a function which calls
|
---|
| 1778 | + // the predeclared recover function, we need to disable
|
---|
| 1779 | + // stack splitting for the thunk.
|
---|
| 1780 | + bool disable_split_stack = this->is_recover_thunk_;
|
---|
| 1781 | +
|
---|
| 1782 | + Btype* functype = this->type_->get_backend_fntype(gogo);
|
---|
| 1783 | + this->fndecl_ =
|
---|
| 1784 | + gogo->backend()->function(functype, no->get_id(gogo), asm_name,
|
---|
| 1785 | + is_visible, false, is_inlinable,
|
---|
| 1786 | + disable_split_stack,
|
---|
| 1787 | + this->in_unique_section_, this->location());
|
---|
| 1788 | + }
|
---|
| 1789 | + return this->fndecl_;
|
---|
| 1790 | +}
|
---|
| 1791 | +
|
---|
| 1792 | // Class Block.
|
---|
| 1793 |
|
---|
| 1794 | Block::Block(Block* enclosing, Location location)
|
---|
| 1795 | @@ -5110,6 +5186,75 @@
|
---|
| 1796 | go_unreachable();
|
---|
| 1797 | }
|
---|
| 1798 |
|
---|
| 1799 | +
|
---|
| 1800 | +// Return the external identifier for this object.
|
---|
| 1801 | +
|
---|
| 1802 | +std::string
|
---|
| 1803 | +Named_object::get_id(Gogo* gogo)
|
---|
| 1804 | +{
|
---|
| 1805 | + go_assert(!this->is_variable() && !this->is_result_variable());
|
---|
| 1806 | + std::string decl_name;
|
---|
| 1807 | + if (this->is_function_declaration()
|
---|
| 1808 | + && !this->func_declaration_value()->asm_name().empty())
|
---|
| 1809 | + decl_name = this->func_declaration_value()->asm_name();
|
---|
| 1810 | + else if (this->is_type()
|
---|
| 1811 | + && Linemap::is_predeclared_location(this->type_value()->location()))
|
---|
| 1812 | + {
|
---|
| 1813 | + // We don't need the package name for builtin types.
|
---|
| 1814 | + decl_name = Gogo::unpack_hidden_name(this->name_);
|
---|
| 1815 | + }
|
---|
| 1816 | + else
|
---|
| 1817 | + {
|
---|
| 1818 | + std::string package_name;
|
---|
| 1819 | + if (this->package_ == NULL)
|
---|
| 1820 | + package_name = gogo->package_name();
|
---|
| 1821 | + else
|
---|
| 1822 | + package_name = this->package_->package_name();
|
---|
| 1823 | +
|
---|
| 1824 | + // Note that this will be misleading if this is an unexported
|
---|
| 1825 | + // method generated for an embedded imported type. In that case
|
---|
| 1826 | + // the unexported method should have the package name of the
|
---|
| 1827 | + // package from which it is imported, but we are going to give
|
---|
| 1828 | + // it our package name. Fixing this would require knowing the
|
---|
| 1829 | + // package name, but we only know the package path. It might be
|
---|
| 1830 | + // better to use package paths here anyhow. This doesn't affect
|
---|
| 1831 | + // the assembler code, because we always set that name in
|
---|
| 1832 | + // Function::get_or_make_decl anyhow. FIXME.
|
---|
| 1833 | +
|
---|
| 1834 | + decl_name = package_name + '.' + Gogo::unpack_hidden_name(this->name_);
|
---|
| 1835 | +
|
---|
| 1836 | + Function_type* fntype;
|
---|
| 1837 | + if (this->is_function())
|
---|
| 1838 | + fntype = this->func_value()->type();
|
---|
| 1839 | + else if (this->is_function_declaration())
|
---|
| 1840 | + fntype = this->func_declaration_value()->type();
|
---|
| 1841 | + else
|
---|
| 1842 | + fntype = NULL;
|
---|
| 1843 | + if (fntype != NULL && fntype->is_method())
|
---|
| 1844 | + {
|
---|
| 1845 | + decl_name.push_back('.');
|
---|
| 1846 | + decl_name.append(fntype->receiver()->type()->mangled_name(gogo));
|
---|
| 1847 | + }
|
---|
| 1848 | + }
|
---|
| 1849 | + if (this->is_type())
|
---|
| 1850 | + {
|
---|
| 1851 | + unsigned int index;
|
---|
| 1852 | + const Named_object* in_function = this->type_value()->in_function(&index);
|
---|
| 1853 | + if (in_function != NULL)
|
---|
| 1854 | + {
|
---|
| 1855 | + decl_name += '$' + Gogo::unpack_hidden_name(in_function->name());
|
---|
| 1856 | + if (index > 0)
|
---|
| 1857 | + {
|
---|
| 1858 | + char buf[30];
|
---|
| 1859 | + snprintf(buf, sizeof buf, "%u", index);
|
---|
| 1860 | + decl_name += '$';
|
---|
| 1861 | + decl_name += buf;
|
---|
| 1862 | + }
|
---|
| 1863 | + }
|
---|
| 1864 | + }
|
---|
| 1865 | + return decl_name;
|
---|
| 1866 | +}
|
---|
| 1867 | +
|
---|
| 1868 | // Class Bindings.
|
---|
| 1869 |
|
---|
| 1870 | Bindings::Bindings(Bindings* enclosing)
|
---|
| 1871 | diff -Naur gcc-4.8.2.orig/gcc/go/gofrontend/gogo.h gcc-4.8.2/gcc/go/gofrontend/gogo.h
|
---|
| 1872 | --- gcc-4.8.2.orig/gcc/go/gofrontend/gogo.h 2013-09-28 20:23:56.000000000 +0000
|
---|
| 1873 | +++ gcc-4.8.2/gcc/go/gofrontend/gogo.h 2013-11-01 16:12:33.971793325 +0000
|
---|
| 1874 | @@ -48,6 +48,7 @@
|
---|
| 1875 | class Bblock;
|
---|
| 1876 | class Bvariable;
|
---|
| 1877 | class Blabel;
|
---|
| 1878 | +class Bfunction;
|
---|
| 1879 |
|
---|
| 1880 | // This file declares the basic classes used to hold the internal
|
---|
| 1881 | // representation of Go which is built by the parser.
|
---|
| 1882 | @@ -952,6 +953,15 @@
|
---|
| 1883 | this->nointerface_ = true;
|
---|
| 1884 | }
|
---|
| 1885 |
|
---|
| 1886 | + // Record that this function is a stub method created for an unnamed
|
---|
| 1887 | + // type.
|
---|
| 1888 | + void
|
---|
| 1889 | + set_is_unnamed_type_stub_method()
|
---|
| 1890 | + {
|
---|
| 1891 | + go_assert(this->is_method());
|
---|
| 1892 | + this->is_unnamed_type_stub_method_ = true;
|
---|
| 1893 | + }
|
---|
| 1894 | +
|
---|
| 1895 | // Add a new field to the closure variable.
|
---|
| 1896 | void
|
---|
| 1897 | add_closure_field(Named_object* var, Location loc)
|
---|
| 1898 | @@ -1089,17 +1099,13 @@
|
---|
| 1899 | this->descriptor_ = descriptor;
|
---|
| 1900 | }
|
---|
| 1901 |
|
---|
| 1902 | - // Return the function's decl given an identifier.
|
---|
| 1903 | - tree
|
---|
| 1904 | - get_or_make_decl(Gogo*, Named_object*, tree id);
|
---|
[2e59d11] | 1905 | + // Return the backend representation.
|
---|
[88af5df] | 1906 | + Bfunction*
|
---|
| 1907 | + get_or_make_decl(Gogo*, Named_object*);
|
---|
| 1908 |
|
---|
| 1909 | // Return the function's decl after it has been built.
|
---|
| 1910 | tree
|
---|
| 1911 | - get_decl() const
|
---|
| 1912 | - {
|
---|
| 1913 | - go_assert(this->fndecl_ != NULL);
|
---|
[2e59d11] | 1914 | - return this->fndecl_;
|
---|
[88af5df] | 1915 | - }
|
---|
| 1916 | + get_decl() const;
|
---|
| 1917 |
|
---|
| 1918 | // Set the function decl to hold a tree of the function code.
|
---|
| 1919 | void
|
---|
| 1920 | @@ -1170,7 +1176,7 @@
|
---|
| 1921 | // The function descriptor, if any.
|
---|
| 1922 | Expression* descriptor_;
|
---|
| 1923 | // The function decl.
|
---|
| 1924 | - tree fndecl_;
|
---|
| 1925 | + Bfunction* fndecl_;
|
---|
| 1926 | // The defer stack variable. A pointer to this variable is used to
|
---|
| 1927 | // distinguish the defer stack for one function from another. This
|
---|
| 1928 | // is NULL unless we actually need a defer stack.
|
---|
| 1929 | @@ -1181,6 +1187,9 @@
|
---|
| 1930 | bool results_are_named_ : 1;
|
---|
| 1931 | // True if this method should not be included in the type descriptor.
|
---|
| 1932 | bool nointerface_ : 1;
|
---|
| 1933 | + // True if this function is a stub method created for an unnamed
|
---|
| 1934 | + // type.
|
---|
| 1935 | + bool is_unnamed_type_stub_method_ : 1;
|
---|
| 1936 | // True if this function calls the predeclared recover function.
|
---|
| 1937 | bool calls_recover_ : 1;
|
---|
| 1938 | // True if this a thunk built for a function which calls recover.
|
---|
[2e59d11] | 1939 | @@ -1265,9 +1274,9 @@
|
---|
[88af5df] | 1940 | has_descriptor() const
|
---|
| 1941 | { return this->descriptor_ != NULL; }
|
---|
| 1942 |
|
---|
| 1943 | - // Return a decl for the function given an identifier.
|
---|
| 1944 | - tree
|
---|
| 1945 | - get_or_make_decl(Gogo*, Named_object*, tree id);
|
---|
[2e59d11] | 1946 | + // Return a backend representation.
|
---|
[88af5df] | 1947 | + Bfunction*
|
---|
| 1948 | + get_or_make_decl(Gogo*, Named_object*);
|
---|
| 1949 |
|
---|
| 1950 | // If there is a descriptor, build it into the backend
|
---|
| 1951 | // representation.
|
---|
| 1952 | @@ -1290,7 +1299,7 @@
|
---|
| 1953 | // The function descriptor, if any.
|
---|
| 1954 | Expression* descriptor_;
|
---|
| 1955 | // The function decl if needed.
|
---|
[2e59d11] | 1956 | - tree fndecl_;
|
---|
[88af5df] | 1957 | + Bfunction* fndecl_;
|
---|
| 1958 | };
|
---|
| 1959 |
|
---|
| 1960 | // A variable.
|
---|
[2e59d11] | 1961 | @@ -2181,8 +2190,8 @@
|
---|
[88af5df] | 1962 | Bvariable*
|
---|
| 1963 | get_backend_variable(Gogo*, Named_object* function);
|
---|
| 1964 |
|
---|
| 1965 | - // Return a tree for the external identifier for this object.
|
---|
| 1966 | - tree
|
---|
| 1967 | + // Return the external identifier for this object.
|
---|
| 1968 | + std::string
|
---|
[2e59d11] | 1969 | get_id(Gogo*);
|
---|
[88af5df] | 1970 |
|
---|
| 1971 | // Return a tree representing this object.
|
---|
[2e59d11] | 1972 | diff -Naur gcc-4.8.2.orig/gcc/go/gofrontend/import.h gcc-4.8.2/gcc/go/gofrontend/import.h
|
---|
| 1973 | --- gcc-4.8.2.orig/gcc/go/gofrontend/import.h 2012-10-31 00:38:49.000000000 +0000
|
---|
| 1974 | +++ gcc-4.8.2/gcc/go/gofrontend/import.h 2013-11-01 16:12:33.975794014 +0000
|
---|
| 1975 | @@ -149,6 +149,11 @@
|
---|
| 1976 | location() const
|
---|
| 1977 | { return this->location_; }
|
---|
| 1978 |
|
---|
| 1979 | + // Return the package we are importing.
|
---|
| 1980 | + Package*
|
---|
| 1981 | + package() const
|
---|
| 1982 | + { return this->package_; }
|
---|
| 1983 | +
|
---|
| 1984 | // Return the next character.
|
---|
[88af5df] | 1985 | int
|
---|
| 1986 | peek_char()
|
---|
[2e59d11] | 1987 | diff -Naur gcc-4.8.2.orig/gcc/go/gofrontend/lex.cc gcc-4.8.2/gcc/go/gofrontend/lex.cc
|
---|
| 1988 | --- gcc-4.8.2.orig/gcc/go/gofrontend/lex.cc 2012-12-03 06:57:04.000000000 +0000
|
---|
| 1989 | +++ gcc-4.8.2/gcc/go/gofrontend/lex.cc 2013-11-01 16:12:33.979794702 +0000
|
---|
| 1990 | @@ -873,7 +873,28 @@
|
---|
| 1991 | && (cc < 'a' || cc > 'z')
|
---|
| 1992 | && cc != '_'
|
---|
| 1993 | && (cc < '0' || cc > '9'))
|
---|
| 1994 | - break;
|
---|
| 1995 | + {
|
---|
| 1996 | + // Check for an invalid character here, as we get better
|
---|
| 1997 | + // error behaviour if we swallow them as part of the
|
---|
| 1998 | + // identifier we are building.
|
---|
| 1999 | + if ((cc >= ' ' && cc < 0x7f)
|
---|
| 2000 | + || cc == '\t'
|
---|
| 2001 | + || cc == '\r'
|
---|
| 2002 | + || cc == '\n')
|
---|
| 2003 | + break;
|
---|
| 2004 | +
|
---|
| 2005 | + this->lineoff_ = p - this->linebuf_;
|
---|
| 2006 | + error_at(this->location(),
|
---|
| 2007 | + "invalid character 0x%x in identifier",
|
---|
| 2008 | + cc);
|
---|
| 2009 | + if (!has_non_ascii_char)
|
---|
| 2010 | + {
|
---|
| 2011 | + buf.assign(pstart, p - pstart);
|
---|
| 2012 | + has_non_ascii_char = true;
|
---|
| 2013 | + }
|
---|
| 2014 | + if (!Lex::is_invalid_identifier(buf))
|
---|
| 2015 | + buf.append("$INVALID$");
|
---|
| 2016 | + }
|
---|
| 2017 | ++p;
|
---|
[88af5df] | 2018 | if (is_first)
|
---|
| 2019 | {
|
---|
[2e59d11] | 2020 | diff -Naur gcc-4.8.2.orig/gcc/go/gofrontend/parse.cc gcc-4.8.2/gcc/go/gofrontend/parse.cc
|
---|
| 2021 | --- gcc-4.8.2.orig/gcc/go/gofrontend/parse.cc 2013-10-08 23:54:31.000000000 +0000
|
---|
| 2022 | +++ gcc-4.8.2/gcc/go/gofrontend/parse.cc 2013-11-01 16:12:33.979794702 +0000
|
---|
| 2023 | @@ -744,6 +744,8 @@
|
---|
| 2024 | return NULL;
|
---|
| 2025 |
|
---|
| 2026 | Parse::Names names;
|
---|
| 2027 | + if (receiver != NULL)
|
---|
| 2028 | + names[receiver->name()] = receiver;
|
---|
| 2029 | if (params != NULL)
|
---|
[88af5df] | 2030 | this->check_signature_names(params, &names);
|
---|
| 2031 | if (results != NULL)
|
---|
[2e59d11] | 2032 | diff -Naur gcc-4.8.2.orig/gcc/go/gofrontend/runtime.cc gcc-4.8.2/gcc/go/gofrontend/runtime.cc
|
---|
| 2033 | --- gcc-4.8.2.orig/gcc/go/gofrontend/runtime.cc 2012-12-21 15:59:27.000000000 +0000
|
---|
| 2034 | +++ gcc-4.8.2/gcc/go/gofrontend/runtime.cc 2013-11-01 16:12:34.055807784 +0000
|
---|
| 2035 | @@ -42,6 +42,8 @@
|
---|
| 2036 | RFT_RUNE,
|
---|
| 2037 | // Go type float64, C type double.
|
---|
| 2038 | RFT_FLOAT64,
|
---|
| 2039 | + // Go type complex64, C type __complex float.
|
---|
| 2040 | + RFT_COMPLEX64,
|
---|
| 2041 | // Go type complex128, C type __complex double.
|
---|
| 2042 | RFT_COMPLEX128,
|
---|
| 2043 | // Go type string, C type struct __go_string.
|
---|
| 2044 | @@ -126,6 +128,10 @@
|
---|
| 2045 | t = Type::lookup_float_type("float64");
|
---|
| 2046 | break;
|
---|
| 2047 |
|
---|
| 2048 | + case RFT_COMPLEX64:
|
---|
| 2049 | + t = Type::lookup_complex_type("complex64");
|
---|
| 2050 | + break;
|
---|
| 2051 | +
|
---|
| 2052 | case RFT_COMPLEX128:
|
---|
| 2053 | t = Type::lookup_complex_type("complex128");
|
---|
| 2054 | break;
|
---|
| 2055 | @@ -216,6 +222,7 @@
|
---|
| 2056 | case RFT_UINTPTR:
|
---|
| 2057 | case RFT_RUNE:
|
---|
| 2058 | case RFT_FLOAT64:
|
---|
| 2059 | + case RFT_COMPLEX64:
|
---|
| 2060 | case RFT_COMPLEX128:
|
---|
[88af5df] | 2061 | case RFT_STRING:
|
---|
| 2062 | case RFT_POINTER:
|
---|
[2e59d11] | 2063 | diff -Naur gcc-4.8.2.orig/gcc/go/gofrontend/runtime.def gcc-4.8.2/gcc/go/gofrontend/runtime.def
|
---|
| 2064 | --- gcc-4.8.2.orig/gcc/go/gofrontend/runtime.def 2013-06-18 23:50:42.000000000 +0000
|
---|
| 2065 | +++ gcc-4.8.2/gcc/go/gofrontend/runtime.def 2013-11-01 16:12:34.055807784 +0000
|
---|
| 2066 | @@ -68,6 +68,12 @@
|
---|
| 2067 | P1(STRING), R1(SLICE))
|
---|
| 2068 |
|
---|
| 2069 |
|
---|
| 2070 | +// Complex division.
|
---|
| 2071 | +DEF_GO_RUNTIME(COMPLEX64_DIV, "__go_complex64_div",
|
---|
| 2072 | + P2(COMPLEX64, COMPLEX64), R1(COMPLEX64))
|
---|
| 2073 | +DEF_GO_RUNTIME(COMPLEX128_DIV, "__go_complex128_div",
|
---|
| 2074 | + P2(COMPLEX128, COMPLEX128), R1(COMPLEX128))
|
---|
| 2075 | +
|
---|
| 2076 | // Make a slice.
|
---|
[88af5df] | 2077 | DEF_GO_RUNTIME(MAKESLICE1, "__go_make_slice1", P2(TYPE, UINTPTR), R1(SLICE))
|
---|
| 2078 | DEF_GO_RUNTIME(MAKESLICE2, "__go_make_slice2", P3(TYPE, UINTPTR, UINTPTR),
|
---|
[2e59d11] | 2079 | diff -Naur gcc-4.8.2.orig/gcc/go/gofrontend/types.cc gcc-4.8.2/gcc/go/gofrontend/types.cc
|
---|
| 2080 | --- gcc-4.8.2.orig/gcc/go/gofrontend/types.cc 2013-10-02 19:22:30.000000000 +0000
|
---|
| 2081 | +++ gcc-4.8.2/gcc/go/gofrontend/types.cc 2013-11-01 16:12:34.063809161 +0000
|
---|
| 2082 | @@ -3383,6 +3383,68 @@
|
---|
| 2083 | // Get the backend representation for a function type.
|
---|
| 2084 |
|
---|
| 2085 | Btype*
|
---|
| 2086 | +Function_type::get_backend_fntype(Gogo* gogo)
|
---|
| 2087 | +{
|
---|
| 2088 | + if (this->fnbtype_ == NULL)
|
---|
| 2089 | + {
|
---|
| 2090 | + Backend::Btyped_identifier breceiver;
|
---|
| 2091 | + if (this->receiver_ != NULL)
|
---|
| 2092 | + {
|
---|
| 2093 | + breceiver.name = Gogo::unpack_hidden_name(this->receiver_->name());
|
---|
| 2094 | +
|
---|
| 2095 | + // We always pass the address of the receiver parameter, in
|
---|
| 2096 | + // order to make interface calls work with unknown types.
|
---|
| 2097 | + Type* rtype = this->receiver_->type();
|
---|
| 2098 | + if (rtype->points_to() == NULL)
|
---|
| 2099 | + rtype = Type::make_pointer_type(rtype);
|
---|
| 2100 | + breceiver.btype = rtype->get_backend(gogo);
|
---|
| 2101 | + breceiver.location = this->receiver_->location();
|
---|
| 2102 | + }
|
---|
| 2103 | +
|
---|
| 2104 | + std::vector<Backend::Btyped_identifier> bparameters;
|
---|
| 2105 | + if (this->parameters_ != NULL)
|
---|
| 2106 | + {
|
---|
| 2107 | + bparameters.resize(this->parameters_->size());
|
---|
| 2108 | + size_t i = 0;
|
---|
| 2109 | + for (Typed_identifier_list::const_iterator p =
|
---|
| 2110 | + this->parameters_->begin(); p != this->parameters_->end();
|
---|
| 2111 | + ++p, ++i)
|
---|
| 2112 | + {
|
---|
| 2113 | + bparameters[i].name = Gogo::unpack_hidden_name(p->name());
|
---|
| 2114 | + bparameters[i].btype = p->type()->get_backend(gogo);
|
---|
| 2115 | + bparameters[i].location = p->location();
|
---|
| 2116 | + }
|
---|
| 2117 | + go_assert(i == bparameters.size());
|
---|
| 2118 | + }
|
---|
| 2119 | +
|
---|
| 2120 | + std::vector<Backend::Btyped_identifier> bresults;
|
---|
| 2121 | + if (this->results_ != NULL)
|
---|
| 2122 | + {
|
---|
| 2123 | + bresults.resize(this->results_->size());
|
---|
| 2124 | + size_t i = 0;
|
---|
| 2125 | + for (Typed_identifier_list::const_iterator p =
|
---|
| 2126 | + this->results_->begin(); p != this->results_->end();
|
---|
| 2127 | + ++p, ++i)
|
---|
| 2128 | + {
|
---|
| 2129 | + bresults[i].name = Gogo::unpack_hidden_name(p->name());
|
---|
| 2130 | + bresults[i].btype = p->type()->get_backend(gogo);
|
---|
| 2131 | + bresults[i].location = p->location();
|
---|
| 2132 | + }
|
---|
| 2133 | + go_assert(i == bresults.size());
|
---|
| 2134 | + }
|
---|
| 2135 | +
|
---|
| 2136 | + this->fnbtype_ = gogo->backend()->function_type(breceiver, bparameters,
|
---|
| 2137 | + bresults,
|
---|
| 2138 | + this->location());
|
---|
| 2139 | +
|
---|
| 2140 | + }
|
---|
| 2141 | +
|
---|
| 2142 | + return this->fnbtype_;
|
---|
| 2143 | +}
|
---|
| 2144 | +
|
---|
| 2145 | +// Get the backend representation for a Go function type.
|
---|
| 2146 | +
|
---|
| 2147 | +Btype*
|
---|
| 2148 | Function_type::do_get_backend(Gogo* gogo)
|
---|
| 2149 | {
|
---|
| 2150 | // When we do anything with a function value other than call it, it
|
---|
| 2151 | @@ -3395,57 +3457,9 @@
|
---|
| 2152 | gogo->backend()->placeholder_struct_type("__go_descriptor", loc);
|
---|
| 2153 | Btype* ptr_struct_type = gogo->backend()->pointer_type(struct_type);
|
---|
| 2154 |
|
---|
| 2155 | - Backend::Btyped_identifier breceiver;
|
---|
| 2156 | - if (this->receiver_ != NULL)
|
---|
| 2157 | - {
|
---|
| 2158 | - breceiver.name = Gogo::unpack_hidden_name(this->receiver_->name());
|
---|
| 2159 | -
|
---|
| 2160 | - // We always pass the address of the receiver parameter, in
|
---|
| 2161 | - // order to make interface calls work with unknown types.
|
---|
| 2162 | - Type* rtype = this->receiver_->type();
|
---|
| 2163 | - if (rtype->points_to() == NULL)
|
---|
| 2164 | - rtype = Type::make_pointer_type(rtype);
|
---|
| 2165 | - breceiver.btype = rtype->get_backend(gogo);
|
---|
| 2166 | - breceiver.location = this->receiver_->location();
|
---|
| 2167 | - }
|
---|
| 2168 | -
|
---|
| 2169 | - std::vector<Backend::Btyped_identifier> bparameters;
|
---|
| 2170 | - if (this->parameters_ != NULL)
|
---|
| 2171 | - {
|
---|
| 2172 | - bparameters.resize(this->parameters_->size());
|
---|
| 2173 | - size_t i = 0;
|
---|
| 2174 | - for (Typed_identifier_list::const_iterator p = this->parameters_->begin();
|
---|
| 2175 | - p != this->parameters_->end();
|
---|
| 2176 | - ++p, ++i)
|
---|
| 2177 | - {
|
---|
| 2178 | - bparameters[i].name = Gogo::unpack_hidden_name(p->name());
|
---|
| 2179 | - bparameters[i].btype = p->type()->get_backend(gogo);
|
---|
| 2180 | - bparameters[i].location = p->location();
|
---|
| 2181 | - }
|
---|
| 2182 | - go_assert(i == bparameters.size());
|
---|
| 2183 | - }
|
---|
| 2184 | -
|
---|
| 2185 | - std::vector<Backend::Btyped_identifier> bresults;
|
---|
| 2186 | - if (this->results_ != NULL)
|
---|
| 2187 | - {
|
---|
| 2188 | - bresults.resize(this->results_->size());
|
---|
| 2189 | - size_t i = 0;
|
---|
| 2190 | - for (Typed_identifier_list::const_iterator p = this->results_->begin();
|
---|
| 2191 | - p != this->results_->end();
|
---|
| 2192 | - ++p, ++i)
|
---|
| 2193 | - {
|
---|
| 2194 | - bresults[i].name = Gogo::unpack_hidden_name(p->name());
|
---|
| 2195 | - bresults[i].btype = p->type()->get_backend(gogo);
|
---|
| 2196 | - bresults[i].location = p->location();
|
---|
| 2197 | - }
|
---|
| 2198 | - go_assert(i == bresults.size());
|
---|
| 2199 | - }
|
---|
| 2200 | -
|
---|
| 2201 | - Btype* fntype = gogo->backend()->function_type(breceiver, bparameters,
|
---|
| 2202 | - bresults, loc);
|
---|
| 2203 | std::vector<Backend::Btyped_identifier> fields(1);
|
---|
| 2204 | fields[0].name = "code";
|
---|
| 2205 | - fields[0].btype = fntype;
|
---|
| 2206 | + fields[0].btype = this->get_backend_fntype(gogo);
|
---|
| 2207 | fields[0].location = loc;
|
---|
| 2208 | if (!gogo->backend()->set_placeholder_struct_type(struct_type, fields))
|
---|
| 2209 | return gogo->backend()->error_type();
|
---|
| 2210 | @@ -4195,7 +4209,8 @@
|
---|
| 2211 |
|
---|
| 2212 | // This is a horrible hack caused by the fact that we don't pack
|
---|
| 2213 | // the names of builtin types. FIXME.
|
---|
| 2214 | - if (nt != NULL
|
---|
| 2215 | + if (!this->is_imported_
|
---|
| 2216 | + && nt != NULL
|
---|
| 2217 | && nt->is_builtin()
|
---|
| 2218 | && nt->name() == Gogo::unpack_hidden_name(name))
|
---|
| 2219 | return true;
|
---|
| 2220 | @@ -4204,6 +4219,36 @@
|
---|
| 2221 | }
|
---|
| 2222 | }
|
---|
| 2223 |
|
---|
| 2224 | +// Return whether this field is an unexported field named NAME.
|
---|
| 2225 | +
|
---|
| 2226 | +bool
|
---|
| 2227 | +Struct_field::is_unexported_field_name(Gogo* gogo,
|
---|
| 2228 | + const std::string& name) const
|
---|
| 2229 | +{
|
---|
| 2230 | + const std::string& field_name(this->field_name());
|
---|
| 2231 | + if (Gogo::is_hidden_name(field_name)
|
---|
| 2232 | + && name == Gogo::unpack_hidden_name(field_name)
|
---|
| 2233 | + && gogo->pack_hidden_name(name, false) != field_name)
|
---|
| 2234 | + return true;
|
---|
| 2235 | +
|
---|
| 2236 | + // Check for the name of a builtin type. This is like the test in
|
---|
| 2237 | + // is_field_name, only there we return false if this->is_imported_,
|
---|
| 2238 | + // and here we return true.
|
---|
| 2239 | + if (this->is_imported_ && this->is_anonymous())
|
---|
| 2240 | + {
|
---|
| 2241 | + Type* t = this->typed_identifier_.type();
|
---|
| 2242 | + if (t->points_to() != NULL)
|
---|
| 2243 | + t = t->points_to();
|
---|
| 2244 | + Named_type* nt = t->named_type();
|
---|
| 2245 | + if (nt != NULL
|
---|
| 2246 | + && nt->is_builtin()
|
---|
| 2247 | + && nt->name() == Gogo::unpack_hidden_name(name))
|
---|
| 2248 | + return true;
|
---|
| 2249 | + }
|
---|
| 2250 | +
|
---|
| 2251 | + return false;
|
---|
| 2252 | +}
|
---|
| 2253 | +
|
---|
| 2254 | // Return whether this field is an embedded built-in type.
|
---|
| 2255 |
|
---|
| 2256 | bool
|
---|
| 2257 | @@ -4264,12 +4309,7 @@
|
---|
| 2258 | ++p)
|
---|
| 2259 | {
|
---|
| 2260 | Type* t = p->type();
|
---|
| 2261 | - if (t->is_undefined())
|
---|
| 2262 | - {
|
---|
| 2263 | - error_at(p->location(), "struct field type is incomplete");
|
---|
| 2264 | - p->set_type(Type::make_error_type());
|
---|
| 2265 | - }
|
---|
| 2266 | - else if (p->is_anonymous())
|
---|
| 2267 | + if (p->is_anonymous())
|
---|
| 2268 | {
|
---|
| 2269 | if (t->named_type() != NULL && t->points_to() != NULL)
|
---|
| 2270 | {
|
---|
| 2271 | @@ -4641,13 +4681,8 @@
|
---|
| 2272 | for (Struct_field_list::const_iterator pf = fields->begin();
|
---|
| 2273 | pf != fields->end();
|
---|
| 2274 | ++pf)
|
---|
| 2275 | - {
|
---|
| 2276 | - const std::string& field_name(pf->field_name());
|
---|
| 2277 | - if (Gogo::is_hidden_name(field_name)
|
---|
| 2278 | - && name == Gogo::unpack_hidden_name(field_name)
|
---|
| 2279 | - && gogo->pack_hidden_name(name, false) != field_name)
|
---|
| 2280 | - return true;
|
---|
| 2281 | - }
|
---|
| 2282 | + if (pf->is_unexported_field_name(gogo, name))
|
---|
| 2283 | + return true;
|
---|
| 2284 | }
|
---|
| 2285 | return false;
|
---|
| 2286 | }
|
---|
| 2287 | @@ -5250,6 +5285,7 @@
|
---|
| 2288 | Type* ftype = imp->read_type();
|
---|
| 2289 |
|
---|
| 2290 | Struct_field sf(Typed_identifier(name, ftype, imp->location()));
|
---|
| 2291 | + sf.set_is_imported();
|
---|
| 2292 |
|
---|
| 2293 | if (imp->peek_char() == ' ')
|
---|
| 2294 | {
|
---|
| 2295 | @@ -9022,6 +9058,8 @@
|
---|
| 2296 | fntype->is_varargs(), location);
|
---|
| 2297 | gogo->finish_function(fntype->location());
|
---|
| 2298 |
|
---|
| 2299 | + if (type->named_type() == NULL && stub->is_function())
|
---|
| 2300 | + stub->func_value()->set_is_unnamed_type_stub_method();
|
---|
| 2301 | if (m->nointerface() && stub->is_function())
|
---|
| 2302 | stub->func_value()->set_nointerface();
|
---|
| 2303 | }
|
---|
| 2304 | @@ -9289,7 +9327,9 @@
|
---|
| 2305 | else
|
---|
| 2306 | {
|
---|
| 2307 | bool is_unexported;
|
---|
| 2308 | - if (!Gogo::is_hidden_name(name))
|
---|
| 2309 | + // The test for 'a' and 'z' is to handle builtin names,
|
---|
| 2310 | + // which are not hidden.
|
---|
| 2311 | + if (!Gogo::is_hidden_name(name) && (name[0] < 'a' || name[0] > 'z'))
|
---|
| 2312 | is_unexported = false;
|
---|
[88af5df] | 2313 | else
|
---|
| 2314 | {
|
---|
[2e59d11] | 2315 | diff -Naur gcc-4.8.2.orig/gcc/go/gofrontend/types.h gcc-4.8.2/gcc/go/gofrontend/types.h
|
---|
| 2316 | --- gcc-4.8.2.orig/gcc/go/gofrontend/types.h 2013-09-18 21:54:08.000000000 +0000
|
---|
| 2317 | +++ gcc-4.8.2/gcc/go/gofrontend/types.h 2013-11-01 16:12:34.063809161 +0000
|
---|
| 2318 | @@ -1717,7 +1717,8 @@
|
---|
| 2319 | Typed_identifier_list* results, Location location)
|
---|
| 2320 | : Type(TYPE_FUNCTION),
|
---|
| 2321 | receiver_(receiver), parameters_(parameters), results_(results),
|
---|
| 2322 | - location_(location), is_varargs_(false), is_builtin_(false)
|
---|
| 2323 | + location_(location), is_varargs_(false), is_builtin_(false),
|
---|
| 2324 | + fnbtype_(NULL)
|
---|
| 2325 | { }
|
---|
| 2326 |
|
---|
| 2327 | // Get the receiver.
|
---|
| 2328 | @@ -1798,6 +1799,11 @@
|
---|
| 2329 | static Type*
|
---|
| 2330 | make_function_type_descriptor_type();
|
---|
| 2331 |
|
---|
| 2332 | + // Return the backend representation of this function type. This is used
|
---|
| 2333 | + // as the real type of a backend function declaration or defintion.
|
---|
| 2334 | + Btype*
|
---|
| 2335 | + get_backend_fntype(Gogo*);
|
---|
| 2336 | +
|
---|
| 2337 | protected:
|
---|
| 2338 | int
|
---|
| 2339 | do_traverse(Traverse*);
|
---|
| 2340 | @@ -1851,6 +1857,9 @@
|
---|
| 2341 | // Whether this is a special builtin function which can not simply
|
---|
| 2342 | // be called. This is used for len, cap, etc.
|
---|
| 2343 | bool is_builtin_;
|
---|
| 2344 | + // The backend representation of this type for backend function
|
---|
| 2345 | + // declarations and definitions.
|
---|
| 2346 | + Btype* fnbtype_;
|
---|
| 2347 | };
|
---|
| 2348 |
|
---|
| 2349 | // The type of a pointer.
|
---|
| 2350 | @@ -1915,7 +1924,7 @@
|
---|
| 2351 | {
|
---|
| 2352 | public:
|
---|
| 2353 | explicit Struct_field(const Typed_identifier& typed_identifier)
|
---|
| 2354 | - : typed_identifier_(typed_identifier), tag_(NULL)
|
---|
| 2355 | + : typed_identifier_(typed_identifier), tag_(NULL), is_imported_(false)
|
---|
| 2356 | { }
|
---|
| 2357 |
|
---|
| 2358 | // The field name.
|
---|
| 2359 | @@ -1926,6 +1935,10 @@
|
---|
| 2360 | bool
|
---|
| 2361 | is_field_name(const std::string& name) const;
|
---|
| 2362 |
|
---|
| 2363 | + // Return whether this struct field is an unexported field named NAME.
|
---|
| 2364 | + bool
|
---|
| 2365 | + is_unexported_field_name(Gogo*, const std::string& name) const;
|
---|
| 2366 | +
|
---|
| 2367 | // Return whether this struct field is an embedded built-in type.
|
---|
| 2368 | bool
|
---|
| 2369 | is_embedded_builtin(Gogo*) const;
|
---|
| 2370 | @@ -1963,6 +1976,11 @@
|
---|
| 2371 | set_tag(const std::string& tag)
|
---|
| 2372 | { this->tag_ = new std::string(tag); }
|
---|
| 2373 |
|
---|
| 2374 | + // Record that this field is defined in an imported struct.
|
---|
| 2375 | + void
|
---|
| 2376 | + set_is_imported()
|
---|
| 2377 | + { this->is_imported_ = true; }
|
---|
| 2378 | +
|
---|
| 2379 | // Set the type. This is only used in error cases.
|
---|
| 2380 | void
|
---|
| 2381 | set_type(Type* type)
|
---|
| 2382 | @@ -1973,6 +1991,8 @@
|
---|
| 2383 | Typed_identifier typed_identifier_;
|
---|
| 2384 | // The field tag. This is NULL if the field has no tag.
|
---|
| 2385 | std::string* tag_;
|
---|
| 2386 | + // Whether this field is defined in an imported struct.
|
---|
| 2387 | + bool is_imported_;
|
---|
[88af5df] | 2388 | };
|
---|
| 2389 |
|
---|
| 2390 | // A list of struct fields.
|
---|
| 2391 | diff -Naur gcc-4.8.2.orig/gcc/graphite-clast-to-gimple.c gcc-4.8.2/gcc/graphite-clast-to-gimple.c
|
---|
| 2392 | --- gcc-4.8.2.orig/gcc/graphite-clast-to-gimple.c 2013-01-10 20:38:27.000000000 +0000
|
---|
| 2393 | +++ gcc-4.8.2/gcc/graphite-clast-to-gimple.c 2013-11-01 16:12:34.503884898 +0000
|
---|
| 2394 | @@ -1170,8 +1170,11 @@
|
---|
| 2395 | redirect_edge_succ_nodup (next_e, after);
|
---|
| 2396 | set_immediate_dominator (CDI_DOMINATORS, next_e->dest, next_e->src);
|
---|
[2e59d11] | 2397 |
|
---|
[88af5df] | 2398 | + isl_set *domain = isl_set_from_cloog_domain (stmt->domain);
|
---|
| 2399 | + int scheduling_dim = isl_set_n_dim (domain);
|
---|
| 2400 | +
|
---|
| 2401 | if (flag_loop_parallelize_all
|
---|
| 2402 | - && loop_is_parallel_p (loop, bb_pbb_mapping, level))
|
---|
| 2403 | + && loop_is_parallel_p (loop, bb_pbb_mapping, scheduling_dim))
|
---|
| 2404 | loop->can_be_parallel = true;
|
---|
| 2405 |
|
---|
| 2406 | return last_e;
|
---|
| 2407 | diff -Naur gcc-4.8.2.orig/gcc/graphite-dependences.c gcc-4.8.2/gcc/graphite-dependences.c
|
---|
| 2408 | --- gcc-4.8.2.orig/gcc/graphite-dependences.c 2013-01-10 20:38:27.000000000 +0000
|
---|
| 2409 | +++ gcc-4.8.2/gcc/graphite-dependences.c 2013-11-01 16:12:34.503884898 +0000
|
---|
| 2410 | @@ -297,7 +297,7 @@
|
---|
| 2411 | int depth)
|
---|
| 2412 | {
|
---|
| 2413 | bool res;
|
---|
| 2414 | - int idx, i;
|
---|
| 2415 | + int i;
|
---|
| 2416 | isl_space *space;
|
---|
| 2417 | isl_map *lex, *x;
|
---|
| 2418 | isl_constraint *ineq;
|
---|
| 2419 | @@ -312,13 +312,12 @@
|
---|
| 2420 | space = isl_map_get_space (x);
|
---|
| 2421 | ineq = isl_inequality_alloc (isl_local_space_from_space (space));
|
---|
| 2422 |
|
---|
| 2423 | - idx = 2 * depth + 1;
|
---|
| 2424 | - for (i = 0; i < idx; i++)
|
---|
| 2425 | + for (i = 0; i < depth - 1; i++)
|
---|
| 2426 | lex = isl_map_equate (lex, isl_dim_in, i, isl_dim_out, i);
|
---|
| 2427 |
|
---|
| 2428 | /* in + 1 <= out */
|
---|
| 2429 | - ineq = isl_constraint_set_coefficient_si (ineq, isl_dim_out, idx, 1);
|
---|
| 2430 | - ineq = isl_constraint_set_coefficient_si (ineq, isl_dim_in, idx, -1);
|
---|
| 2431 | + ineq = isl_constraint_set_coefficient_si (ineq, isl_dim_out, depth - 1, 1);
|
---|
| 2432 | + ineq = isl_constraint_set_coefficient_si (ineq, isl_dim_in, depth - 1, -1);
|
---|
| 2433 | ineq = isl_constraint_set_constant_si (ineq, -1);
|
---|
| 2434 | lex = isl_map_add_constraint (lex, ineq);
|
---|
| 2435 | x = isl_map_intersect (x, lex);
|
---|
| 2436 | diff -Naur gcc-4.8.2.orig/gcc/ipa-prop.c gcc-4.8.2/gcc/ipa-prop.c
|
---|
| 2437 | --- gcc-4.8.2.orig/gcc/ipa-prop.c 2013-06-24 12:57:52.000000000 +0000
|
---|
| 2438 | +++ gcc-4.8.2/gcc/ipa-prop.c 2013-11-01 16:12:34.071810538 +0000
|
---|
| 2439 | @@ -2126,7 +2126,6 @@
|
---|
| 2440 | we may create the first reference to the object in the unit. */
|
---|
[2e59d11] | 2441 | if (!callee || callee->global.inlined_to)
|
---|
[88af5df] | 2442 | {
|
---|
| 2443 | - struct cgraph_node *first_clone = callee;
|
---|
| 2444 |
|
---|
| 2445 | /* We are better to ensure we can refer to it.
|
---|
| 2446 | In the case of static functions we are out of luck, since we already
|
---|
| 2447 | @@ -2142,31 +2141,7 @@
|
---|
| 2448 | xstrdup (cgraph_node_name (ie->callee)), ie->callee->uid);
|
---|
| 2449 | return NULL;
|
---|
| 2450 | }
|
---|
| 2451 | -
|
---|
| 2452 | - /* Create symbol table node. Even if inline clone exists, we can not take
|
---|
| 2453 | - it as a target of non-inlined call. */
|
---|
| 2454 | - callee = cgraph_create_node (target);
|
---|
| 2455 | -
|
---|
| 2456 | - /* OK, we previously inlined the function, then removed the offline copy and
|
---|
| 2457 | - now we want it back for external call. This can happen when devirtualizing
|
---|
| 2458 | - while inlining function called once that happens after extern inlined and
|
---|
| 2459 | - virtuals are already removed. In this case introduce the external node
|
---|
| 2460 | - and make it available for call. */
|
---|
| 2461 | - if (first_clone)
|
---|
| 2462 | - {
|
---|
| 2463 | - first_clone->clone_of = callee;
|
---|
| 2464 | - callee->clones = first_clone;
|
---|
| 2465 | - symtab_prevail_in_asm_name_hash ((symtab_node)callee);
|
---|
| 2466 | - symtab_insert_node_to_hashtable ((symtab_node)callee);
|
---|
| 2467 | - if (dump_file)
|
---|
| 2468 | - fprintf (dump_file, "ipa-prop: Introduced new external node "
|
---|
| 2469 | - "(%s/%i) and turned into root of the clone tree.\n",
|
---|
| 2470 | - xstrdup (cgraph_node_name (callee)), callee->uid);
|
---|
| 2471 | - }
|
---|
| 2472 | - else if (dump_file)
|
---|
| 2473 | - fprintf (dump_file, "ipa-prop: Introduced new external node "
|
---|
| 2474 | - "(%s/%i).\n",
|
---|
| 2475 | - xstrdup (cgraph_node_name (callee)), callee->uid);
|
---|
| 2476 | + callee = cgraph_get_create_real_symbol_node (target);
|
---|
| 2477 | }
|
---|
| 2478 | ipa_check_create_node_params ();
|
---|
| 2479 |
|
---|
| 2480 | diff -Naur gcc-4.8.2.orig/gcc/optabs.c gcc-4.8.2/gcc/optabs.c
|
---|
| 2481 | --- gcc-4.8.2.orig/gcc/optabs.c 2013-03-09 07:54:02.000000000 +0000
|
---|
| 2482 | +++ gcc-4.8.2/gcc/optabs.c 2013-11-01 16:12:34.075811227 +0000
|
---|
| 2483 | @@ -7035,8 +7035,7 @@
|
---|
| 2484 |
|
---|
| 2485 | create_output_operand (&ops[0], target, mode);
|
---|
| 2486 | create_fixed_operand (&ops[1], mem);
|
---|
| 2487 | - /* VAL may have been promoted to a wider mode. Shrink it if so. */
|
---|
| 2488 | - create_convert_operand_to (&ops[2], val, mode, true);
|
---|
| 2489 | + create_input_operand (&ops[2], val, mode);
|
---|
| 2490 | create_integer_operand (&ops[3], model);
|
---|
| 2491 | if (maybe_expand_insn (icode, 4, ops))
|
---|
| 2492 | return ops[0].value;
|
---|
| 2493 | @@ -7075,8 +7074,7 @@
|
---|
| 2494 | struct expand_operand ops[3];
|
---|
| 2495 | create_output_operand (&ops[0], target, mode);
|
---|
| 2496 | create_fixed_operand (&ops[1], mem);
|
---|
| 2497 | - /* VAL may have been promoted to a wider mode. Shrink it if so. */
|
---|
| 2498 | - create_convert_operand_to (&ops[2], val, mode, true);
|
---|
| 2499 | + create_input_operand (&ops[2], val, mode);
|
---|
| 2500 | if (maybe_expand_insn (icode, 3, ops))
|
---|
| 2501 | return ops[0].value;
|
---|
| 2502 | }
|
---|
| 2503 | @@ -7118,8 +7116,6 @@
|
---|
| 2504 | {
|
---|
| 2505 | if (!target || !register_operand (target, mode))
|
---|
| 2506 | target = gen_reg_rtx (mode);
|
---|
| 2507 | - if (GET_MODE (val) != VOIDmode && GET_MODE (val) != mode)
|
---|
| 2508 | - val = convert_modes (mode, GET_MODE (val), val, 1);
|
---|
| 2509 | if (expand_compare_and_swap_loop (mem, target, val, NULL_RTX))
|
---|
| 2510 | return target;
|
---|
| 2511 | }
|
---|
| 2512 | @@ -7331,8 +7327,8 @@
|
---|
| 2513 | create_output_operand (&ops[0], target_bool, bool_mode);
|
---|
| 2514 | create_output_operand (&ops[1], target_oval, mode);
|
---|
| 2515 | create_fixed_operand (&ops[2], mem);
|
---|
| 2516 | - create_convert_operand_to (&ops[3], expected, mode, true);
|
---|
| 2517 | - create_convert_operand_to (&ops[4], desired, mode, true);
|
---|
| 2518 | + create_input_operand (&ops[3], expected, mode);
|
---|
| 2519 | + create_input_operand (&ops[4], desired, mode);
|
---|
| 2520 | create_integer_operand (&ops[5], is_weak);
|
---|
| 2521 | create_integer_operand (&ops[6], succ_model);
|
---|
| 2522 | create_integer_operand (&ops[7], fail_model);
|
---|
| 2523 | @@ -7353,8 +7349,8 @@
|
---|
| 2524 |
|
---|
| 2525 | create_output_operand (&ops[0], target_oval, mode);
|
---|
| 2526 | create_fixed_operand (&ops[1], mem);
|
---|
| 2527 | - create_convert_operand_to (&ops[2], expected, mode, true);
|
---|
| 2528 | - create_convert_operand_to (&ops[3], desired, mode, true);
|
---|
| 2529 | + create_input_operand (&ops[2], expected, mode);
|
---|
| 2530 | + create_input_operand (&ops[3], desired, mode);
|
---|
| 2531 | if (!maybe_expand_insn (icode, 4, ops))
|
---|
| 2532 | return false;
|
---|
| 2533 |
|
---|
| 2534 | diff -Naur gcc-4.8.2.orig/gcc/recog.c gcc-4.8.2/gcc/recog.c
|
---|
| 2535 | --- gcc-4.8.2.orig/gcc/recog.c 2013-08-05 20:24:39.000000000 +0000
|
---|
| 2536 | +++ gcc-4.8.2/gcc/recog.c 2013-11-01 16:12:34.219836014 +0000
|
---|
[2e59d11] | 2537 | @@ -3061,6 +3061,9 @@
|
---|
[88af5df] | 2538 | return 1;
|
---|
| 2539 | }
|
---|
[2e59d11] | 2540 |
|
---|
[88af5df] | 2541 | +/* Regno offset to be used in the register search. */
|
---|
| 2542 | +static int search_ofs;
|
---|
| 2543 | +
|
---|
| 2544 | /* Try to find a hard register of mode MODE, matching the register class in
|
---|
| 2545 | CLASS_STR, which is available at the beginning of insn CURRENT_INSN and
|
---|
| 2546 | remains available until the end of LAST_INSN. LAST_INSN may be NULL_RTX,
|
---|
| 2547 | @@ -3076,7 +3079,6 @@
|
---|
| 2548 | peep2_find_free_register (int from, int to, const char *class_str,
|
---|
| 2549 | enum machine_mode mode, HARD_REG_SET *reg_set)
|
---|
| 2550 | {
|
---|
| 2551 | - static int search_ofs;
|
---|
| 2552 | enum reg_class cl;
|
---|
| 2553 | HARD_REG_SET live;
|
---|
| 2554 | df_ref *def_rec;
|
---|
| 2555 | @@ -3541,6 +3543,7 @@
|
---|
| 2556 | /* Initialize the regsets we're going to use. */
|
---|
| 2557 | for (i = 0; i < MAX_INSNS_PER_PEEP2 + 1; ++i)
|
---|
| 2558 | peep2_insn_data[i].live_before = BITMAP_ALLOC (®_obstack);
|
---|
| 2559 | + search_ofs = 0;
|
---|
| 2560 | live = BITMAP_ALLOC (®_obstack);
|
---|
| 2561 |
|
---|
| 2562 | FOR_EACH_BB_REVERSE (bb)
|
---|
| 2563 | diff -Naur gcc-4.8.2.orig/gcc/testsuite/g++.dg/cpp0x/decltype57.C gcc-4.8.2/gcc/testsuite/g++.dg/cpp0x/decltype57.C
|
---|
| 2564 | --- gcc-4.8.2.orig/gcc/testsuite/g++.dg/cpp0x/decltype57.C 1970-01-01 00:00:00.000000000 +0000
|
---|
| 2565 | +++ gcc-4.8.2/gcc/testsuite/g++.dg/cpp0x/decltype57.C 2013-11-01 16:12:34.223836702 +0000
|
---|
[2e59d11] | 2566 | @@ -0,0 +1,8 @@
|
---|
[88af5df] | 2567 | +// PR c++/58633
|
---|
| 2568 | +// { dg-do compile { target c++11 } }
|
---|
| 2569 | +
|
---|
| 2570 | +void foo(int i)
|
---|
| 2571 | +{
|
---|
| 2572 | + typedef int I;
|
---|
| 2573 | + decltype(i.I::~I())* p;
|
---|
| 2574 | +}
|
---|
| 2575 | diff -Naur gcc-4.8.2.orig/gcc/testsuite/g++.dg/cpp0x/enum18.C gcc-4.8.2/gcc/testsuite/g++.dg/cpp0x/enum18.C
|
---|
| 2576 | --- gcc-4.8.2.orig/gcc/testsuite/g++.dg/cpp0x/enum18.C 2011-05-28 22:01:28.000000000 +0000
|
---|
| 2577 | +++ gcc-4.8.2/gcc/testsuite/g++.dg/cpp0x/enum18.C 2013-11-01 16:12:34.227837390 +0000
|
---|
| 2578 | @@ -4,5 +4,5 @@
|
---|
| 2579 | int main(void) {
|
---|
| 2580 | enum e {};
|
---|
[2e59d11] | 2581 | e ev;
|
---|
[88af5df] | 2582 | - ev.e::~e_u(); // { dg-error "e_u. has not been declared" }
|
---|
| 2583 | + ev.e::~e_u(); // { dg-error "" }
|
---|
| 2584 | }
|
---|
| 2585 | diff -Naur gcc-4.8.2.orig/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi5.C gcc-4.8.2/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi5.C
|
---|
| 2586 | --- gcc-4.8.2.orig/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi5.C 1970-01-01 00:00:00.000000000 +0000
|
---|
| 2587 | +++ gcc-4.8.2/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi5.C 2013-11-01 16:12:34.227837390 +0000
|
---|
[2e59d11] | 2588 | @@ -0,0 +1,7 @@
|
---|
[88af5df] | 2589 | +// PR c++/58596
|
---|
[2e59d11] | 2590 | +// { dg-do compile { target c++11 } }
|
---|
[88af5df] | 2591 | +
|
---|
| 2592 | +struct A
|
---|
| 2593 | +{
|
---|
| 2594 | + int i = [] { return decltype(i)(); }();
|
---|
| 2595 | +};
|
---|
| 2596 | diff -Naur gcc-4.8.2.orig/gcc/testsuite/g++.dg/tm/noexcept-6.C gcc-4.8.2/gcc/testsuite/g++.dg/tm/noexcept-6.C
|
---|
| 2597 | --- gcc-4.8.2.orig/gcc/testsuite/g++.dg/tm/noexcept-6.C 1970-01-01 00:00:00.000000000 +0000
|
---|
| 2598 | +++ gcc-4.8.2/gcc/testsuite/g++.dg/tm/noexcept-6.C 2013-11-01 16:12:34.227837390 +0000
|
---|
[2e59d11] | 2599 | @@ -0,0 +1,23 @@
|
---|
[88af5df] | 2600 | +// { dg-do compile }
|
---|
| 2601 | +// { dg-options "-fno-exceptions -fgnu-tm -O -std=c++0x -fdump-tree-tmlower" }
|
---|
| 2602 | +
|
---|
| 2603 | +struct TrueFalse
|
---|
[2e59d11] | 2604 | +{
|
---|
[88af5df] | 2605 | + static constexpr bool v() { return true; }
|
---|
[2e59d11] | 2606 | +};
|
---|
[88af5df] | 2607 | +
|
---|
[2e59d11] | 2608 | +int global;
|
---|
[88af5df] | 2609 | +
|
---|
| 2610 | +template<typename T> int foo()
|
---|
| 2611 | +{
|
---|
| 2612 | + return __transaction_atomic noexcept(T::v()) (global + 1);
|
---|
| 2613 | +}
|
---|
| 2614 | +
|
---|
| 2615 | +int f1()
|
---|
[2e59d11] | 2616 | +{
|
---|
[88af5df] | 2617 | + return foo<TrueFalse>();
|
---|
| 2618 | +}
|
---|
| 2619 | +
|
---|
| 2620 | +/* { dg-final { scan-tree-dump-times "eh_must_not_throw" 0 "tmlower" } } */
|
---|
| 2621 | +/* { dg-final { scan-tree-dump-times "__transaction_atomic" 1 "tmlower" } } */
|
---|
| 2622 | +/* { dg-final { cleanup-tree-dump "tmlower" } } */
|
---|
| 2623 | diff -Naur gcc-4.8.2.orig/gcc/testsuite/gcc.c-torture/execute/pr58831.c gcc-4.8.2/gcc/testsuite/gcc.c-torture/execute/pr58831.c
|
---|
| 2624 | --- gcc-4.8.2.orig/gcc/testsuite/gcc.c-torture/execute/pr58831.c 1970-01-01 00:00:00.000000000 +0000
|
---|
| 2625 | +++ gcc-4.8.2/gcc/testsuite/gcc.c-torture/execute/pr58831.c 2013-11-01 16:12:34.223836702 +0000
|
---|
| 2626 | @@ -0,0 +1,40 @@
|
---|
| 2627 | +#include <assert.h>
|
---|
| 2628 | +
|
---|
| 2629 | +int a, *b, c, d, f, **i, p, q, *r;
|
---|
| 2630 | +short o, j;
|
---|
| 2631 | +
|
---|
| 2632 | +static int __attribute__((noinline, noclone))
|
---|
| 2633 | +fn1 (int *p1, int **p2)
|
---|
| 2634 | +{
|
---|
| 2635 | + int **e = &b;
|
---|
| 2636 | + for (; p; p++)
|
---|
| 2637 | + *p1 = 1;
|
---|
| 2638 | + *e = *p2 = &d;
|
---|
| 2639 | +
|
---|
| 2640 | + assert (r);
|
---|
| 2641 | +
|
---|
| 2642 | + return c;
|
---|
| 2643 | +}
|
---|
| 2644 | +
|
---|
| 2645 | +static int ** __attribute__((noinline, noclone))
|
---|
[2e59d11] | 2646 | +fn2 (void)
|
---|
[88af5df] | 2647 | +{
|
---|
| 2648 | + for (f = 0; f != 42; f++)
|
---|
| 2649 | + {
|
---|
| 2650 | + int *g[3] = {0, 0, 0};
|
---|
| 2651 | + for (o = 0; o; o--)
|
---|
| 2652 | + for (; a > 1;)
|
---|
[2e59d11] | 2653 | + {
|
---|
[88af5df] | 2654 | + int **h[1] = { &g[2] };
|
---|
| 2655 | + }
|
---|
[2e59d11] | 2656 | + }
|
---|
[88af5df] | 2657 | + return &r;
|
---|
| 2658 | +}
|
---|
| 2659 | +
|
---|
| 2660 | +int
|
---|
| 2661 | +main (void)
|
---|
| 2662 | +{
|
---|
[2e59d11] | 2663 | + i = fn2 ();
|
---|
[88af5df] | 2664 | + fn1 (b, i);
|
---|
| 2665 | + return 0;
|
---|
| 2666 | +}
|
---|
| 2667 | diff -Naur gcc-4.8.2.orig/gcc/testsuite/gcc.dg/atomic-store-6.c gcc-4.8.2/gcc/testsuite/gcc.dg/atomic-store-6.c
|
---|
| 2668 | --- gcc-4.8.2.orig/gcc/testsuite/gcc.dg/atomic-store-6.c 1970-01-01 00:00:00.000000000 +0000
|
---|
| 2669 | +++ gcc-4.8.2/gcc/testsuite/gcc.dg/atomic-store-6.c 2013-11-01 16:12:34.223836702 +0000
|
---|
| 2670 | @@ -0,0 +1,13 @@
|
---|
[2e59d11] | 2671 | +/* { dg-do run } */
|
---|
[88af5df] | 2672 | +/* { dg-require-effective-target sync_int_128_runtime } */
|
---|
[2e59d11] | 2673 | +/* { dg-options "-mcx16" { target { i?86-*-* x86_64-*-* } } } */
|
---|
[88af5df] | 2674 | +
|
---|
[2e59d11] | 2675 | +__int128_t i;
|
---|
[88af5df] | 2676 | +
|
---|
| 2677 | +int main()
|
---|
| 2678 | +{
|
---|
| 2679 | + __atomic_store_16(&i, -1, 0);
|
---|
| 2680 | + if (i != -1)
|
---|
| 2681 | + __builtin_abort();
|
---|
| 2682 | + return 0;
|
---|
| 2683 | +}
|
---|
| 2684 | diff -Naur gcc-4.8.2.orig/gcc/testsuite/gcc.dg/graphite/pr54094.c gcc-4.8.2/gcc/testsuite/gcc.dg/graphite/pr54094.c
|
---|
| 2685 | --- gcc-4.8.2.orig/gcc/testsuite/gcc.dg/graphite/pr54094.c 1970-01-01 00:00:00.000000000 +0000
|
---|
| 2686 | +++ gcc-4.8.2/gcc/testsuite/gcc.dg/graphite/pr54094.c 2013-11-01 16:12:34.503884898 +0000
|
---|
| 2687 | @@ -0,0 +1,10 @@
|
---|
| 2688 | +/* { dg-options "-O2 -floop-parallelize-all -floop-nest-optimize" } */
|
---|
| 2689 | +void dwt_deinterleave_h(int *a, int *b, int dn, int sn, int cas)
|
---|
| 2690 | +{
|
---|
| 2691 | + int i;
|
---|
| 2692 | + for (i=0; i<sn; i++)
|
---|
[2e59d11] | 2693 | + b[i]=a[2*i+cas];
|
---|
[88af5df] | 2694 | + for (i=0; i<dn; i++)
|
---|
[2e59d11] | 2695 | + b[sn+i]=a[(2*i+1-cas)];
|
---|
[88af5df] | 2696 | +}
|
---|
| 2697 | +
|
---|
[2e59d11] | 2698 | diff -Naur gcc-4.8.2.orig/gcc/testsuite/gcc.dg/pr58805.c gcc-4.8.2/gcc/testsuite/gcc.dg/pr58805.c
|
---|
| 2699 | --- gcc-4.8.2.orig/gcc/testsuite/gcc.dg/pr58805.c 1970-01-01 00:00:00.000000000 +0000
|
---|
| 2700 | +++ gcc-4.8.2/gcc/testsuite/gcc.dg/pr58805.c 2013-11-01 16:12:34.223836702 +0000
|
---|
| 2701 | @@ -0,0 +1,24 @@
|
---|
| 2702 | +/* { dg-do compile } */
|
---|
| 2703 | +/* { dg-options "-O2 -ftree-tail-merge -fdump-tree-pre" } */
|
---|
| 2704 | +
|
---|
| 2705 | +/* Type that matches the 'p' constraint. */
|
---|
| 2706 | +#define TYPE void *
|
---|
| 2707 | +
|
---|
| 2708 | +static inline
|
---|
| 2709 | +void bar (TYPE *r)
|
---|
| 2710 | +{
|
---|
| 2711 | + TYPE t;
|
---|
| 2712 | + __asm__ ("" : "=&p" (t), "=p" (*r));
|
---|
| 2713 | +}
|
---|
| 2714 | +
|
---|
| 2715 | +void
|
---|
| 2716 | +foo (int n, TYPE *x, TYPE *y)
|
---|
| 2717 | +{
|
---|
| 2718 | + if (n == 0)
|
---|
| 2719 | + bar (x);
|
---|
| 2720 | + else
|
---|
| 2721 | + bar (y);
|
---|
| 2722 | +}
|
---|
| 2723 | +
|
---|
[88af5df] | 2724 | +/* { dg-final { scan-tree-dump-times "__asm__" 2 "pre"} } */
|
---|
| 2725 | +/* { dg-final { cleanup-tree-dump "pre" } } */
|
---|
[2e59d11] | 2726 | diff -Naur gcc-4.8.2.orig/gcc/testsuite/gcc.dg/torture/pr57488.c gcc-4.8.2/gcc/testsuite/gcc.dg/torture/pr57488.c
|
---|
| 2727 | --- gcc-4.8.2.orig/gcc/testsuite/gcc.dg/torture/pr57488.c 1970-01-01 00:00:00.000000000 +0000
|
---|
| 2728 | +++ gcc-4.8.2/gcc/testsuite/gcc.dg/torture/pr57488.c 2013-11-01 16:12:34.223836702 +0000
|
---|
| 2729 | @@ -0,0 +1,58 @@
|
---|
| 2730 | +/* { dg-do run } */
|
---|
| 2731 | +
|
---|
| 2732 | +extern void abort (void);
|
---|
| 2733 | +
|
---|
| 2734 | +int i, j, *pj = &j, **ppj = &pj;
|
---|
| 2735 | +int x, *px = &x;
|
---|
| 2736 | +
|
---|
| 2737 | +short s, *ps = &s, k;
|
---|
| 2738 | +
|
---|
| 2739 | +unsigned short u, *pu = &u, **ppu = &pu;
|
---|
| 2740 | +
|
---|
| 2741 | +char c, *pc = &c;
|
---|
| 2742 | +
|
---|
| 2743 | +unsigned char v = 48;
|
---|
| 2744 | +
|
---|
| 2745 | +static int
|
---|
| 2746 | +bar (int p)
|
---|
| 2747 | +{
|
---|
| 2748 | + p = k;
|
---|
| 2749 | + *px = **ppu = i;
|
---|
| 2750 | + *ppj = &p;
|
---|
| 2751 | + if (**ppj)
|
---|
| 2752 | + *pj = p;
|
---|
| 2753 | + return p;
|
---|
| 2754 | +}
|
---|
| 2755 | +
|
---|
| 2756 | +void __attribute__((noinline))
|
---|
| 2757 | +foo ()
|
---|
| 2758 | +{
|
---|
| 2759 | + for (; i <= 3; i++)
|
---|
| 2760 | + for (; j; j--);
|
---|
| 2761 | +
|
---|
| 2762 | + u ^= bar (*pj);
|
---|
| 2763 | +
|
---|
| 2764 | + for (k = 1; k >= 0; k--)
|
---|
| 2765 | + {
|
---|
| 2766 | + int l;
|
---|
| 2767 | + bar (0);
|
---|
| 2768 | + for (l = 1; l < 5; l++)
|
---|
| 2769 | + {
|
---|
| 2770 | + int m;
|
---|
| 2771 | + for (m = 6; m; m--)
|
---|
| 2772 | + {
|
---|
| 2773 | + v--;
|
---|
| 2774 | + *ps = *pc;
|
---|
| 2775 | + }
|
---|
| 2776 | + }
|
---|
| 2777 | + }
|
---|
| 2778 | +}
|
---|
| 2779 | +
|
---|
| 2780 | +int
|
---|
| 2781 | +main ()
|
---|
| 2782 | +{
|
---|
| 2783 | + foo ();
|
---|
| 2784 | + if (v != 0)
|
---|
[88af5df] | 2785 | + abort ();
|
---|
| 2786 | + return 0;
|
---|
| 2787 | +}
|
---|
| 2788 | diff -Naur gcc-4.8.2.orig/gcc/testsuite/gcc.dg/torture/pr58079.c gcc-4.8.2/gcc/testsuite/gcc.dg/torture/pr58079.c
|
---|
| 2789 | --- gcc-4.8.2.orig/gcc/testsuite/gcc.dg/torture/pr58079.c 1970-01-01 00:00:00.000000000 +0000
|
---|
| 2790 | +++ gcc-4.8.2/gcc/testsuite/gcc.dg/torture/pr58079.c 2013-11-01 16:12:34.223836702 +0000
|
---|
| 2791 | @@ -0,0 +1,107 @@
|
---|
| 2792 | +/* { dg-options "-mlong-calls" { target mips*-*-* } } */
|
---|
| 2793 | +
|
---|
| 2794 | +typedef unsigned char u8;
|
---|
| 2795 | +typedef unsigned short u16;
|
---|
| 2796 | +typedef unsigned int __kernel_size_t;
|
---|
| 2797 | +typedef __kernel_size_t size_t;
|
---|
| 2798 | +struct list_head {
|
---|
| 2799 | + struct list_head *next;
|
---|
| 2800 | +};
|
---|
| 2801 | +
|
---|
| 2802 | +struct dmx_ts_feed {
|
---|
| 2803 | + int is_filtering;
|
---|
| 2804 | +};
|
---|
| 2805 | +struct dmx_section_feed {
|
---|
| 2806 | + u16 secbufp;
|
---|
| 2807 | + u16 seclen;
|
---|
| 2808 | + u16 tsfeedp;
|
---|
| 2809 | +};
|
---|
| 2810 | +
|
---|
| 2811 | +typedef int (*dmx_ts_cb) (
|
---|
| 2812 | + const u8 * buffer1,
|
---|
| 2813 | + size_t buffer1_length,
|
---|
| 2814 | + const u8 * buffer2,
|
---|
| 2815 | + size_t buffer2_length
|
---|
| 2816 | +);
|
---|
| 2817 | +
|
---|
| 2818 | +struct dvb_demux_feed {
|
---|
| 2819 | + union {
|
---|
| 2820 | + struct dmx_ts_feed ts;
|
---|
| 2821 | + struct dmx_section_feed sec;
|
---|
| 2822 | + } feed;
|
---|
| 2823 | + union {
|
---|
| 2824 | + dmx_ts_cb ts;
|
---|
| 2825 | + } cb;
|
---|
| 2826 | + int type;
|
---|
| 2827 | + u16 pid;
|
---|
| 2828 | + int ts_type;
|
---|
| 2829 | + struct list_head list_head;
|
---|
| 2830 | +};
|
---|
| 2831 | +
|
---|
| 2832 | +struct dvb_demux {
|
---|
| 2833 | + int (*stop_feed)(struct dvb_demux_feed *feed);
|
---|
| 2834 | + struct list_head feed_list;
|
---|
| 2835 | +};
|
---|
| 2836 | +
|
---|
| 2837 | +
|
---|
| 2838 | +static
|
---|
| 2839 | +inline
|
---|
| 2840 | +__attribute__((always_inline))
|
---|
| 2841 | +u8
|
---|
| 2842 | +payload(const u8 *tsp)
|
---|
| 2843 | +{
|
---|
| 2844 | + if (tsp[3] & 0x20) {
|
---|
| 2845 | + return 184 - 1 - tsp[4];
|
---|
| 2846 | + }
|
---|
| 2847 | + return 184;
|
---|
| 2848 | +}
|
---|
| 2849 | +
|
---|
| 2850 | +static
|
---|
| 2851 | +inline
|
---|
| 2852 | +__attribute__((always_inline))
|
---|
| 2853 | +int
|
---|
| 2854 | +dvb_dmx_swfilter_payload(struct dvb_demux_feed *feed, const u8 *buf)
|
---|
| 2855 | +{
|
---|
| 2856 | + int count = payload(buf);
|
---|
| 2857 | + int p;
|
---|
| 2858 | + if (count == 0)
|
---|
| 2859 | + return -1;
|
---|
| 2860 | + return feed->cb.ts(&buf[p], count, ((void *)0), 0);
|
---|
| 2861 | +}
|
---|
| 2862 | +
|
---|
| 2863 | +static
|
---|
| 2864 | +inline
|
---|
| 2865 | +__attribute__((always_inline))
|
---|
| 2866 | +void
|
---|
| 2867 | +dvb_dmx_swfilter_packet_type(struct dvb_demux_feed *feed, const u8 *buf)
|
---|
| 2868 | +{
|
---|
| 2869 | + switch (feed->type) {
|
---|
| 2870 | + case 0:
|
---|
| 2871 | + if (feed->ts_type & 1) {
|
---|
| 2872 | + dvb_dmx_swfilter_payload(feed, buf);
|
---|
| 2873 | + }
|
---|
| 2874 | + if (dvb_dmx_swfilter_section_packet(feed, buf) < 0)
|
---|
| 2875 | + feed->feed.sec.seclen = feed->feed.sec.secbufp = 0;
|
---|
| 2876 | + }
|
---|
| 2877 | +}
|
---|
| 2878 | +
|
---|
| 2879 | +static
|
---|
| 2880 | +void
|
---|
| 2881 | +dvb_dmx_swfilter_packet(struct dvb_demux *demux, const u8 *buf)
|
---|
| 2882 | +{
|
---|
| 2883 | + struct dvb_demux_feed *feed;
|
---|
| 2884 | + int dvr_done = 0;
|
---|
| 2885 | +
|
---|
| 2886 | + for (feed = ({ const typeof( ((typeof(*feed) *)0)->list_head ) *__mptr = ((&demux->feed_list)->next); (typeof(*feed) *)( (char *)__mptr - __builtin_offsetof(typeof(*feed),list_head) );}); __builtin_prefetch(feed->list_head.next), &feed->list_head != (&demux->feed_list); feed = ({ const typeof( ((typeof(*feed) *)0)->list_head ) *__mptr = (feed->list_head.next); (typeof(*feed) *)( (char *)__mptr - __builtin_offsetof(typeof(*feed),list_head) );})) {
|
---|
| 2887 | + if (((((feed)->type == 0) && ((feed)->feed.ts.is_filtering) && (((feed)->ts_type & (1 | 8)) == 1))) && (dvr_done++))
|
---|
| 2888 | + dvb_dmx_swfilter_packet_type(feed, buf);
|
---|
| 2889 | + else if (feed->pid == 0x2000)
|
---|
| 2890 | + feed->cb.ts(buf, 188, ((void *)0), 0);
|
---|
| 2891 | + }
|
---|
| 2892 | +}
|
---|
| 2893 | +void dvb_dmx_swfilter_packets(struct dvb_demux *demux, const u8 *buf, size_t count)
|
---|
| 2894 | +{
|
---|
| 2895 | + while (count--) {
|
---|
| 2896 | + dvb_dmx_swfilter_packet(demux, buf);
|
---|
| 2897 | + }
|
---|
| 2898 | +}
|
---|
| 2899 | diff -Naur gcc-4.8.2.orig/gcc/testsuite/gcc.dg/torture/pr58779.c gcc-4.8.2/gcc/testsuite/gcc.dg/torture/pr58779.c
|
---|
| 2900 | --- gcc-4.8.2.orig/gcc/testsuite/gcc.dg/torture/pr58779.c 1970-01-01 00:00:00.000000000 +0000
|
---|
| 2901 | +++ gcc-4.8.2/gcc/testsuite/gcc.dg/torture/pr58779.c 2013-11-01 16:12:34.223836702 +0000
|
---|
| 2902 | @@ -0,0 +1,12 @@
|
---|
| 2903 | +/* { dg-do run } */
|
---|
| 2904 | +
|
---|
| 2905 | +int a, c;
|
---|
| 2906 | +
|
---|
| 2907 | +int main ()
|
---|
| 2908 | +{
|
---|
| 2909 | + int e = -1;
|
---|
| 2910 | + short d = (c <= 0) ^ e;
|
---|
| 2911 | + if ((unsigned int) a - (a || d) <= (unsigned int) a)
|
---|
[2e59d11] | 2912 | + __builtin_abort ();
|
---|
[88af5df] | 2913 | + return 0;
|
---|
| 2914 | +}
|
---|
[2e59d11] | 2915 | diff -Naur gcc-4.8.2.orig/gcc/testsuite/gcc.dg/torture/pr58830.c gcc-4.8.2/gcc/testsuite/gcc.dg/torture/pr58830.c
|
---|
| 2916 | --- gcc-4.8.2.orig/gcc/testsuite/gcc.dg/torture/pr58830.c 1970-01-01 00:00:00.000000000 +0000
|
---|
| 2917 | +++ gcc-4.8.2/gcc/testsuite/gcc.dg/torture/pr58830.c 2013-11-01 16:12:34.223836702 +0000
|
---|
| 2918 | @@ -0,0 +1,42 @@
|
---|
| 2919 | +/* { dg-do run } */
|
---|
| 2920 | +/* { dg-additional-options "-ftree-pre -ftree-partial-pre" } */
|
---|
| 2921 | +
|
---|
| 2922 | +extern void abort (void);
|
---|
| 2923 | +
|
---|
| 2924 | +int b, c, d, f, g, h, i, j[6], *l = &b, *m, n, *o, r;
|
---|
| 2925 | +char k;
|
---|
| 2926 | +
|
---|
| 2927 | +static int
|
---|
| 2928 | +foo ()
|
---|
| 2929 | +{
|
---|
| 2930 | + char *p = &k;
|
---|
| 2931 | +
|
---|
| 2932 | + for (; d; d++)
|
---|
| 2933 | + if (i)
|
---|
| 2934 | + h = 0;
|
---|
| 2935 | + else
|
---|
| 2936 | + h = c || (r = 0);
|
---|
| 2937 | +
|
---|
| 2938 | + for (f = 0; f < 2; f++)
|
---|
| 2939 | + {
|
---|
| 2940 | + unsigned int q;
|
---|
| 2941 | + *l = 0;
|
---|
| 2942 | + if (n)
|
---|
| 2943 | + *m = g;
|
---|
| 2944 | + if (g)
|
---|
| 2945 | + o = 0;
|
---|
| 2946 | + for (q = -8; q >= 5; q++)
|
---|
| 2947 | + (*p)--;
|
---|
| 2948 | + }
|
---|
| 2949 | +
|
---|
| 2950 | + return 0;
|
---|
| 2951 | +}
|
---|
| 2952 | +
|
---|
| 2953 | +int
|
---|
| 2954 | +main ()
|
---|
| 2955 | +{
|
---|
| 2956 | + foo ();
|
---|
| 2957 | + if (j[j[j[j[j[j[j[j[j[j[j[j[j[j[j[j[j[j[j[j[j[j[j[j[j[j[j[j[j[j[j[j[j[j[j[j[j[j[j[j[j[j[0]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] ^ (k & 15)] != 0)
|
---|
[88af5df] | 2958 | + abort ();
|
---|
| 2959 | + return 0;
|
---|
| 2960 | +}
|
---|
| 2961 | diff -Naur gcc-4.8.2.orig/gcc/testsuite/gcc.target/arm/require-pic-register-loc.c gcc-4.8.2/gcc/testsuite/gcc.target/arm/require-pic-register-loc.c
|
---|
| 2962 | --- gcc-4.8.2.orig/gcc/testsuite/gcc.target/arm/require-pic-register-loc.c 1970-01-01 00:00:00.000000000 +0000
|
---|
| 2963 | +++ gcc-4.8.2/gcc/testsuite/gcc.target/arm/require-pic-register-loc.c 2013-11-01 16:12:34.223836702 +0000
|
---|
| 2964 | @@ -0,0 +1,29 @@
|
---|
| 2965 | +/* { dg-do compile } */
|
---|
| 2966 | +/* { dg-options "-g -fPIC" } */
|
---|
| 2967 | +
|
---|
| 2968 | +void *v;
|
---|
| 2969 | +void a (void *x) { }
|
---|
| 2970 | +void b (void) { }
|
---|
| 2971 | + /* line 7. */
|
---|
| 2972 | +int /* line 8. */
|
---|
| 2973 | +main (int argc) /* line 9. */
|
---|
| 2974 | +{ /* line 10. */
|
---|
| 2975 | + if (argc == 12345) /* line 11. */
|
---|
| 2976 | + {
|
---|
| 2977 | + a (v);
|
---|
| 2978 | + return 1;
|
---|
| 2979 | + }
|
---|
| 2980 | + b ();
|
---|
| 2981 | +
|
---|
| 2982 | + return 0;
|
---|
| 2983 | +}
|
---|
| 2984 | +
|
---|
| 2985 | +/* { dg-final { scan-assembler-not "\.loc 1 7 0" } } */
|
---|
| 2986 | +/* { dg-final { scan-assembler-not "\.loc 1 8 0" } } */
|
---|
| 2987 | +/* { dg-final { scan-assembler-not "\.loc 1 9 0" } } */
|
---|
| 2988 | +
|
---|
| 2989 | +/* The loc at the start of the prologue. */
|
---|
| 2990 | +/* { dg-final { scan-assembler-times "\.loc 1 10 0" 1 } } */
|
---|
| 2991 | +
|
---|
| 2992 | +/* The loc at the end of the prologue, with the first user line. */
|
---|
| 2993 | +/* { dg-final { scan-assembler-times "\.loc 1 11 0" 1 } } */
|
---|
| 2994 | diff -Naur gcc-4.8.2.orig/gcc/testsuite/gcc.target/i386/pr30315.c gcc-4.8.2/gcc/testsuite/gcc.target/i386/pr30315.c
|
---|
| 2995 | --- gcc-4.8.2.orig/gcc/testsuite/gcc.target/i386/pr30315.c 2007-08-14 14:39:24.000000000 +0000
|
---|
| 2996 | +++ gcc-4.8.2/gcc/testsuite/gcc.target/i386/pr30315.c 2013-11-01 16:12:34.223836702 +0000
|
---|
| 2997 | @@ -1,6 +1,6 @@
|
---|
| 2998 | /* { dg-do compile } */
|
---|
| 2999 | /* { dg-options "-O2" } */
|
---|
| 3000 | -/* { dg-final { scan-assembler-times "cmp" 4 } } */
|
---|
| 3001 | +/* { dg-final { scan-assembler-not "cmp" } } */
|
---|
| 3002 |
|
---|
| 3003 | extern void abort (void);
|
---|
| 3004 | int c;
|
---|
| 3005 | @@ -34,39 +34,10 @@
|
---|
| 3006 | }
|
---|
| 3007 | #define PLUSCCONLY(T, t) PLUSCCONLY1(T, t, a) PLUSCCONLY1(T, t, b)
|
---|
| 3008 |
|
---|
| 3009 | -#define MINUSCC(T, t) \
|
---|
| 3010 | -T minuscc##t (T a, T b) \
|
---|
| 3011 | -{ \
|
---|
| 3012 | - T difference = a - b; \
|
---|
| 3013 | - if (difference > a) \
|
---|
| 3014 | - abort (); \
|
---|
| 3015 | - return difference; \
|
---|
| 3016 | -}
|
---|
| 3017 | -
|
---|
| 3018 | -#define DECCC(T, t) \
|
---|
| 3019 | -T deccc##t (T a, T b) \
|
---|
| 3020 | -{ \
|
---|
| 3021 | - T difference = a - b; \
|
---|
| 3022 | - if (difference > a) \
|
---|
| 3023 | - c --; \
|
---|
| 3024 | - return difference; \
|
---|
| 3025 | -}
|
---|
| 3026 | -
|
---|
| 3027 | -#define MINUSCCONLY(T, t) \
|
---|
| 3028 | -void minuscconly##t (T a, T b) \
|
---|
| 3029 | -{ \
|
---|
| 3030 | - T difference = a - b; \
|
---|
| 3031 | - if (difference > a) \
|
---|
| 3032 | - abort (); \
|
---|
| 3033 | -}
|
---|
| 3034 | -
|
---|
| 3035 | #define TEST(T, t) \
|
---|
| 3036 | PLUSCC(T, t) \
|
---|
| 3037 | PLUSCCONLY(T, t) \
|
---|
| 3038 | - INCCC(T, t) \
|
---|
| 3039 | - MINUSCC(T, t) \
|
---|
| 3040 | - MINUSCCONLY(T, t) \
|
---|
| 3041 | - DECCC(T, t)
|
---|
| 3042 | + INCCC(T, t)
|
---|
| 3043 |
|
---|
| 3044 | TEST (unsigned long, l)
|
---|
| 3045 | TEST (unsigned int, i)
|
---|
| 3046 | @@ -84,14 +55,3 @@
|
---|
| 3047 |
|
---|
| 3048 | PLUSCCZEXT(a)
|
---|
| 3049 | PLUSCCZEXT(b)
|
---|
| 3050 | -
|
---|
| 3051 | -#define MINUSCCZEXT \
|
---|
| 3052 | -unsigned long minuscczext (unsigned int a, unsigned int b) \
|
---|
| 3053 | -{ \
|
---|
| 3054 | - unsigned int difference = a - b; \
|
---|
| 3055 | - if (difference > a) \
|
---|
| 3056 | - abort (); \
|
---|
| 3057 | - return difference; \
|
---|
[2e59d11] | 3058 | -}
|
---|
[88af5df] | 3059 | -
|
---|
| 3060 | -MINUSCCZEXT
|
---|
[2e59d11] | 3061 | diff -Naur gcc-4.8.2.orig/gcc/testsuite/gcc.target/sh/pr54089-3.c gcc-4.8.2/gcc/testsuite/gcc.target/sh/pr54089-3.c
|
---|
| 3062 | --- gcc-4.8.2.orig/gcc/testsuite/gcc.target/sh/pr54089-3.c 2012-09-10 20:35:25.000000000 +0000
|
---|
| 3063 | +++ gcc-4.8.2/gcc/testsuite/gcc.target/sh/pr54089-3.c 2013-11-01 16:12:34.223836702 +0000
|
---|
| 3064 | @@ -5,7 +5,7 @@
|
---|
| 3065 | /* { dg-options "-O1" } */
|
---|
| 3066 | /* { dg-skip-if "" { "sh*-*-*" } { "*" } { "-m1*" "-m2" "-m2e*" } } */
|
---|
| 3067 | /* { dg-final { scan-assembler-not "and" } } */
|
---|
| 3068 | -/* { dg-final { scan-assembler-not "31" } } */
|
---|
| 3069 | +/* { dg-final { scan-assembler-not "#31" } } */
|
---|
| 3070 |
|
---|
[88af5df] | 3071 | int
|
---|
| 3072 | test00 (unsigned int a, int* b, int c, int* d, unsigned int e)
|
---|
[2e59d11] | 3073 | diff -Naur gcc-4.8.2.orig/gcc/tree-ssa-pre.c gcc-4.8.2/gcc/tree-ssa-pre.c
|
---|
| 3074 | --- gcc-4.8.2.orig/gcc/tree-ssa-pre.c 2013-02-19 06:43:34.000000000 +0000
|
---|
| 3075 | +++ gcc-4.8.2/gcc/tree-ssa-pre.c 2013-11-01 16:12:34.227837390 +0000
|
---|
| 3076 | @@ -3664,6 +3664,12 @@
|
---|
| 3077 | if (dump_file && dump_flags & TDF_DETAILS)
|
---|
| 3078 | fprintf (dump_file, "Starting insert iteration %d\n", num_iterations);
|
---|
| 3079 | new_stuff = insert_aux (ENTRY_BLOCK_PTR);
|
---|
| 3080 | +
|
---|
| 3081 | + /* Clear the NEW sets before the next iteration. We have already
|
---|
| 3082 | + fully propagated its contents. */
|
---|
| 3083 | + if (new_stuff)
|
---|
| 3084 | + FOR_ALL_BB (bb)
|
---|
| 3085 | + bitmap_set_free (NEW_SETS (bb));
|
---|
| 3086 | }
|
---|
[88af5df] | 3087 | statistics_histogram_event (cfun, "insert iterations", num_iterations);
|
---|
| 3088 | }
|
---|
[2e59d11] | 3089 | diff -Naur gcc-4.8.2.orig/gcc/tree-ssa-tail-merge.c gcc-4.8.2/gcc/tree-ssa-tail-merge.c
|
---|
| 3090 | --- gcc-4.8.2.orig/gcc/tree-ssa-tail-merge.c 2013-01-31 08:52:56.000000000 +0000
|
---|
| 3091 | +++ gcc-4.8.2/gcc/tree-ssa-tail-merge.c 2013-11-01 16:12:34.231838079 +0000
|
---|
| 3092 | @@ -297,7 +297,8 @@
|
---|
| 3093 | tree val;
|
---|
| 3094 | def_operand_p def_p;
|
---|
| 3095 |
|
---|
| 3096 | - if (gimple_has_side_effects (stmt))
|
---|
| 3097 | + if (gimple_has_side_effects (stmt)
|
---|
| 3098 | + || gimple_vdef (stmt) != NULL_TREE)
|
---|
| 3099 | return false;
|
---|
[88af5df] | 3100 |
|
---|
| 3101 | def_p = SINGLE_SSA_DEF_OPERAND (stmt, SSA_OP_DEF);
|
---|
[2e59d11] | 3102 | diff -Naur gcc-4.8.2.orig/gcc/version.c gcc-4.8.2/gcc/version.c
|
---|
| 3103 | --- gcc-4.8.2.orig/gcc/version.c 2013-01-10 20:38:27.000000000 +0000
|
---|
| 3104 | +++ gcc-4.8.2/gcc/version.c 2013-11-01 16:12:34.231838079 +0000
|
---|
| 3105 | @@ -32,4 +32,4 @@
|
---|
| 3106 | Makefile. */
|
---|
[88af5df] | 3107 |
|
---|
[2e59d11] | 3108 | const char version_string[] = BASEVER DATESTAMP DEVPHASE REVISION;
|
---|
[88af5df] | 3109 | -const char pkgversion_string[] = PKGVERSION;
|
---|
| 3110 | +const char pkgversion_string[] = "(GCC for Cross-LFS 4.8.2.20131101) ";
|
---|
[2e59d11] | 3111 | diff -Naur gcc-4.8.2.orig/libffi/doc/libffi.info gcc-4.8.2/libffi/doc/libffi.info
|
---|
| 3112 | --- gcc-4.8.2.orig/libffi/doc/libffi.info 2013-10-16 08:21:34.000000000 +0000
|
---|
| 3113 | +++ gcc-4.8.2/libffi/doc/libffi.info 1970-01-01 00:00:00.000000000 +0000
|
---|
| 3114 | @@ -1,614 +0,0 @@
|
---|
| 3115 | -This is libffi.info, produced by makeinfo version 5.1 from libffi.texi.
|
---|
| 3116 | -
|
---|
| 3117 | -This manual is for Libffi, a portable foreign-function interface
|
---|
| 3118 | -library.
|
---|
| 3119 | -
|
---|
| 3120 | - Copyright (C) 2008, 2010, 2011 Red Hat, Inc.
|
---|
| 3121 | -
|
---|
| 3122 | - Permission is granted to copy, distribute and/or modify this
|
---|
| 3123 | - document under the terms of the GNU General Public License as
|
---|
| 3124 | - published by the Free Software Foundation; either version 2, or (at
|
---|
| 3125 | - your option) any later version. A copy of the license is included
|
---|
| 3126 | - in the section entitled "GNU General Public License".
|
---|
| 3127 | -
|
---|
| 3128 | -INFO-DIR-SECTION Development
|
---|
| 3129 | -START-INFO-DIR-ENTRY
|
---|
| 3130 | -* libffi: (libffi). Portable foreign-function interface library.
|
---|
| 3131 | -END-INFO-DIR-ENTRY
|
---|
| 3132 | -
|
---|
| 3133 | -
|
---|
| 3134 | -File: libffi.info, Node: Top, Next: Introduction, Up: (dir)
|
---|
| 3135 | -
|
---|
| 3136 | -libffi
|
---|
| 3137 | -******
|
---|
| 3138 | -
|
---|
| 3139 | -This manual is for Libffi, a portable foreign-function interface
|
---|
| 3140 | -library.
|
---|
| 3141 | -
|
---|
| 3142 | - Copyright (C) 2008, 2010, 2011 Red Hat, Inc.
|
---|
| 3143 | -
|
---|
| 3144 | - Permission is granted to copy, distribute and/or modify this
|
---|
| 3145 | - document under the terms of the GNU General Public License as
|
---|
| 3146 | - published by the Free Software Foundation; either version 2, or (at
|
---|
| 3147 | - your option) any later version. A copy of the license is included
|
---|
| 3148 | - in the section entitled "GNU General Public License".
|
---|
| 3149 | -
|
---|
| 3150 | -* Menu:
|
---|
| 3151 | -
|
---|
| 3152 | -* Introduction:: What is libffi?
|
---|
| 3153 | -* Using libffi:: How to use libffi.
|
---|
| 3154 | -* Missing Features:: Things libffi can't do.
|
---|
| 3155 | -* Index:: Index.
|
---|
| 3156 | -
|
---|
| 3157 | -
|
---|
| 3158 | -File: libffi.info, Node: Introduction, Next: Using libffi, Prev: Top, Up: Top
|
---|
| 3159 | -
|
---|
| 3160 | -1 What is libffi?
|
---|
| 3161 | -*****************
|
---|
| 3162 | -
|
---|
| 3163 | -Compilers for high level languages generate code that follow certain
|
---|
| 3164 | -conventions. These conventions are necessary, in part, for separate
|
---|
| 3165 | -compilation to work. One such convention is the "calling convention".
|
---|
| 3166 | -The calling convention is a set of assumptions made by the compiler
|
---|
| 3167 | -about where function arguments will be found on entry to a function. A
|
---|
| 3168 | -calling convention also specifies where the return value for a function
|
---|
| 3169 | -is found. The calling convention is also sometimes called the "ABI" or
|
---|
| 3170 | -"Application Binary Interface".
|
---|
| 3171 | -
|
---|
| 3172 | - Some programs may not know at the time of compilation what arguments
|
---|
| 3173 | -are to be passed to a function. For instance, an interpreter may be
|
---|
| 3174 | -told at run-time about the number and types of arguments used to call a
|
---|
| 3175 | -given function. 'Libffi' can be used in such programs to provide a
|
---|
| 3176 | -bridge from the interpreter program to compiled code.
|
---|
| 3177 | -
|
---|
| 3178 | - The 'libffi' library provides a portable, high level programming
|
---|
| 3179 | -interface to various calling conventions. This allows a programmer to
|
---|
| 3180 | -call any function specified by a call interface description at run time.
|
---|
| 3181 | -
|
---|
| 3182 | - FFI stands for Foreign Function Interface. A foreign function
|
---|
| 3183 | -interface is the popular name for the interface that allows code written
|
---|
| 3184 | -in one language to call code written in another language. The 'libffi'
|
---|
| 3185 | -library really only provides the lowest, machine dependent layer of a
|
---|
| 3186 | -fully featured foreign function interface. A layer must exist above
|
---|
| 3187 | -'libffi' that handles type conversions for values passed between the two
|
---|
| 3188 | -languages.
|
---|
| 3189 | -
|
---|
| 3190 | -
|
---|
| 3191 | -File: libffi.info, Node: Using libffi, Next: Missing Features, Prev: Introduction, Up: Top
|
---|
| 3192 | -
|
---|
| 3193 | -2 Using libffi
|
---|
| 3194 | -**************
|
---|
| 3195 | -
|
---|
| 3196 | -* Menu:
|
---|
| 3197 | -
|
---|
| 3198 | -* The Basics:: The basic libffi API.
|
---|
| 3199 | -* Simple Example:: A simple example.
|
---|
| 3200 | -* Types:: libffi type descriptions.
|
---|
| 3201 | -* Multiple ABIs:: Different passing styles on one platform.
|
---|
| 3202 | -* The Closure API:: Writing a generic function.
|
---|
| 3203 | -* Closure Example:: A closure example.
|
---|
| 3204 | -
|
---|
| 3205 | -
|
---|
| 3206 | -File: libffi.info, Node: The Basics, Next: Simple Example, Up: Using libffi
|
---|
| 3207 | -
|
---|
| 3208 | -2.1 The Basics
|
---|
| 3209 | -==============
|
---|
| 3210 | -
|
---|
| 3211 | -'Libffi' assumes that you have a pointer to the function you wish to
|
---|
| 3212 | -call and that you know the number and types of arguments to pass it, as
|
---|
| 3213 | -well as the return type of the function.
|
---|
| 3214 | -
|
---|
| 3215 | - The first thing you must do is create an 'ffi_cif' object that
|
---|
| 3216 | -matches the signature of the function you wish to call. This is a
|
---|
| 3217 | -separate step because it is common to make multiple calls using a single
|
---|
| 3218 | -'ffi_cif'. The "cif" in 'ffi_cif' stands for Call InterFace. To
|
---|
| 3219 | -prepare a call interface object, use the function 'ffi_prep_cif'.
|
---|
| 3220 | -
|
---|
| 3221 | - -- Function: ffi_status ffi_prep_cif (ffi_cif *CIF, ffi_abi ABI,
|
---|
| 3222 | - unsigned int NARGS, ffi_type *RTYPE, ffi_type **ARGTYPES)
|
---|
| 3223 | - This initializes CIF according to the given parameters.
|
---|
| 3224 | -
|
---|
| 3225 | - ABI is the ABI to use; normally 'FFI_DEFAULT_ABI' is what you want.
|
---|
| 3226 | - *note Multiple ABIs:: for more information.
|
---|
| 3227 | -
|
---|
| 3228 | - NARGS is the number of arguments that this function accepts.
|
---|
| 3229 | -
|
---|
| 3230 | - RTYPE is a pointer to an 'ffi_type' structure that describes the
|
---|
| 3231 | - return type of the function. *Note Types::.
|
---|
| 3232 | -
|
---|
| 3233 | - ARGTYPES is a vector of 'ffi_type' pointers. ARGTYPES must have
|
---|
| 3234 | - NARGS elements. If NARGS is 0, this argument is ignored.
|
---|
| 3235 | -
|
---|
| 3236 | - 'ffi_prep_cif' returns a 'libffi' status code, of type
|
---|
| 3237 | - 'ffi_status'. This will be either 'FFI_OK' if everything worked
|
---|
| 3238 | - properly; 'FFI_BAD_TYPEDEF' if one of the 'ffi_type' objects is
|
---|
| 3239 | - incorrect; or 'FFI_BAD_ABI' if the ABI parameter is invalid.
|
---|
| 3240 | -
|
---|
| 3241 | - If the function being called is variadic (varargs) then
|
---|
| 3242 | -'ffi_prep_cif_var' must be used instead of 'ffi_prep_cif'.
|
---|
| 3243 | -
|
---|
| 3244 | - -- Function: ffi_status ffi_prep_cif_var (ffi_cif *CIF, ffi_abi varabi,
|
---|
| 3245 | - unsigned int NFIXEDARGS, unsigned int varntotalargs, ffi_type
|
---|
| 3246 | - *RTYPE, ffi_type **ARGTYPES)
|
---|
| 3247 | - This initializes CIF according to the given parameters for a call
|
---|
| 3248 | - to a variadic function. In general it's operation is the same as
|
---|
| 3249 | - for 'ffi_prep_cif' except that:
|
---|
| 3250 | -
|
---|
| 3251 | - NFIXEDARGS is the number of fixed arguments, prior to any variadic
|
---|
| 3252 | - arguments. It must be greater than zero.
|
---|
| 3253 | -
|
---|
| 3254 | - NTOTALARGS the total number of arguments, including variadic and
|
---|
| 3255 | - fixed arguments.
|
---|
| 3256 | -
|
---|
| 3257 | - Note that, different cif's must be prepped for calls to the same
|
---|
| 3258 | - function when different numbers of arguments are passed.
|
---|
| 3259 | -
|
---|
| 3260 | - Also note that a call to 'ffi_prep_cif_var' with
|
---|
| 3261 | - NFIXEDARGS=NOTOTALARGS is NOT equivalent to a call to
|
---|
| 3262 | - 'ffi_prep_cif'.
|
---|
| 3263 | -
|
---|
| 3264 | - To call a function using an initialized 'ffi_cif', use the 'ffi_call'
|
---|
| 3265 | -function:
|
---|
| 3266 | -
|
---|
| 3267 | - -- Function: void ffi_call (ffi_cif *CIF, void *FN, void *RVALUE, void
|
---|
| 3268 | - **AVALUES)
|
---|
| 3269 | - This calls the function FN according to the description given in
|
---|
| 3270 | - CIF. CIF must have already been prepared using 'ffi_prep_cif'.
|
---|
| 3271 | -
|
---|
| 3272 | - RVALUE is a pointer to a chunk of memory that will hold the result
|
---|
| 3273 | - of the function call. This must be large enough to hold the result
|
---|
| 3274 | - and must be suitably aligned; it is the caller's responsibility to
|
---|
| 3275 | - ensure this. If CIF declares that the function returns 'void'
|
---|
| 3276 | - (using 'ffi_type_void'), then RVALUE is ignored. If RVALUE is
|
---|
| 3277 | - 'NULL', then the return value is discarded.
|
---|
| 3278 | -
|
---|
| 3279 | - AVALUES is a vector of 'void *' pointers that point to the memory
|
---|
| 3280 | - locations holding the argument values for a call. If CIF declares
|
---|
| 3281 | - that the function has no arguments (i.e., NARGS was 0), then
|
---|
| 3282 | - AVALUES is ignored. Note that argument values may be modified by
|
---|
| 3283 | - the callee (for instance, structs passed by value); the burden of
|
---|
| 3284 | - copying pass-by-value arguments is placed on the caller.
|
---|
| 3285 | -
|
---|
| 3286 | -
|
---|
| 3287 | -File: libffi.info, Node: Simple Example, Next: Types, Prev: The Basics, Up: Using libffi
|
---|
| 3288 | -
|
---|
| 3289 | -2.2 Simple Example
|
---|
| 3290 | -==================
|
---|
| 3291 | -
|
---|
| 3292 | -Here is a trivial example that calls 'puts' a few times.
|
---|
| 3293 | -
|
---|
| 3294 | - #include <stdio.h>
|
---|
| 3295 | - #include <ffi.h>
|
---|
| 3296 | -
|
---|
| 3297 | - int main()
|
---|
| 3298 | - {
|
---|
| 3299 | - ffi_cif cif;
|
---|
| 3300 | - ffi_type *args[1];
|
---|
| 3301 | - void *values[1];
|
---|
| 3302 | - char *s;
|
---|
| 3303 | - int rc;
|
---|
| 3304 | -
|
---|
| 3305 | - /* Initialize the argument info vectors */
|
---|
| 3306 | - args[0] = &ffi_type_pointer;
|
---|
| 3307 | - values[0] = &s;
|
---|
| 3308 | -
|
---|
| 3309 | - /* Initialize the cif */
|
---|
| 3310 | - if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
|
---|
| 3311 | - &ffi_type_uint, args) == FFI_OK)
|
---|
| 3312 | - {
|
---|
| 3313 | - s = "Hello World!";
|
---|
| 3314 | - ffi_call(&cif, puts, &rc, values);
|
---|
| 3315 | - /* rc now holds the result of the call to puts */
|
---|
| 3316 | -
|
---|
| 3317 | - /* values holds a pointer to the function's arg, so to
|
---|
| 3318 | - call puts() again all we need to do is change the
|
---|
| 3319 | - value of s */
|
---|
| 3320 | - s = "This is cool!";
|
---|
| 3321 | - ffi_call(&cif, puts, &rc, values);
|
---|
| 3322 | - }
|
---|
| 3323 | -
|
---|
| 3324 | - return 0;
|
---|
| 3325 | - }
|
---|
| 3326 | -
|
---|
| 3327 | -
|
---|
| 3328 | -File: libffi.info, Node: Types, Next: Multiple ABIs, Prev: Simple Example, Up: Using libffi
|
---|
| 3329 | -
|
---|
| 3330 | -2.3 Types
|
---|
| 3331 | -=========
|
---|
| 3332 | -
|
---|
| 3333 | -* Menu:
|
---|
| 3334 | -
|
---|
| 3335 | -* Primitive Types:: Built-in types.
|
---|
| 3336 | -* Structures:: Structure types.
|
---|
| 3337 | -* Type Example:: Structure type example.
|
---|
| 3338 | -
|
---|
| 3339 | -
|
---|
| 3340 | -File: libffi.info, Node: Primitive Types, Next: Structures, Up: Types
|
---|
| 3341 | -
|
---|
| 3342 | -2.3.1 Primitive Types
|
---|
| 3343 | ----------------------
|
---|
| 3344 | -
|
---|
| 3345 | -'Libffi' provides a number of built-in type descriptors that can be used
|
---|
| 3346 | -to describe argument and return types:
|
---|
| 3347 | -
|
---|
| 3348 | -'ffi_type_void'
|
---|
| 3349 | - The type 'void'. This cannot be used for argument types, only for
|
---|
| 3350 | - return values.
|
---|
| 3351 | -
|
---|
| 3352 | -'ffi_type_uint8'
|
---|
| 3353 | - An unsigned, 8-bit integer type.
|
---|
| 3354 | -
|
---|
| 3355 | -'ffi_type_sint8'
|
---|
| 3356 | - A signed, 8-bit integer type.
|
---|
| 3357 | -
|
---|
| 3358 | -'ffi_type_uint16'
|
---|
| 3359 | - An unsigned, 16-bit integer type.
|
---|
| 3360 | -
|
---|
| 3361 | -'ffi_type_sint16'
|
---|
| 3362 | - A signed, 16-bit integer type.
|
---|
| 3363 | -
|
---|
| 3364 | -'ffi_type_uint32'
|
---|
| 3365 | - An unsigned, 32-bit integer type.
|
---|
| 3366 | -
|
---|
| 3367 | -'ffi_type_sint32'
|
---|
| 3368 | - A signed, 32-bit integer type.
|
---|
| 3369 | -
|
---|
| 3370 | -'ffi_type_uint64'
|
---|
| 3371 | - An unsigned, 64-bit integer type.
|
---|
| 3372 | -
|
---|
| 3373 | -'ffi_type_sint64'
|
---|
| 3374 | - A signed, 64-bit integer type.
|
---|
| 3375 | -
|
---|
| 3376 | -'ffi_type_float'
|
---|
| 3377 | - The C 'float' type.
|
---|
| 3378 | -
|
---|
| 3379 | -'ffi_type_double'
|
---|
| 3380 | - The C 'double' type.
|
---|
| 3381 | -
|
---|
| 3382 | -'ffi_type_uchar'
|
---|
| 3383 | - The C 'unsigned char' type.
|
---|
| 3384 | -
|
---|
| 3385 | -'ffi_type_schar'
|
---|
| 3386 | - The C 'signed char' type. (Note that there is not an exact
|
---|
| 3387 | - equivalent to the C 'char' type in 'libffi'; ordinarily you should
|
---|
| 3388 | - either use 'ffi_type_schar' or 'ffi_type_uchar' depending on
|
---|
| 3389 | - whether 'char' is signed.)
|
---|
| 3390 | -
|
---|
| 3391 | -'ffi_type_ushort'
|
---|
| 3392 | - The C 'unsigned short' type.
|
---|
| 3393 | -
|
---|
| 3394 | -'ffi_type_sshort'
|
---|
| 3395 | - The C 'short' type.
|
---|
| 3396 | -
|
---|
| 3397 | -'ffi_type_uint'
|
---|
| 3398 | - The C 'unsigned int' type.
|
---|
| 3399 | -
|
---|
| 3400 | -'ffi_type_sint'
|
---|
| 3401 | - The C 'int' type.
|
---|
| 3402 | -
|
---|
| 3403 | -'ffi_type_ulong'
|
---|
| 3404 | - The C 'unsigned long' type.
|
---|
| 3405 | -
|
---|
| 3406 | -'ffi_type_slong'
|
---|
| 3407 | - The C 'long' type.
|
---|
| 3408 | -
|
---|
| 3409 | -'ffi_type_longdouble'
|
---|
| 3410 | - On platforms that have a C 'long double' type, this is defined. On
|
---|
| 3411 | - other platforms, it is not.
|
---|
| 3412 | -
|
---|
| 3413 | -'ffi_type_pointer'
|
---|
| 3414 | - A generic 'void *' pointer. You should use this for all pointers,
|
---|
| 3415 | - regardless of their real type.
|
---|
| 3416 | -
|
---|
| 3417 | - Each of these is of type 'ffi_type', so you must take the address
|
---|
| 3418 | -when passing to 'ffi_prep_cif'.
|
---|
| 3419 | -
|
---|
| 3420 | -
|
---|
| 3421 | -File: libffi.info, Node: Structures, Next: Type Example, Prev: Primitive Types, Up: Types
|
---|
| 3422 | -
|
---|
| 3423 | -2.3.2 Structures
|
---|
| 3424 | -----------------
|
---|
| 3425 | -
|
---|
| 3426 | -Although 'libffi' has no special support for unions or bit-fields, it is
|
---|
| 3427 | -perfectly happy passing structures back and forth. You must first
|
---|
| 3428 | -describe the structure to 'libffi' by creating a new 'ffi_type' object
|
---|
| 3429 | -for it.
|
---|
| 3430 | -
|
---|
| 3431 | - -- ffi_type:
|
---|
| 3432 | - The 'ffi_type' has the following members:
|
---|
| 3433 | - 'size_t size'
|
---|
| 3434 | - This is set by 'libffi'; you should initialize it to zero.
|
---|
| 3435 | -
|
---|
| 3436 | - 'unsigned short alignment'
|
---|
| 3437 | - This is set by 'libffi'; you should initialize it to zero.
|
---|
| 3438 | -
|
---|
| 3439 | - 'unsigned short type'
|
---|
| 3440 | - For a structure, this should be set to 'FFI_TYPE_STRUCT'.
|
---|
| 3441 | -
|
---|
| 3442 | - 'ffi_type **elements'
|
---|
| 3443 | - This is a 'NULL'-terminated array of pointers to 'ffi_type'
|
---|
| 3444 | - objects. There is one element per field of the struct.
|
---|
| 3445 | -
|
---|
| 3446 | -
|
---|
| 3447 | -File: libffi.info, Node: Type Example, Prev: Structures, Up: Types
|
---|
| 3448 | -
|
---|
| 3449 | -2.3.3 Type Example
|
---|
| 3450 | -------------------
|
---|
| 3451 | -
|
---|
| 3452 | -The following example initializes a 'ffi_type' object representing the
|
---|
| 3453 | -'tm' struct from Linux's 'time.h'.
|
---|
| 3454 | -
|
---|
| 3455 | - Here is how the struct is defined:
|
---|
| 3456 | -
|
---|
| 3457 | - struct tm {
|
---|
| 3458 | - int tm_sec;
|
---|
| 3459 | - int tm_min;
|
---|
| 3460 | - int tm_hour;
|
---|
| 3461 | - int tm_mday;
|
---|
| 3462 | - int tm_mon;
|
---|
| 3463 | - int tm_year;
|
---|
| 3464 | - int tm_wday;
|
---|
| 3465 | - int tm_yday;
|
---|
| 3466 | - int tm_isdst;
|
---|
| 3467 | - /* Those are for future use. */
|
---|
| 3468 | - long int __tm_gmtoff__;
|
---|
| 3469 | - __const char *__tm_zone__;
|
---|
| 3470 | - };
|
---|
| 3471 | -
|
---|
| 3472 | - Here is the corresponding code to describe this struct to 'libffi':
|
---|
| 3473 | -
|
---|
| 3474 | - {
|
---|
| 3475 | - ffi_type tm_type;
|
---|
| 3476 | - ffi_type *tm_type_elements[12];
|
---|
| 3477 | - int i;
|
---|
| 3478 | -
|
---|
| 3479 | - tm_type.size = tm_type.alignment = 0;
|
---|
| 3480 | - tm_type.elements = &tm_type_elements;
|
---|
| 3481 | -
|
---|
| 3482 | - for (i = 0; i < 9; i++)
|
---|
| 3483 | - tm_type_elements[i] = &ffi_type_sint;
|
---|
| 3484 | -
|
---|
| 3485 | - tm_type_elements[9] = &ffi_type_slong;
|
---|
| 3486 | - tm_type_elements[10] = &ffi_type_pointer;
|
---|
| 3487 | - tm_type_elements[11] = NULL;
|
---|
| 3488 | -
|
---|
| 3489 | - /* tm_type can now be used to represent tm argument types and
|
---|
| 3490 | - return types for ffi_prep_cif() */
|
---|
| 3491 | - }
|
---|
| 3492 | -
|
---|
| 3493 | -
|
---|
| 3494 | -File: libffi.info, Node: Multiple ABIs, Next: The Closure API, Prev: Types, Up: Using libffi
|
---|
| 3495 | -
|
---|
| 3496 | -2.4 Multiple ABIs
|
---|
| 3497 | -=================
|
---|
| 3498 | -
|
---|
| 3499 | -A given platform may provide multiple different ABIs at once. For
|
---|
| 3500 | -instance, the x86 platform has both 'stdcall' and 'fastcall' functions.
|
---|
| 3501 | -
|
---|
| 3502 | - 'libffi' provides some support for this. However, this is
|
---|
| 3503 | -necessarily platform-specific.
|
---|
| 3504 | -
|
---|
| 3505 | -
|
---|
| 3506 | -File: libffi.info, Node: The Closure API, Next: Closure Example, Prev: Multiple ABIs, Up: Using libffi
|
---|
| 3507 | -
|
---|
| 3508 | -2.5 The Closure API
|
---|
| 3509 | -===================
|
---|
| 3510 | -
|
---|
| 3511 | -'libffi' also provides a way to write a generic function - a function
|
---|
| 3512 | -that can accept and decode any combination of arguments. This can be
|
---|
| 3513 | -useful when writing an interpreter, or to provide wrappers for arbitrary
|
---|
| 3514 | -functions.
|
---|
| 3515 | -
|
---|
| 3516 | - This facility is called the "closure API". Closures are not supported
|
---|
| 3517 | -on all platforms; you can check the 'FFI_CLOSURES' define to determine
|
---|
| 3518 | -whether they are supported on the current platform.
|
---|
| 3519 | -
|
---|
| 3520 | - Because closures work by assembling a tiny function at runtime, they
|
---|
| 3521 | -require special allocation on platforms that have a non-executable heap.
|
---|
| 3522 | -Memory management for closures is handled by a pair of functions:
|
---|
| 3523 | -
|
---|
| 3524 | - -- Function: void *ffi_closure_alloc (size_t SIZE, void **CODE)
|
---|
| 3525 | - Allocate a chunk of memory holding SIZE bytes. This returns a
|
---|
| 3526 | - pointer to the writable address, and sets *CODE to the
|
---|
| 3527 | - corresponding executable address.
|
---|
| 3528 | -
|
---|
| 3529 | - SIZE should be sufficient to hold a 'ffi_closure' object.
|
---|
| 3530 | -
|
---|
| 3531 | - -- Function: void ffi_closure_free (void *WRITABLE)
|
---|
| 3532 | - Free memory allocated using 'ffi_closure_alloc'. The argument is
|
---|
| 3533 | - the writable address that was returned.
|
---|
| 3534 | -
|
---|
| 3535 | - Once you have allocated the memory for a closure, you must construct
|
---|
| 3536 | -a 'ffi_cif' describing the function call. Finally you can prepare the
|
---|
| 3537 | -closure function:
|
---|
| 3538 | -
|
---|
| 3539 | - -- Function: ffi_status ffi_prep_closure_loc (ffi_closure *CLOSURE,
|
---|
| 3540 | - ffi_cif *CIF, void (*FUN) (ffi_cif *CIF, void *RET, void
|
---|
| 3541 | - **ARGS, void *USER_DATA), void *USER_DATA, void *CODELOC)
|
---|
| 3542 | - Prepare a closure function.
|
---|
| 3543 | -
|
---|
| 3544 | - CLOSURE is the address of a 'ffi_closure' object; this is the
|
---|
| 3545 | - writable address returned by 'ffi_closure_alloc'.
|
---|
| 3546 | -
|
---|
| 3547 | - CIF is the 'ffi_cif' describing the function parameters.
|
---|
| 3548 | -
|
---|
| 3549 | - USER_DATA is an arbitrary datum that is passed, uninterpreted, to
|
---|
| 3550 | - your closure function.
|
---|
| 3551 | -
|
---|
| 3552 | - CODELOC is the executable address returned by 'ffi_closure_alloc'.
|
---|
| 3553 | -
|
---|
| 3554 | - FUN is the function which will be called when the closure is
|
---|
| 3555 | - invoked. It is called with the arguments:
|
---|
| 3556 | - CIF
|
---|
| 3557 | - The 'ffi_cif' passed to 'ffi_prep_closure_loc'.
|
---|
| 3558 | -
|
---|
| 3559 | - RET
|
---|
| 3560 | - A pointer to the memory used for the function's return value.
|
---|
| 3561 | - FUN must fill this, unless the function is declared as
|
---|
| 3562 | - returning 'void'.
|
---|
| 3563 | -
|
---|
| 3564 | - ARGS
|
---|
| 3565 | - A vector of pointers to memory holding the arguments to the
|
---|
| 3566 | - function.
|
---|
| 3567 | -
|
---|
| 3568 | - USER_DATA
|
---|
| 3569 | - The same USER_DATA that was passed to 'ffi_prep_closure_loc'.
|
---|
| 3570 | -
|
---|
| 3571 | - 'ffi_prep_closure_loc' will return 'FFI_OK' if everything went ok,
|
---|
| 3572 | - and something else on error.
|
---|
| 3573 | -
|
---|
| 3574 | - After calling 'ffi_prep_closure_loc', you can cast CODELOC to the
|
---|
| 3575 | - appropriate pointer-to-function type.
|
---|
| 3576 | -
|
---|
| 3577 | - You may see old code referring to 'ffi_prep_closure'. This function
|
---|
| 3578 | -is deprecated, as it cannot handle the need for separate writable and
|
---|
| 3579 | -executable addresses.
|
---|
| 3580 | -
|
---|
| 3581 | -
|
---|
| 3582 | -File: libffi.info, Node: Closure Example, Prev: The Closure API, Up: Using libffi
|
---|
| 3583 | -
|
---|
| 3584 | -2.6 Closure Example
|
---|
| 3585 | -===================
|
---|
| 3586 | -
|
---|
| 3587 | -A trivial example that creates a new 'puts' by binding 'fputs' with
|
---|
| 3588 | -'stdin'.
|
---|
| 3589 | -
|
---|
| 3590 | - #include <stdio.h>
|
---|
| 3591 | - #include <ffi.h>
|
---|
| 3592 | -
|
---|
| 3593 | - /* Acts like puts with the file given at time of enclosure. */
|
---|
| 3594 | - void puts_binding(ffi_cif *cif, unsigned int *ret, void* args[],
|
---|
| 3595 | - FILE *stream)
|
---|
| 3596 | - {
|
---|
| 3597 | - *ret = fputs(*(char **)args[0], stream);
|
---|
| 3598 | - }
|
---|
| 3599 | -
|
---|
| 3600 | - int main()
|
---|
| 3601 | - {
|
---|
| 3602 | - ffi_cif cif;
|
---|
| 3603 | - ffi_type *args[1];
|
---|
| 3604 | - ffi_closure *closure;
|
---|
| 3605 | -
|
---|
| 3606 | - int (*bound_puts)(char *);
|
---|
| 3607 | - int rc;
|
---|
| 3608 | -
|
---|
| 3609 | - /* Allocate closure and bound_puts */
|
---|
| 3610 | - closure = ffi_closure_alloc(sizeof(ffi_closure), &bound_puts);
|
---|
| 3611 | -
|
---|
| 3612 | - if (closure)
|
---|
| 3613 | - {
|
---|
| 3614 | - /* Initialize the argument info vectors */
|
---|
| 3615 | - args[0] = &ffi_type_pointer;
|
---|
| 3616 | -
|
---|
| 3617 | - /* Initialize the cif */
|
---|
| 3618 | - if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
|
---|
| 3619 | - &ffi_type_uint, args) == FFI_OK)
|
---|
| 3620 | - {
|
---|
| 3621 | - /* Initialize the closure, setting stream to stdout */
|
---|
| 3622 | - if (ffi_prep_closure_loc(closure, &cif, puts_binding,
|
---|
| 3623 | - stdout, bound_puts) == FFI_OK)
|
---|
| 3624 | - {
|
---|
| 3625 | - rc = bound_puts("Hello World!");
|
---|
| 3626 | - /* rc now holds the result of the call to fputs */
|
---|
| 3627 | - }
|
---|
| 3628 | - }
|
---|
| 3629 | - }
|
---|
| 3630 | -
|
---|
| 3631 | - /* Deallocate both closure, and bound_puts */
|
---|
| 3632 | - ffi_closure_free(closure);
|
---|
| 3633 | -
|
---|
| 3634 | - return 0;
|
---|
| 3635 | - }
|
---|
| 3636 | -
|
---|
| 3637 | -
|
---|
| 3638 | -File: libffi.info, Node: Missing Features, Next: Index, Prev: Using libffi, Up: Top
|
---|
| 3639 | -
|
---|
| 3640 | -3 Missing Features
|
---|
| 3641 | -******************
|
---|
| 3642 | -
|
---|
| 3643 | -'libffi' is missing a few features. We welcome patches to add support
|
---|
| 3644 | -for these.
|
---|
| 3645 | -
|
---|
| 3646 | - * Variadic closures.
|
---|
| 3647 | -
|
---|
| 3648 | - * There is no support for bit fields in structures.
|
---|
| 3649 | -
|
---|
| 3650 | - * The closure API is
|
---|
| 3651 | -
|
---|
| 3652 | - * The "raw" API is undocumented.
|
---|
| 3653 | -
|
---|
| 3654 | - Note that variadic support is very new and tested on a relatively
|
---|
| 3655 | -small number of platforms.
|
---|
| 3656 | -
|
---|
| 3657 | -
|
---|
| 3658 | -File: libffi.info, Node: Index, Prev: Missing Features, Up: Top
|
---|
| 3659 | -
|
---|
| 3660 | -Index
|
---|
| 3661 | -*****
|
---|
| 3662 | -
|
---|
| 3663 | -[index]
|
---|
| 3664 | -* Menu:
|
---|
| 3665 | -
|
---|
| 3666 | -* ABI: Introduction. (line 13)
|
---|
| 3667 | -* Application Binary Interface: Introduction. (line 13)
|
---|
| 3668 | -* calling convention: Introduction. (line 13)
|
---|
| 3669 | -* cif: The Basics. (line 14)
|
---|
| 3670 | -* closure API: The Closure API. (line 13)
|
---|
| 3671 | -* closures: The Closure API. (line 13)
|
---|
| 3672 | -* FFI: Introduction. (line 31)
|
---|
| 3673 | -* ffi_call: The Basics. (line 62)
|
---|
| 3674 | -* FFI_CLOSURES: The Closure API. (line 13)
|
---|
| 3675 | -* ffi_closure_alloc: The Closure API. (line 19)
|
---|
| 3676 | -* ffi_closure_free: The Closure API. (line 26)
|
---|
| 3677 | -* ffi_prep_cif: The Basics. (line 16)
|
---|
| 3678 | -* ffi_prep_cif_var: The Basics. (line 39)
|
---|
| 3679 | -* ffi_prep_closure_loc: The Closure API. (line 34)
|
---|
| 3680 | -* ffi_status: The Basics. (line 16)
|
---|
| 3681 | -* ffi_status <1>: The Basics. (line 39)
|
---|
| 3682 | -* ffi_status <2>: The Closure API. (line 34)
|
---|
| 3683 | -* ffi_type: Structures. (line 11)
|
---|
| 3684 | -* ffi_type_double: Primitive Types. (line 41)
|
---|
| 3685 | -* ffi_type_float: Primitive Types. (line 38)
|
---|
| 3686 | -* ffi_type_longdouble: Primitive Types. (line 71)
|
---|
| 3687 | -* ffi_type_pointer: Primitive Types. (line 75)
|
---|
| 3688 | -* ffi_type_schar: Primitive Types. (line 47)
|
---|
| 3689 | -* ffi_type_sint: Primitive Types. (line 62)
|
---|
| 3690 | -* ffi_type_sint16: Primitive Types. (line 23)
|
---|
| 3691 | -* ffi_type_sint32: Primitive Types. (line 29)
|
---|
| 3692 | -* ffi_type_sint64: Primitive Types. (line 35)
|
---|
| 3693 | -* ffi_type_sint8: Primitive Types. (line 17)
|
---|
| 3694 | -* ffi_type_slong: Primitive Types. (line 68)
|
---|
| 3695 | -* ffi_type_sshort: Primitive Types. (line 56)
|
---|
| 3696 | -* ffi_type_uchar: Primitive Types. (line 44)
|
---|
| 3697 | -* ffi_type_uint: Primitive Types. (line 59)
|
---|
| 3698 | -* ffi_type_uint16: Primitive Types. (line 20)
|
---|
| 3699 | -* ffi_type_uint32: Primitive Types. (line 26)
|
---|
| 3700 | -* ffi_type_uint64: Primitive Types. (line 32)
|
---|
| 3701 | -* ffi_type_uint8: Primitive Types. (line 14)
|
---|
| 3702 | -* ffi_type_ulong: Primitive Types. (line 65)
|
---|
| 3703 | -* ffi_type_ushort: Primitive Types. (line 53)
|
---|
| 3704 | -* ffi_type_void: Primitive Types. (line 10)
|
---|
| 3705 | -* Foreign Function Interface: Introduction. (line 31)
|
---|
| 3706 | -* void: The Basics. (line 62)
|
---|
| 3707 | -* void <1>: The Closure API. (line 19)
|
---|
| 3708 | -* void <2>: The Closure API. (line 26)
|
---|
| 3709 | -
|
---|
| 3710 | -
|
---|
| 3711 | -
|
---|
| 3712 | -Tag Table:
|
---|
| 3713 | -Node: Top682
|
---|
| 3714 | -Node: Introduction1429
|
---|
| 3715 | -Node: Using libffi3061
|
---|
| 3716 | -Node: The Basics3547
|
---|
| 3717 | -Node: Simple Example7187
|
---|
| 3718 | -Node: Types8214
|
---|
| 3719 | -Node: Primitive Types8497
|
---|
| 3720 | -Node: Structures10318
|
---|
| 3721 | -Node: Type Example11182
|
---|
| 3722 | -Node: Multiple ABIs12405
|
---|
| 3723 | -Node: The Closure API12776
|
---|
| 3724 | -Node: Closure Example15720
|
---|
| 3725 | -Node: Missing Features17279
|
---|
[88af5df] | 3726 | -Node: Index17732
|
---|
| 3727 | -
|
---|
| 3728 | -End Tag Table
|
---|
| 3729 | diff -Naur gcc-4.8.2.orig/libgo/Makefile.am gcc-4.8.2/libgo/Makefile.am
|
---|
| 3730 | --- gcc-4.8.2.orig/libgo/Makefile.am 2013-09-27 21:34:43.000000000 +0000
|
---|
| 3731 | +++ gcc-4.8.2/libgo/Makefile.am 2013-11-01 16:12:34.291848407 +0000
|
---|
| 3732 | @@ -424,6 +424,7 @@
|
---|
| 3733 | runtime/go-caller.c \
|
---|
| 3734 | runtime/go-callers.c \
|
---|
| 3735 | runtime/go-can-convert-interface.c \
|
---|
| 3736 | + runtime/go-cdiv.c \
|
---|
| 3737 | runtime/go-cgo.c \
|
---|
| 3738 | runtime/go-check-interface.c \
|
---|
| 3739 | runtime/go-construct-map.c \
|
---|
| 3740 | diff -Naur gcc-4.8.2.orig/libgo/Makefile.in gcc-4.8.2/libgo/Makefile.in
|
---|
| 3741 | --- gcc-4.8.2.orig/libgo/Makefile.in 2013-09-27 21:34:43.000000000 +0000
|
---|
| 3742 | +++ gcc-4.8.2/libgo/Makefile.in 2013-11-01 16:12:34.299849784 +0000
|
---|
| 3743 | @@ -195,7 +195,7 @@
|
---|
| 3744 | @LIBGO_IS_LINUX_TRUE@am__objects_5 = getncpu-linux.lo
|
---|
| 3745 | am__objects_6 = go-append.lo go-assert.lo go-assert-interface.lo \
|
---|
| 3746 | go-byte-array-to-string.lo go-breakpoint.lo go-caller.lo \
|
---|
| 3747 | - go-callers.lo go-can-convert-interface.lo go-cgo.lo \
|
---|
| 3748 | + go-callers.lo go-can-convert-interface.lo go-cdiv.lo go-cgo.lo \
|
---|
| 3749 | go-check-interface.lo go-construct-map.lo \
|
---|
| 3750 | go-convert-interface.lo go-copy.lo go-defer.lo \
|
---|
| 3751 | go-deferred-recover.lo go-eface-compare.lo \
|
---|
| 3752 | @@ -757,6 +757,7 @@
|
---|
| 3753 | runtime/go-caller.c \
|
---|
| 3754 | runtime/go-callers.c \
|
---|
| 3755 | runtime/go-can-convert-interface.c \
|
---|
| 3756 | + runtime/go-cdiv.c \
|
---|
| 3757 | runtime/go-cgo.c \
|
---|
| 3758 | runtime/go-check-interface.c \
|
---|
| 3759 | runtime/go-construct-map.c \
|
---|
| 3760 | @@ -2368,6 +2369,7 @@
|
---|
| 3761 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-caller.Plo@am__quote@
|
---|
| 3762 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-callers.Plo@am__quote@
|
---|
| 3763 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-can-convert-interface.Plo@am__quote@
|
---|
| 3764 | +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-cdiv.Plo@am__quote@
|
---|
| 3765 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-cgo.Plo@am__quote@
|
---|
| 3766 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-check-interface.Plo@am__quote@
|
---|
| 3767 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-construct-map.Plo@am__quote@
|
---|
| 3768 | @@ -2554,6 +2556,13 @@
|
---|
| 3769 | @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
---|
| 3770 | @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-can-convert-interface.lo `test -f 'runtime/go-can-convert-interface.c' || echo '$(srcdir)/'`runtime/go-can-convert-interface.c
|
---|
| 3771 |
|
---|
| 3772 | +go-cdiv.lo: runtime/go-cdiv.c
|
---|
| 3773 | +@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-cdiv.lo -MD -MP -MF $(DEPDIR)/go-cdiv.Tpo -c -o go-cdiv.lo `test -f 'runtime/go-cdiv.c' || echo '$(srcdir)/'`runtime/go-cdiv.c
|
---|
| 3774 | +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/go-cdiv.Tpo $(DEPDIR)/go-cdiv.Plo
|
---|
| 3775 | +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='runtime/go-cdiv.c' object='go-cdiv.lo' libtool=yes @AMDEPBACKSLASH@
|
---|
| 3776 | +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
---|
| 3777 | +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-cdiv.lo `test -f 'runtime/go-cdiv.c' || echo '$(srcdir)/'`runtime/go-cdiv.c
|
---|
| 3778 | +
|
---|
[2e59d11] | 3779 | go-cgo.lo: runtime/go-cgo.c
|
---|
[88af5df] | 3780 | @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-cgo.lo -MD -MP -MF $(DEPDIR)/go-cgo.Tpo -c -o go-cgo.lo `test -f 'runtime/go-cgo.c' || echo '$(srcdir)/'`runtime/go-cgo.c
|
---|
| 3781 | @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/go-cgo.Tpo $(DEPDIR)/go-cgo.Plo
|
---|
[2e59d11] | 3782 | diff -Naur gcc-4.8.2.orig/libgo/config.h.in gcc-4.8.2/libgo/config.h.in
|
---|
| 3783 | --- gcc-4.8.2.orig/libgo/config.h.in 2013-10-02 17:32:00.000000000 +0000
|
---|
| 3784 | +++ gcc-4.8.2/libgo/config.h.in 2013-11-01 16:12:34.235838767 +0000
|
---|
| 3785 | @@ -39,6 +39,9 @@
|
---|
| 3786 | /* Define to 1 if you have the `dl_iterate_phdr' function. */
|
---|
| 3787 | #undef HAVE_DL_ITERATE_PHDR
|
---|
| 3788 |
|
---|
| 3789 | +/* Define to 1 if you have the `dup3' function. */
|
---|
| 3790 | +#undef HAVE_DUP3
|
---|
| 3791 | +
|
---|
| 3792 | /* Define to 1 if you have the `epoll_create1' function. */
|
---|
| 3793 | #undef HAVE_EPOLL_CREATE1
|
---|
| 3794 |
|
---|
| 3795 | @@ -66,6 +69,9 @@
|
---|
| 3796 | /* Define if _Unwind_GetIPInfo is available. */
|
---|
| 3797 | #undef HAVE_GETIPINFO
|
---|
| 3798 |
|
---|
| 3799 | +/* Define to 1 if you have the `getxattr' function. */
|
---|
| 3800 | +#undef HAVE_GETXATTR
|
---|
| 3801 | +
|
---|
| 3802 | /* Define to 1 if you have the `inotify_add_watch' function. */
|
---|
| 3803 | #undef HAVE_INOTIFY_ADD_WATCH
|
---|
| 3804 |
|
---|
| 3805 | @@ -111,6 +117,9 @@
|
---|
| 3806 | /* Define to 1 if you have the <linux/rtnetlink.h> header file. */
|
---|
| 3807 | #undef HAVE_LINUX_RTNETLINK_H
|
---|
| 3808 |
|
---|
| 3809 | +/* Define to 1 if you have the `listxattr' function. */
|
---|
| 3810 | +#undef HAVE_LISTXATTR
|
---|
| 3811 | +
|
---|
| 3812 | /* Define to 1 if the system has the type `loff_t'. */
|
---|
| 3813 | #undef HAVE_LOFF_T
|
---|
| 3814 |
|
---|
| 3815 | @@ -171,6 +180,9 @@
|
---|
| 3816 | /* Define to 1 if you have the `pipe2' function. */
|
---|
| 3817 | #undef HAVE_PIPE2
|
---|
| 3818 |
|
---|
| 3819 | +/* Define to 1 if you have the `removexattr' function. */
|
---|
| 3820 | +#undef HAVE_REMOVEXATTR
|
---|
| 3821 | +
|
---|
| 3822 | /* Define to 1 if you have the `renameat' function. */
|
---|
| 3823 | #undef HAVE_RENAMEAT
|
---|
| 3824 |
|
---|
| 3825 | @@ -180,6 +192,9 @@
|
---|
| 3826 | /* Define to 1 if you have the `setenv' function. */
|
---|
| 3827 | #undef HAVE_SETENV
|
---|
| 3828 |
|
---|
| 3829 | +/* Define to 1 if you have the `setxattr' function. */
|
---|
| 3830 | +#undef HAVE_SETXATTR
|
---|
| 3831 | +
|
---|
| 3832 | /* Define to 1 if you have the `sinl' function. */
|
---|
[88af5df] | 3833 | #undef HAVE_SINL
|
---|
| 3834 |
|
---|
[2e59d11] | 3835 | diff -Naur gcc-4.8.2.orig/libgo/configure gcc-4.8.2/libgo/configure
|
---|
| 3836 | --- gcc-4.8.2.orig/libgo/configure 2013-10-02 17:32:00.000000000 +0000
|
---|
| 3837 | +++ gcc-4.8.2/libgo/configure 2013-11-01 16:12:34.243840144 +0000
|
---|
| 3838 | @@ -14700,7 +14700,7 @@
|
---|
| 3839 | fi
|
---|
| 3840 |
|
---|
| 3841 |
|
---|
| 3842 | -for ac_func in accept4 epoll_create1 faccessat fallocate fchmodat fchownat futimesat inotify_add_watch inotify_init inotify_init1 inotify_rm_watch mkdirat mknodat openat pipe2 renameat sync_file_range splice tee unlinkat unshare utimensat
|
---|
| 3843 | +for ac_func in accept4 dup3 epoll_create1 faccessat fallocate fchmodat fchownat futimesat getxattr inotify_add_watch inotify_init inotify_init1 inotify_rm_watch listxattr mkdirat mknodat openat pipe2 removexattr renameat setxattr sync_file_range splice tee unlinkat unshare utimensat
|
---|
| 3844 | do :
|
---|
[88af5df] | 3845 | as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
|
---|
| 3846 | ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
|
---|
[2e59d11] | 3847 | diff -Naur gcc-4.8.2.orig/libgo/configure.ac gcc-4.8.2/libgo/configure.ac
|
---|
| 3848 | --- gcc-4.8.2.orig/libgo/configure.ac 2013-10-02 17:32:00.000000000 +0000
|
---|
| 3849 | +++ gcc-4.8.2/libgo/configure.ac 2013-11-01 16:12:34.291848407 +0000
|
---|
| 3850 | @@ -503,7 +503,7 @@
|
---|
| 3851 | AM_CONDITIONAL(HAVE_STRERROR_R, test "$ac_cv_func_strerror_r" = yes)
|
---|
| 3852 | AM_CONDITIONAL(HAVE_WAIT4, test "$ac_cv_func_wait4" = yes)
|
---|
| 3853 |
|
---|
| 3854 | -AC_CHECK_FUNCS(accept4 epoll_create1 faccessat fallocate fchmodat fchownat futimesat inotify_add_watch inotify_init inotify_init1 inotify_rm_watch mkdirat mknodat openat pipe2 renameat sync_file_range splice tee unlinkat unshare utimensat)
|
---|
| 3855 | +AC_CHECK_FUNCS(accept4 dup3 epoll_create1 faccessat fallocate fchmodat fchownat futimesat getxattr inotify_add_watch inotify_init inotify_init1 inotify_rm_watch listxattr mkdirat mknodat openat pipe2 removexattr renameat setxattr sync_file_range splice tee unlinkat unshare utimensat)
|
---|
| 3856 | AC_TYPE_OFF_T
|
---|
[88af5df] | 3857 | AC_CHECK_TYPES([loff_t])
|
---|
| 3858 |
|
---|
[2e59d11] | 3859 | diff -Naur gcc-4.8.2.orig/libgo/go/syscall/libcall_linux.go gcc-4.8.2/libgo/go/syscall/libcall_linux.go
|
---|
| 3860 | --- gcc-4.8.2.orig/libgo/go/syscall/libcall_linux.go 2013-02-08 19:24:26.000000000 +0000
|
---|
| 3861 | +++ gcc-4.8.2/libgo/go/syscall/libcall_linux.go 2013-11-01 16:12:34.291848407 +0000
|
---|
| 3862 | @@ -190,6 +190,9 @@
|
---|
| 3863 | //sys Adjtimex(buf *Timex) (state int, err error)
|
---|
| 3864 | //adjtimex(buf *Timex) _C_int
|
---|
| 3865 |
|
---|
| 3866 | +//sysnb Dup3(oldfd int, newfd int, flags int) (err error)
|
---|
| 3867 | +//dup3(oldfd _C_int, newfd _C_int, flags _C_int) _C_int
|
---|
| 3868 | +
|
---|
| 3869 | //sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error)
|
---|
| 3870 | //faccessat(dirfd _C_int, pathname *byte, mode _C_int, flags _C_int) _C_int
|
---|
| 3871 |
|
---|
| 3872 | @@ -268,6 +271,9 @@
|
---|
| 3873 | return origlen - len(buf), count, names
|
---|
| 3874 | }
|
---|
| 3875 |
|
---|
| 3876 | +//sys Getxattr(path string, attr string, dest []byte) (sz int, err error)
|
---|
| 3877 | +//getxattr(path *byte, attr *byte, buf *byte, count Size_t) Ssize_t
|
---|
| 3878 | +
|
---|
| 3879 | //sys InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error)
|
---|
| 3880 | //inotify_add_watch(fd _C_int, pathname *byte, mask uint32) _C_int
|
---|
| 3881 |
|
---|
| 3882 | @@ -283,6 +289,9 @@
|
---|
| 3883 | //sys Klogctl(typ int, buf []byte) (n int, err error)
|
---|
| 3884 | //klogctl(typ _C_int, bufp *byte, len _C_int) _C_int
|
---|
| 3885 |
|
---|
| 3886 | +//sys Listxattr(path string, dest []byte) (sz int, err error)
|
---|
| 3887 | +//listxattr(path *byte, list *byte, size Size_t) Ssize_t
|
---|
| 3888 | +
|
---|
| 3889 | //sys Mkdirat(dirfd int, path string, mode uint32) (err error)
|
---|
| 3890 | //mkdirat(dirfd _C_int, path *byte, mode Mode_t) _C_int
|
---|
| 3891 |
|
---|
| 3892 | @@ -305,6 +314,9 @@
|
---|
| 3893 | //sys PivotRoot(newroot string, putold string) (err error)
|
---|
| 3894 | //pivot_root(newroot *byte, putold *byte) _C_int
|
---|
| 3895 |
|
---|
| 3896 | +//sys Removexattr(path string, attr string) (err error)
|
---|
| 3897 | +//removexattr(path *byte, name *byte) _C_int
|
---|
| 3898 | +
|
---|
| 3899 | //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
|
---|
| 3900 | //renameat(olddirfd _C_int, oldpath *byte, newdirfd _C_int, newpath *byte) _C_int
|
---|
| 3901 |
|
---|
| 3902 | @@ -338,6 +350,9 @@
|
---|
| 3903 | //sysnb Setresuid(ruid int, eguid int, suid int) (err error)
|
---|
| 3904 | //setresuid(ruid Uid_t, euid Uid_t, suid Uid_t) _C_int
|
---|
| 3905 |
|
---|
| 3906 | +//sys Setxattr(path string, attr string, data []byte, flags int) (err error)
|
---|
| 3907 | +//setxattr(path *byte, name *byte, value *byte, size Size_t, flags _C_int) _C_int
|
---|
| 3908 | +
|
---|
| 3909 | //sys splice(rfd int, roff *_loff_t, wfd int, woff *_loff_t, len int, flags int) (n int64, err error)
|
---|
[88af5df] | 3910 | //splice(rfd _C_int, roff *_loff_t, wfd _C_int, woff *_loff_t, len Size_t, flags _C_uint) Ssize_t
|
---|
| 3911 | func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) {
|
---|
[2e59d11] | 3912 | diff -Naur gcc-4.8.2.orig/libgo/go/syscall/libcall_posix.go gcc-4.8.2/libgo/go/syscall/libcall_posix.go
|
---|
| 3913 | --- gcc-4.8.2.orig/libgo/go/syscall/libcall_posix.go 2013-02-08 19:24:26.000000000 +0000
|
---|
| 3914 | +++ gcc-4.8.2/libgo/go/syscall/libcall_posix.go 2013-11-01 16:12:34.291848407 +0000
|
---|
| 3915 | @@ -238,6 +238,9 @@
|
---|
| 3916 | //sysnb Getppid() (ppid int)
|
---|
| 3917 | //getppid() Pid_t
|
---|
| 3918 |
|
---|
| 3919 | +//sys Getpriority(which int, who int) (prio int, err error)
|
---|
| 3920 | +//getpriority(which _C_int, who _C_int) _C_int
|
---|
| 3921 | +
|
---|
| 3922 | //sysnb Getrlimit(resource int, rlim *Rlimit) (err error)
|
---|
| 3923 | //getrlimit(resource _C_int, rlim *Rlimit) _C_int
|
---|
| 3924 |
|
---|
| 3925 | @@ -307,6 +310,9 @@
|
---|
| 3926 | //sysnb Setpgid(pid int, pgid int) (err error)
|
---|
| 3927 | //setpgid(pid Pid_t, pgid Pid_t) _C_int
|
---|
| 3928 |
|
---|
| 3929 | +//sys Setpriority(which int, who int, prio int) (err error)
|
---|
| 3930 | +//setpriority(which _C_int, who _C_int, prio _C_int) _C_int
|
---|
| 3931 | +
|
---|
| 3932 | //sysnb Setreuid(ruid int, euid int) (err error)
|
---|
[88af5df] | 3933 | //setreuid(ruid Uid_t, euid Uid_t) _C_int
|
---|
| 3934 |
|
---|
[2e59d11] | 3935 | diff -Naur gcc-4.8.2.orig/libgo/mksysinfo.sh gcc-4.8.2/libgo/mksysinfo.sh
|
---|
| 3936 | --- gcc-4.8.2.orig/libgo/mksysinfo.sh 2013-02-11 19:03:04.000000000 +0000
|
---|
| 3937 | +++ gcc-4.8.2/libgo/mksysinfo.sh 2013-11-01 16:12:34.299849784 +0000
|
---|
| 3938 | @@ -1035,6 +1035,10 @@
|
---|
| 3939 | grep '^const _LOCK_' gen-sysinfo.go |
|
---|
| 3940 | sed -e 's/^\(const \)_\(LOCK_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
|
---|
| 3941 |
|
---|
| 3942 | +# The PRIO constants.
|
---|
| 3943 | +grep '^const _PRIO_' gen-sysinfo.go | \
|
---|
| 3944 | + sed -e 's/^\(const \)_\(PRIO_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
|
---|
| 3945 | +
|
---|
| 3946 | # The GNU/Linux LINUX_REBOOT flags.
|
---|
[88af5df] | 3947 | grep '^const _LINUX_REBOOT_' gen-sysinfo.go |
|
---|
| 3948 | sed -e 's/^\(const \)_\(LINUX_REBOOT_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
|
---|
[2e59d11] | 3949 | diff -Naur gcc-4.8.2.orig/libgo/runtime/go-cdiv.c gcc-4.8.2/libgo/runtime/go-cdiv.c
|
---|
| 3950 | --- gcc-4.8.2.orig/libgo/runtime/go-cdiv.c 1970-01-01 00:00:00.000000000 +0000
|
---|
| 3951 | +++ gcc-4.8.2/libgo/runtime/go-cdiv.c 2013-11-01 16:12:34.299849784 +0000
|
---|
| 3952 | @@ -0,0 +1,46 @@
|
---|
| 3953 | +/* go-cdiv.c -- complex division routines
|
---|
| 3954 | +
|
---|
| 3955 | + Copyright 2013 The Go Authors. All rights reserved.
|
---|
| 3956 | + Use of this source code is governed by a BSD-style
|
---|
| 3957 | + license that can be found in the LICENSE file. */
|
---|
| 3958 | +
|
---|
| 3959 | +/* Calls to these functions are generated by the Go frontend for
|
---|
| 3960 | + division of complex64 or complex128. We use these because Go's
|
---|
| 3961 | + complex division expects slightly different results from the GCC
|
---|
| 3962 | + default. When dividing NaN+1.0i / 0+0i, Go expects NaN+NaNi but
|
---|
| 3963 | + GCC generates NaN+Infi. NaN+Infi seems wrong seems the rules of
|
---|
| 3964 | + C99 Annex G specify that if either side of a complex number is Inf,
|
---|
| 3965 | + the the whole number is Inf, but an operation involving NaN ought
|
---|
| 3966 | + to result in NaN, not Inf. */
|
---|
| 3967 | +
|
---|
| 3968 | +__complex float
|
---|
| 3969 | +__go_complex64_div (__complex float a, __complex float b)
|
---|
| 3970 | +{
|
---|
| 3971 | + if (__builtin_expect (b == 0+0i, 0))
|
---|
| 3972 | + {
|
---|
| 3973 | + if (!__builtin_isinff (__real__ a)
|
---|
| 3974 | + && !__builtin_isinff (__imag__ a)
|
---|
| 3975 | + && (__builtin_isnanf (__real__ a) || __builtin_isnanf (__imag__ a)))
|
---|
| 3976 | + {
|
---|
| 3977 | + /* Pass "1" to nanf to match math/bits.go. */
|
---|
| 3978 | + return __builtin_nanf("1") + __builtin_nanf("1")*1i;
|
---|
| 3979 | + }
|
---|
| 3980 | + }
|
---|
| 3981 | + return a / b;
|
---|
| 3982 | +}
|
---|
| 3983 | +
|
---|
| 3984 | +__complex double
|
---|
| 3985 | +__go_complex128_div (__complex double a, __complex double b)
|
---|
| 3986 | +{
|
---|
| 3987 | + if (__builtin_expect (b == 0+0i, 0))
|
---|
| 3988 | + {
|
---|
| 3989 | + if (!__builtin_isinf (__real__ a)
|
---|
| 3990 | + && !__builtin_isinf (__imag__ a)
|
---|
| 3991 | + && (__builtin_isnan (__real__ a) || __builtin_isnan (__imag__ a)))
|
---|
| 3992 | + {
|
---|
| 3993 | + /* Pass "1" to nan to match math/bits.go. */
|
---|
| 3994 | + return __builtin_nan("1") + __builtin_nan("1")*1i;
|
---|
| 3995 | + }
|
---|
| 3996 | + }
|
---|
[88af5df] | 3997 | + return a / b;
|
---|
| 3998 | +}
|
---|
[2e59d11] | 3999 | diff -Naur gcc-4.8.2.orig/libgo/runtime/go-make-slice.c gcc-4.8.2/libgo/runtime/go-make-slice.c
|
---|
| 4000 | --- gcc-4.8.2.orig/libgo/runtime/go-make-slice.c 2012-11-21 07:03:38.000000000 +0000
|
---|
| 4001 | +++ gcc-4.8.2/libgo/runtime/go-make-slice.c 2013-11-01 16:12:34.303850472 +0000
|
---|
| 4002 | @@ -34,7 +34,10 @@
|
---|
| 4003 | std = (const struct __go_slice_type *) td;
|
---|
| 4004 |
|
---|
| 4005 | ilen = (intgo) len;
|
---|
| 4006 | - if (ilen < 0 || (uintptr_t) ilen != len)
|
---|
| 4007 | + if (ilen < 0
|
---|
| 4008 | + || (uintptr_t) ilen != len
|
---|
| 4009 | + || (std->__element_type->__size > 0
|
---|
| 4010 | + && len > MaxMem / std->__element_type->__size))
|
---|
| 4011 | runtime_panicstring ("makeslice: len out of range");
|
---|
[88af5df] | 4012 |
|
---|
| 4013 | icap = (intgo) cap;
|
---|
[2e59d11] | 4014 | diff -Naur gcc-4.8.2.orig/libgo/runtime/go-nosys.c gcc-4.8.2/libgo/runtime/go-nosys.c
|
---|
| 4015 | --- gcc-4.8.2.orig/libgo/runtime/go-nosys.c 2013-01-29 20:52:43.000000000 +0000
|
---|
| 4016 | +++ gcc-4.8.2/libgo/runtime/go-nosys.c 2013-11-01 16:12:34.303850472 +0000
|
---|
| 4017 | @@ -43,6 +43,17 @@
|
---|
| 4018 | }
|
---|
| 4019 | #endif
|
---|
| 4020 |
|
---|
| 4021 | +#ifndef HAVE_DUP3
|
---|
| 4022 | +int
|
---|
| 4023 | +dup3 (int oldfd __attribute__ ((unused)),
|
---|
| 4024 | + int newfd __attribute__ ((unused)),
|
---|
| 4025 | + int flags __attribute__ ((unused)))
|
---|
| 4026 | +{
|
---|
| 4027 | + errno = ENOSYS;
|
---|
| 4028 | + return -1;
|
---|
| 4029 | +}
|
---|
| 4030 | +#endif
|
---|
| 4031 | +
|
---|
| 4032 | #ifndef HAVE_EPOLL_CREATE1
|
---|
| 4033 | int
|
---|
| 4034 | epoll_create1 (int flags __attribute__ ((unused)))
|
---|
| 4035 | @@ -112,6 +123,18 @@
|
---|
| 4036 | }
|
---|
| 4037 | #endif
|
---|
| 4038 |
|
---|
| 4039 | +#ifndef HAVE_GETXATTR
|
---|
| 4040 | +ssize_t
|
---|
| 4041 | +getxattr (const char *path __attribute__ ((unused)),
|
---|
| 4042 | + const char *name __attribute__ ((unused)),
|
---|
| 4043 | + void *value __attribute__ ((unused)),
|
---|
| 4044 | + size_t size __attribute__ ((unused)))
|
---|
| 4045 | +{
|
---|
| 4046 | + errno = ENOSYS;
|
---|
| 4047 | + return -1;
|
---|
| 4048 | +}
|
---|
| 4049 | +#endif
|
---|
| 4050 | +
|
---|
| 4051 | #ifndef HAVE_INOTIFY_ADD_WATCH
|
---|
| 4052 | int
|
---|
| 4053 | inotify_add_watch (int fd __attribute__ ((unused)),
|
---|
| 4054 | @@ -151,6 +174,17 @@
|
---|
| 4055 | }
|
---|
| 4056 | #endif
|
---|
| 4057 |
|
---|
| 4058 | +#ifndef HAVE_LISTXATTR
|
---|
| 4059 | +ssize_t
|
---|
| 4060 | +listxattr (const char *path __attribute__ ((unused)),
|
---|
| 4061 | + char *list __attribute__ ((unused)),
|
---|
| 4062 | + size_t size __attribute__ ((unused)))
|
---|
| 4063 | +{
|
---|
| 4064 | + errno = ENOSYS;
|
---|
| 4065 | + return -1;
|
---|
| 4066 | +}
|
---|
| 4067 | +#endif
|
---|
| 4068 | +
|
---|
| 4069 | #ifndef HAVE_MKDIRAT
|
---|
| 4070 | int
|
---|
| 4071 | mkdirat (int dirfd __attribute__ ((unused)),
|
---|
| 4072 | @@ -196,6 +230,16 @@
|
---|
| 4073 | }
|
---|
| 4074 | #endif
|
---|
| 4075 |
|
---|
| 4076 | +#ifndef HAVE_REMOVEXATTR
|
---|
| 4077 | +int
|
---|
| 4078 | +removexattr (const char *path __attribute__ ((unused)),
|
---|
| 4079 | + const char *name __attribute__ ((unused)))
|
---|
| 4080 | +{
|
---|
| 4081 | + errno = ENOSYS;
|
---|
| 4082 | + return -1;
|
---|
| 4083 | +}
|
---|
| 4084 | +#endif
|
---|
| 4085 | +
|
---|
| 4086 | #ifndef HAVE_RENAMEAT
|
---|
| 4087 | int
|
---|
| 4088 | renameat (int olddirfd __attribute__ ((unused)),
|
---|
| 4089 | @@ -205,6 +249,19 @@
|
---|
| 4090 | {
|
---|
| 4091 | errno = ENOSYS;
|
---|
| 4092 | return -1;
|
---|
| 4093 | +}
|
---|
| 4094 | +#endif
|
---|
| 4095 | +
|
---|
| 4096 | +#ifndef HAVE_SETXATTR
|
---|
| 4097 | +int
|
---|
| 4098 | +setxattr (const char *path __attribute__ ((unused)),
|
---|
| 4099 | + const char *name __attribute__ ((unused)),
|
---|
| 4100 | + const void *value __attribute__ ((unused)),
|
---|
| 4101 | + size_t size __attribute__ ((unused)),
|
---|
| 4102 | + int flags __attribute__ ((unused)))
|
---|
| 4103 | +{
|
---|
| 4104 | + errno = ENOSYS;
|
---|
| 4105 | + return -1;
|
---|
| 4106 | }
|
---|
[88af5df] | 4107 | #endif
|
---|
| 4108 |
|
---|
[2e59d11] | 4109 | diff -Naur gcc-4.8.2.orig/libgo/runtime/go-signal.c gcc-4.8.2/libgo/runtime/go-signal.c
|
---|
| 4110 | --- gcc-4.8.2.orig/libgo/runtime/go-signal.c 2013-07-23 04:42:18.000000000 +0000
|
---|
| 4111 | +++ gcc-4.8.2/libgo/runtime/go-signal.c 2013-11-01 16:12:34.303850472 +0000
|
---|
| 4112 | @@ -399,6 +399,9 @@
|
---|
| 4113 | {
|
---|
| 4114 | G *gp;
|
---|
| 4115 | M *mp;
|
---|
| 4116 | +#ifdef USING_SPLIT_STACK
|
---|
| 4117 | + void *stack_context[10];
|
---|
| 4118 | +#endif
|
---|
| 4119 |
|
---|
| 4120 | /* We are now running on the stack registered via sigaltstack.
|
---|
| 4121 | (Actually there is a small span of time between runtime_siginit
|
---|
| 4122 | @@ -409,7 +412,7 @@
|
---|
| 4123 | if (gp != NULL)
|
---|
| 4124 | {
|
---|
| 4125 | #ifdef USING_SPLIT_STACK
|
---|
| 4126 | - __splitstack_getcontext (&gp->stack_context[0]);
|
---|
| 4127 | + __splitstack_getcontext (&stack_context[0]);
|
---|
| 4128 | #endif
|
---|
| 4129 | }
|
---|
| 4130 |
|
---|
| 4131 | @@ -432,7 +435,7 @@
|
---|
| 4132 | if (gp != NULL)
|
---|
| 4133 | {
|
---|
| 4134 | #ifdef USING_SPLIT_STACK
|
---|
| 4135 | - __splitstack_setcontext (&gp->stack_context[0]);
|
---|
| 4136 | + __splitstack_setcontext (&stack_context[0]);
|
---|
| 4137 | #endif
|
---|
[88af5df] | 4138 | }
|
---|
| 4139 | }
|
---|
[2e59d11] | 4140 | diff -Naur gcc-4.8.2.orig/libitm/libitm.info gcc-4.8.2/libitm/libitm.info
|
---|
| 4141 | --- gcc-4.8.2.orig/libitm/libitm.info 2013-10-16 08:29:00.000000000 +0000
|
---|
| 4142 | +++ gcc-4.8.2/libitm/libitm.info 1970-01-01 00:00:00.000000000 +0000
|
---|
| 4143 | @@ -1,1293 +0,0 @@
|
---|
| 4144 | -This is libitm.info, produced by makeinfo version 5.1 from libitm.texi.
|
---|
| 4145 | -
|
---|
| 4146 | -Copyright (C) 2011-2013 Free Software Foundation, Inc.
|
---|
| 4147 | -
|
---|
| 4148 | - Permission is granted to copy, distribute and/or modify this document
|
---|
| 4149 | -under the terms of the GNU Free Documentation License, Version 1.2 or
|
---|
| 4150 | -any later version published by the Free Software Foundation; with no
|
---|
| 4151 | -Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A
|
---|
| 4152 | -copy of the license is included in the section entitled "GNU Free
|
---|
| 4153 | -Documentation License".
|
---|
| 4154 | -INFO-DIR-SECTION GNU Libraries
|
---|
| 4155 | -START-INFO-DIR-ENTRY
|
---|
| 4156 | -* libitm: (libitm). GNU Transactional Memory Library
|
---|
| 4157 | -END-INFO-DIR-ENTRY
|
---|
| 4158 | -
|
---|
| 4159 | - This manual documents the GNU Transactional Memory Library.
|
---|
| 4160 | -
|
---|
| 4161 | - Copyright (C) 2011-2013 Free Software Foundation, Inc.
|
---|
| 4162 | -
|
---|
| 4163 | - Permission is granted to copy, distribute and/or modify this document
|
---|
| 4164 | -under the terms of the GNU Free Documentation License, Version 1.2 or
|
---|
| 4165 | -any later version published by the Free Software Foundation; with no
|
---|
| 4166 | -Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A
|
---|
| 4167 | -copy of the license is included in the section entitled "GNU Free
|
---|
| 4168 | -Documentation License".
|
---|
| 4169 | -
|
---|
| 4170 | -
|
---|
| 4171 | -File: libitm.info, Node: Top, Next: Enabling libitm, Up: (dir)
|
---|
| 4172 | -
|
---|
| 4173 | -Introduction
|
---|
| 4174 | -************
|
---|
| 4175 | -
|
---|
| 4176 | -This manual documents the usage and internals of libitm, the GNU
|
---|
| 4177 | -Transactional Memory Library. It provides transaction support for
|
---|
| 4178 | -accesses to a process' memory, enabling easy-to-use synchronization of
|
---|
| 4179 | -accesses to shared memory by several threads.
|
---|
| 4180 | -
|
---|
| 4181 | -* Menu:
|
---|
| 4182 | -
|
---|
| 4183 | -* Enabling libitm:: How to enable libitm for your applications.
|
---|
| 4184 | -* C/C++ Language Constructs for TM::
|
---|
| 4185 | - Notes on the language-level interface supported
|
---|
| 4186 | - by gcc.
|
---|
| 4187 | -* The libitm ABI:: Notes on the external ABI provided by libitm.
|
---|
| 4188 | -* Internals:: Notes on libitm's internal synchronization.
|
---|
| 4189 | -* GNU Free Documentation License::
|
---|
| 4190 | - How you can copy and share this manual.
|
---|
| 4191 | -* Index:: Index of this documentation.
|
---|
| 4192 | -
|
---|
| 4193 | -
|
---|
| 4194 | -File: libitm.info, Node: Enabling libitm, Next: C/C++ Language Constructs for TM, Prev: Top, Up: Top
|
---|
| 4195 | -
|
---|
| 4196 | -1 Enabling libitm
|
---|
| 4197 | -*****************
|
---|
| 4198 | -
|
---|
| 4199 | -To activate support for TM in C/C++, the compile-time flag '-fgnu-tm'
|
---|
| 4200 | -must be specified. This enables TM language-level constructs such as
|
---|
| 4201 | -transaction statements (e.g., '__transaction_atomic', *note C/C++
|
---|
| 4202 | -Language Constructs for TM:: for details).
|
---|
| 4203 | -
|
---|
| 4204 | -
|
---|
| 4205 | -File: libitm.info, Node: C/C++ Language Constructs for TM, Next: The libitm ABI, Prev: Enabling libitm, Up: Top
|
---|
| 4206 | -
|
---|
| 4207 | -2 C/C++ Language Constructs for TM
|
---|
| 4208 | -**********************************
|
---|
| 4209 | -
|
---|
| 4210 | -Transactions are supported in C++ and C in the form of transaction
|
---|
| 4211 | -statements, transaction expressions, and function transactions. In the
|
---|
| 4212 | -following example, both 'a' and 'b' will be read and the difference will
|
---|
| 4213 | -be written to 'c', all atomically and isolated from other transactions:
|
---|
| 4214 | -
|
---|
| 4215 | - __transaction_atomic { c = a - b; }
|
---|
| 4216 | -
|
---|
| 4217 | - Therefore, another thread can use the following code to concurrently
|
---|
| 4218 | -update 'b' without ever causing 'c' to hold a negative value (and
|
---|
| 4219 | -without having to use other synchronization constructs such as locks or
|
---|
| 4220 | -C++11 atomics):
|
---|
| 4221 | -
|
---|
| 4222 | - __transaction_atomic { if (a > b) b++; }
|
---|
| 4223 | -
|
---|
| 4224 | - GCC follows the Draft Specification of Transactional Language
|
---|
| 4225 | -Constructs for C++ (v1.1)
|
---|
| 4226 | -(https://sites.google.com/site/tmforcplusplus/) in its implementation of
|
---|
| 4227 | -transactions.
|
---|
| 4228 | -
|
---|
| 4229 | - The precise semantics of transactions are defined in terms of the
|
---|
| 4230 | -C++11/C11 memory model (see the specification). Roughly, transactions
|
---|
| 4231 | -provide synchronization guarantees that are similar to what would be
|
---|
| 4232 | -guaranteed when using a single global lock as a guard for all
|
---|
| 4233 | -transactions. Note that like other synchronization constructs in C/C++,
|
---|
| 4234 | -transactions rely on a data-race-free program (e.g., a nontransactional
|
---|
| 4235 | -write that is concurrent with a transactional read to the same memory
|
---|
| 4236 | -location is a data race).
|
---|
| 4237 | -
|
---|
| 4238 | -
|
---|
| 4239 | -File: libitm.info, Node: The libitm ABI, Next: Internals, Prev: C/C++ Language Constructs for TM, Up: Top
|
---|
| 4240 | -
|
---|
| 4241 | -3 The libitm ABI
|
---|
| 4242 | -****************
|
---|
| 4243 | -
|
---|
| 4244 | -The ABI provided by libitm is basically equal to the Linux variant of
|
---|
| 4245 | -Intel's current TM ABI specification document (Revision 1.1, May 6 2009)
|
---|
| 4246 | -but with the differences listed in this chapter. It would be good if
|
---|
| 4247 | -these changes would eventually be merged into a future version of this
|
---|
| 4248 | -specification. To ease look-up, the following subsections mirror the
|
---|
| 4249 | -structure of this specification.
|
---|
| 4250 | -
|
---|
| 4251 | -3.1 [No changes] Objectives
|
---|
| 4252 | -===========================
|
---|
| 4253 | -
|
---|
| 4254 | -3.2 [No changes] Non-objectives
|
---|
| 4255 | -===============================
|
---|
| 4256 | -
|
---|
| 4257 | -3.3 Library design principles
|
---|
| 4258 | -=============================
|
---|
| 4259 | -
|
---|
| 4260 | -3.3.1 [No changes] Calling conventions
|
---|
| 4261 | ---------------------------------------
|
---|
| 4262 | -
|
---|
| 4263 | -3.3.2 [No changes] TM library algorithms
|
---|
| 4264 | -----------------------------------------
|
---|
| 4265 | -
|
---|
| 4266 | -3.3.3 [No changes] Optimized load and store routines
|
---|
| 4267 | -----------------------------------------------------
|
---|
| 4268 | -
|
---|
| 4269 | -3.3.4 [No changes] Aligned load and store routines
|
---|
| 4270 | ---------------------------------------------------
|
---|
| 4271 | -
|
---|
| 4272 | -3.3.5 Data logging functions
|
---|
| 4273 | -----------------------------
|
---|
| 4274 | -
|
---|
| 4275 | -The memory locations accessed with transactional loads and stores and
|
---|
| 4276 | -the memory locations whose values are logged must not overlap. This
|
---|
| 4277 | -required separation only extends to the scope of the execution of one
|
---|
| 4278 | -transaction including all the executions of all nested transactions.
|
---|
| 4279 | -
|
---|
| 4280 | - The compiler must be consistent (within the scope of a single
|
---|
| 4281 | -transaction) about which memory locations are shared and which are not
|
---|
| 4282 | -shared with other threads (i.e., data must be accessed either
|
---|
| 4283 | -transactionally or nontransactionally). Otherwise, non-write-through TM
|
---|
| 4284 | -algorithms would not work.
|
---|
| 4285 | -
|
---|
| 4286 | - For memory locations on the stack, this requirement extends to only
|
---|
| 4287 | -the lifetime of the stack frame that the memory location belongs to (or
|
---|
| 4288 | -the lifetime of the transaction, whichever is shorter). Thus, memory
|
---|
| 4289 | -that is reused for several stack frames could be target of both data
|
---|
| 4290 | -logging and transactional accesses; however, this is harmless because
|
---|
| 4291 | -these stack frames' lifetimes will end before the transaction finishes.
|
---|
| 4292 | -
|
---|
| 4293 | -3.3.6 [No changes] Scatter/gather calls
|
---|
| 4294 | ----------------------------------------
|
---|
| 4295 | -
|
---|
| 4296 | -3.3.7 [No changes] Serial and irrevocable mode
|
---|
| 4297 | -----------------------------------------------
|
---|
| 4298 | -
|
---|
| 4299 | -3.3.8 [No changes] Transaction descriptor
|
---|
| 4300 | ------------------------------------------
|
---|
| 4301 | -
|
---|
| 4302 | -3.3.9 Store allocation
|
---|
| 4303 | -----------------------
|
---|
| 4304 | -
|
---|
| 4305 | -There is no 'getTransaction' function.
|
---|
| 4306 | -
|
---|
| 4307 | -3.3.10 [No changes] Naming conventions
|
---|
| 4308 | ---------------------------------------
|
---|
| 4309 | -
|
---|
| 4310 | -3.3.11 Function pointer encryption
|
---|
| 4311 | -----------------------------------
|
---|
| 4312 | -
|
---|
| 4313 | -Currently, this is not implemented.
|
---|
| 4314 | -
|
---|
| 4315 | -3.4 Types and macros list
|
---|
| 4316 | -=========================
|
---|
| 4317 | -
|
---|
| 4318 | -'_ITM_codeProperties' has changed, *note Starting a transaction:
|
---|
| 4319 | -txn-code-properties. '_ITM_srcLocation' is not used.
|
---|
| 4320 | -
|
---|
| 4321 | -3.5 Function list
|
---|
| 4322 | -=================
|
---|
| 4323 | -
|
---|
| 4324 | -3.5.1 Initialization and finalization functions
|
---|
| 4325 | ------------------------------------------------
|
---|
| 4326 | -
|
---|
| 4327 | -These functions are not part of the ABI.
|
---|
| 4328 | -
|
---|
| 4329 | -3.5.2 [No changes] Version checking
|
---|
| 4330 | ------------------------------------
|
---|
| 4331 | -
|
---|
| 4332 | -3.5.3 [No changes] Error reporting
|
---|
| 4333 | -----------------------------------
|
---|
| 4334 | -
|
---|
| 4335 | -3.5.4 [No changes] inTransaction call
|
---|
| 4336 | --------------------------------------
|
---|
| 4337 | -
|
---|
| 4338 | -3.5.5 State manipulation functions
|
---|
| 4339 | -----------------------------------
|
---|
| 4340 | -
|
---|
| 4341 | -There is no 'getTransaction' function. Transaction identifiers for
|
---|
| 4342 | -nested transactions will be ordered but not necessarily sequential
|
---|
| 4343 | -(i.e., for a nested transaction's identifier IN and its enclosing
|
---|
| 4344 | -transaction's identifier IE, it is guaranteed that IN >= IE).
|
---|
| 4345 | -
|
---|
| 4346 | -3.5.6 [No changes] Source locations
|
---|
| 4347 | ------------------------------------
|
---|
| 4348 | -
|
---|
| 4349 | -3.5.7 Starting a transaction
|
---|
| 4350 | -----------------------------
|
---|
| 4351 | -
|
---|
| 4352 | -3.5.7.1 Transaction code properties
|
---|
| 4353 | -...................................
|
---|
| 4354 | -
|
---|
| 4355 | -The bit 'hasNoXMMUpdate' is instead called 'hasNoVectorUpdate'. Iff it
|
---|
| 4356 | -is set, vector register save/restore is not necessary for any target
|
---|
| 4357 | -machine.
|
---|
| 4358 | -
|
---|
| 4359 | - The 'hasNoFloatUpdate' bit ('0x0010') is new. Iff it is set,
|
---|
| 4360 | -floating point register save/restore is not necessary for any target
|
---|
| 4361 | -machine.
|
---|
| 4362 | -
|
---|
| 4363 | - 'undoLogCode' is not supported and a fatal runtime error will be
|
---|
| 4364 | -raised if this bit is set. It is not properly defined in the ABI why
|
---|
| 4365 | -barriers other than undo logging are not present; Are they not necessary
|
---|
| 4366 | -(e.g., a transaction operating purely on thread-local data) or have they
|
---|
| 4367 | -been omitted by the compiler because it thinks that some kind of global
|
---|
| 4368 | -synchronization (e.g., serial mode) might perform better? The
|
---|
| 4369 | -specification suggests that the latter might be the case, but the former
|
---|
| 4370 | -seems to be more useful.
|
---|
| 4371 | -
|
---|
| 4372 | - The 'readOnly' bit ('0x4000') is new. *TODO* Lexical or dynamic
|
---|
| 4373 | -scope?
|
---|
| 4374 | -
|
---|
| 4375 | - 'hasNoRetry' is not supported. If this bit is not set, but
|
---|
| 4376 | -'hasNoAbort' is set, the library can assume that transaction rollback
|
---|
| 4377 | -will not be requested.
|
---|
| 4378 | -
|
---|
| 4379 | - It would be useful if the absence of externally-triggered rollbacks
|
---|
| 4380 | -would be reported for the dynamic scope as well, not just for the
|
---|
| 4381 | -lexical scope ('hasNoAbort'). Without this, a library cannot exploit
|
---|
| 4382 | -this together with flat nesting.
|
---|
| 4383 | -
|
---|
| 4384 | - 'exceptionBlock' is not supported because exception blocks are not
|
---|
| 4385 | -used.
|
---|
| 4386 | -
|
---|
| 4387 | -3.5.7.2 [No changes] Windows exception state
|
---|
| 4388 | -............................................
|
---|
| 4389 | -
|
---|
| 4390 | -3.5.7.3 [No changes] Other machine state
|
---|
| 4391 | -........................................
|
---|
| 4392 | -
|
---|
| 4393 | -3.5.7.4 [No changes] Results from beginTransaction
|
---|
| 4394 | -..................................................
|
---|
| 4395 | -
|
---|
| 4396 | -3.5.8 Aborting a transaction
|
---|
| 4397 | -----------------------------
|
---|
| 4398 | -
|
---|
| 4399 | -'_ITM_rollbackTransaction' is not supported. '_ITM_abortTransaction' is
|
---|
| 4400 | -supported but the abort reasons 'exceptionBlockAbort', 'TMConflict', and
|
---|
| 4401 | -'userRetry' are not supported. There are no exception blocks in
|
---|
| 4402 | -general, so the related cases also do not have to be considered. To
|
---|
| 4403 | -encode '__transaction_cancel [[outer]]', compilers must set the new
|
---|
| 4404 | -'outerAbort' bit ('0x10') additionally to the 'userAbort' bit in the
|
---|
| 4405 | -abort reason.
|
---|
| 4406 | -
|
---|
| 4407 | -3.5.9 Committing a transaction
|
---|
| 4408 | -------------------------------
|
---|
| 4409 | -
|
---|
| 4410 | -The exception handling (EH) scheme is different. The Intel ABI requires
|
---|
| 4411 | -the '_ITM_tryCommitTransaction' function that will return even when the
|
---|
| 4412 | -commit failed and will have to be matched with calls to either
|
---|
| 4413 | -'_ITM_abortTransaction' or '_ITM_commitTransaction'. In contrast, gcc
|
---|
| 4414 | -relies on transactional wrappers for the functions of the Exception
|
---|
| 4415 | -Handling ABI and on one additional commit function (shown below). This
|
---|
| 4416 | -allows the TM to keep track of EH internally and thus it does not have
|
---|
| 4417 | -to embed the cleanup of EH state into the existing EH code in the
|
---|
| 4418 | -program. '_ITM_tryCommitTransaction' is not supported.
|
---|
| 4419 | -'_ITM_commitTransactionToId' is also not supported because the
|
---|
| 4420 | -propagation of thrown exceptions will not bypass commits of nested
|
---|
| 4421 | -transactions.
|
---|
| 4422 | -
|
---|
| 4423 | - void _ITM_commitTransactionEH(void *exc_ptr) ITM_REGPARM;
|
---|
| 4424 | - void *_ITM_cxa_allocate_exception (size_t);
|
---|
| 4425 | - void _ITM_cxa_throw (void *obj, void *tinfo, void *dest);
|
---|
| 4426 | - void *_ITM_cxa_begin_catch (void *exc_ptr);
|
---|
| 4427 | - void _ITM_cxa_end_catch (void);
|
---|
| 4428 | -
|
---|
| 4429 | - '_ITM_commitTransactionEH' must be called to commit a transaction if
|
---|
| 4430 | -an exception could be in flight at this position in the code. 'exc_ptr'
|
---|
| 4431 | -is the current exception or zero if there is no current exception. The
|
---|
| 4432 | -'_ITM_cxa...' functions are transactional wrappers for the respective
|
---|
| 4433 | -'__cxa...' functions and must be called instead of these in
|
---|
| 4434 | -transactional code.
|
---|
| 4435 | -
|
---|
| 4436 | - To support this EH scheme, libstdc++ needs to provide one additional
|
---|
| 4437 | -function ('_cxa_tm_cleanup'), which is used by the TM to clean up the
|
---|
| 4438 | -exception handling state while rolling back a transaction:
|
---|
| 4439 | -
|
---|
| 4440 | - void __cxa_tm_cleanup (void *unthrown_obj, void *cleanup_exc,
|
---|
| 4441 | - unsigned int caught_count);
|
---|
| 4442 | -
|
---|
| 4443 | - 'unthrown_obj' is non-null if the program called
|
---|
| 4444 | -'__cxa_allocate_exception' for this exception but did not yet called
|
---|
| 4445 | -'__cxa_throw' for it. 'cleanup_exc' is non-null if the program is
|
---|
| 4446 | -currently processing a cleanup along an exception path but has not
|
---|
| 4447 | -caught this exception yet. 'caught_count' is the nesting depth of
|
---|
| 4448 | -'__cxa_begin_catch' within the transaction (which can be counted by the
|
---|
| 4449 | -TM using '_ITM_cxa_begin_catch' and '_ITM_cxa_end_catch');
|
---|
| 4450 | -'__cxa_tm_cleanup' then performs rollback by essentially performing
|
---|
| 4451 | -'__cxa_end_catch' that many times.
|
---|
| 4452 | -
|
---|
| 4453 | -3.5.10 Exception handling support
|
---|
| 4454 | ----------------------------------
|
---|
| 4455 | -
|
---|
| 4456 | -Currently, there is no support for functionality like
|
---|
| 4457 | -'__transaction_cancel throw' as described in the C++ TM specification.
|
---|
| 4458 | -Supporting this should be possible with the EH scheme explained
|
---|
| 4459 | -previously because via the transactional wrappers for the EH ABI, the TM
|
---|
| 4460 | -is able to observe and intercept EH.
|
---|
| 4461 | -
|
---|
| 4462 | -3.5.11 [No changes] Transition to serial-irrevocable mode
|
---|
| 4463 | ----------------------------------------------------------
|
---|
| 4464 | -
|
---|
| 4465 | -3.5.12 [No changes] Data transfer functions
|
---|
| 4466 | --------------------------------------------
|
---|
| 4467 | -
|
---|
| 4468 | -3.5.13 [No changes] Transactional memory copies
|
---|
| 4469 | ------------------------------------------------
|
---|
| 4470 | -
|
---|
| 4471 | -3.5.14 Transactional versions of memmove
|
---|
| 4472 | -----------------------------------------
|
---|
| 4473 | -
|
---|
| 4474 | -If either the source or destination memory region is to be accessed
|
---|
| 4475 | -nontransactionally, then source and destination regions must not be
|
---|
| 4476 | -overlapping. The respective '_ITM_memmove' functions are still
|
---|
| 4477 | -available but a fatal runtime error will be raised if such regions do
|
---|
| 4478 | -overlap. To support this functionality, the ABI would have to specify
|
---|
| 4479 | -how the intersection of the regions has to be accessed (i.e.,
|
---|
| 4480 | -transactionally or nontransactionally).
|
---|
| 4481 | -
|
---|
| 4482 | -3.5.15 [No changes] Transactional versions of memset
|
---|
| 4483 | -----------------------------------------------------
|
---|
| 4484 | -
|
---|
| 4485 | -3.5.16 [No changes] Logging functions
|
---|
| 4486 | --------------------------------------
|
---|
| 4487 | -
|
---|
| 4488 | -3.5.17 User-registered commit and undo actions
|
---|
| 4489 | -----------------------------------------------
|
---|
| 4490 | -
|
---|
| 4491 | -Commit actions will get executed in the same order in which the
|
---|
| 4492 | -respective calls to '_ITM_addUserCommitAction' happened. Only
|
---|
| 4493 | -'_ITM_noTransactionId' is allowed as value for the
|
---|
| 4494 | -'resumingTransactionId' argument. Commit actions get executed after
|
---|
| 4495 | -privatization safety has been ensured.
|
---|
| 4496 | -
|
---|
| 4497 | - Undo actions will get executed in reverse order compared to the order
|
---|
| 4498 | -in which the respective calls to '_ITM_addUserUndoAction' happened. The
|
---|
| 4499 | -ordering of undo actions w.r.t. the roll-back of other actions (e.g.,
|
---|
| 4500 | -data transfers or memory allocations) is undefined.
|
---|
| 4501 | -
|
---|
| 4502 | - '_ITM_getThreadnum' is not supported currently because its only
|
---|
| 4503 | -purpose is to provide a thread ID that matches some assumed performance
|
---|
| 4504 | -tuning output, but this output is not part of the ABI nor further
|
---|
| 4505 | -defined by it.
|
---|
| 4506 | -
|
---|
| 4507 | - '_ITM_dropReferences' is not supported currently because its
|
---|
| 4508 | -semantics and the intention behind it is not entirely clear. The
|
---|
| 4509 | -specification suggests that this function is necessary because of
|
---|
| 4510 | -certain orderings of data transfer undos and the releasing of memory
|
---|
| 4511 | -regions (i.e., privatization). However, this ordering is never defined,
|
---|
| 4512 | -nor is the ordering of dropping references w.r.t. other events.
|
---|
| 4513 | -
|
---|
| 4514 | -3.5.18 [New] Transactional indirect calls
|
---|
| 4515 | ------------------------------------------
|
---|
| 4516 | -
|
---|
| 4517 | -Indirect calls (i.e., calls through a function pointer) within
|
---|
| 4518 | -transactions should execute the transactional clone of the original
|
---|
| 4519 | -function (i.e., a clone of the original that has been fully instrumented
|
---|
| 4520 | -to use the TM runtime), if such a clone is available. The runtime
|
---|
| 4521 | -provides two functions to register/deregister clone tables:
|
---|
| 4522 | -
|
---|
| 4523 | - struct clone_entry
|
---|
| 4524 | - {
|
---|
| 4525 | - void *orig, *clone;
|
---|
| 4526 | - };
|
---|
| 4527 | -
|
---|
| 4528 | - void _ITM_registerTMCloneTable (clone_entry *table, size_t entries);
|
---|
| 4529 | - void _ITM_deregisterTMCloneTable (clone_entry *table);
|
---|
| 4530 | -
|
---|
| 4531 | - Registered tables must be writable by the TM runtime, and must be
|
---|
| 4532 | -live throughout the life-time of the TM runtime.
|
---|
| 4533 | -
|
---|
| 4534 | - *TODO* The intention was always to drop the registration functions
|
---|
| 4535 | -entirely, and create a new ELF Phdr describing the linker-sorted table.
|
---|
| 4536 | -Much like what currently happens for 'PT_GNU_EH_FRAME'. This work kept
|
---|
| 4537 | -getting bogged down in how to represent the N different code generation
|
---|
| 4538 | -variants. We clearly needed at least two--SW and HW transactional
|
---|
| 4539 | -clones--but there was always a suggestion of more variants for different
|
---|
| 4540 | -TM assumptions/invariants.
|
---|
| 4541 | -
|
---|
| 4542 | - The compiler can then use two TM runtime functions to perform
|
---|
| 4543 | -indirect calls in transactions:
|
---|
| 4544 | - void *_ITM_getTMCloneOrIrrevocable (void *function) ITM_REGPARM;
|
---|
| 4545 | - void *_ITM_getTMCloneSafe (void *function) ITM_REGPARM;
|
---|
| 4546 | -
|
---|
| 4547 | - If there is a registered clone for supplied function, both will
|
---|
| 4548 | -return a pointer to the clone. If not, the first runtime function will
|
---|
| 4549 | -attempt to switch to serial-irrevocable mode and return the original
|
---|
| 4550 | -pointer, whereas the second will raise a fatal runtime error.
|
---|
| 4551 | -
|
---|
| 4552 | -3.5.19 [New] Transactional dynamic memory management
|
---|
| 4553 | -----------------------------------------------------
|
---|
| 4554 | -
|
---|
| 4555 | - void *_ITM_malloc (size_t)
|
---|
| 4556 | - __attribute__((__malloc__)) ITM_PURE;
|
---|
| 4557 | - void *_ITM_calloc (size_t, size_t)
|
---|
| 4558 | - __attribute__((__malloc__)) ITM_PURE;
|
---|
| 4559 | - void _ITM_free (void *) ITM_PURE;
|
---|
| 4560 | -
|
---|
| 4561 | - These functions are essentially transactional wrappers for 'malloc',
|
---|
| 4562 | -'calloc', and 'free'. Within transactions, the compiler should replace
|
---|
| 4563 | -calls to the original functions with calls to the wrapper functions.
|
---|
| 4564 | -
|
---|
| 4565 | -3.6 [No changes] Future Enhancements to the ABI
|
---|
| 4566 | -===============================================
|
---|
| 4567 | -
|
---|
| 4568 | -3.7 Sample code
|
---|
| 4569 | -===============
|
---|
| 4570 | -
|
---|
| 4571 | -The code examples might not be correct w.r.t. the current version of
|
---|
| 4572 | -the ABI, especially everything related to exception handling.
|
---|
| 4573 | -
|
---|
| 4574 | -3.8 [New] Memory model
|
---|
| 4575 | -======================
|
---|
| 4576 | -
|
---|
| 4577 | -The ABI should define a memory model and the ordering that is guaranteed
|
---|
| 4578 | -for data transfers and commit/undo actions, or at least refer to another
|
---|
| 4579 | -memory model that needs to be preserved. Without that, the compiler
|
---|
| 4580 | -cannot ensure the memory model specified on the level of the programming
|
---|
| 4581 | -language (e.g., by the C++ TM specification).
|
---|
| 4582 | -
|
---|
| 4583 | - For example, if a transactional load is ordered before another
|
---|
| 4584 | -load/store, then the TM runtime must also ensure this ordering when
|
---|
| 4585 | -accessing shared state. If not, this might break the kind of
|
---|
| 4586 | -publication safety used in the C++ TM specification. Likewise, the TM
|
---|
| 4587 | -runtime must ensure privatization safety.
|
---|
| 4588 | -
|
---|
| 4589 | -
|
---|
| 4590 | -File: libitm.info, Node: Internals, Next: GNU Free Documentation License, Prev: The libitm ABI, Up: Top
|
---|
| 4591 | -
|
---|
| 4592 | -4 Internals
|
---|
| 4593 | -***********
|
---|
| 4594 | -
|
---|
| 4595 | -4.1 TM methods and method groups
|
---|
| 4596 | -================================
|
---|
| 4597 | -
|
---|
| 4598 | -libitm supports several ways of synchronizing transactions with each
|
---|
| 4599 | -other. These TM methods (or TM algorithms) are implemented in the form
|
---|
| 4600 | -of subclasses of 'abi_dispatch', which provide methods for transactional
|
---|
| 4601 | -loads and stores as well as callbacks for rollback and commit. All
|
---|
| 4602 | -methods that are compatible with each other (i.e., that let concurrently
|
---|
| 4603 | -running transactions still synchronize correctly even if different
|
---|
| 4604 | -methods are used) belong to the same TM method group. Pointers to TM
|
---|
| 4605 | -methods can be obtained using the factory methods prefixed with
|
---|
| 4606 | -'dispatch_' in 'libitm_i.h'. There are two special methods,
|
---|
| 4607 | -'dispatch_serial' and 'dispatch_serialirr', that are compatible with all
|
---|
| 4608 | -methods because they run transactions completely in serial mode.
|
---|
| 4609 | -
|
---|
| 4610 | -4.1.1 TM method life cycle
|
---|
| 4611 | ---------------------------
|
---|
| 4612 | -
|
---|
| 4613 | -The state of TM methods does not change after construction, but they do
|
---|
| 4614 | -alter the state of transactions that use this method. However, because
|
---|
| 4615 | -per-transaction data gets used by several methods, 'gtm_thread' is
|
---|
| 4616 | -responsible for setting an initial state that is useful for all methods.
|
---|
| 4617 | -After that, methods are responsible for resetting/clearing this state on
|
---|
| 4618 | -each rollback or commit (of outermost transactions), so that the
|
---|
| 4619 | -transaction executed next is not affected by the previous transaction.
|
---|
| 4620 | -
|
---|
| 4621 | - There is also global state associated with each method group, which
|
---|
| 4622 | -is initialized and shut down ('method_group::init()' and 'fini()') when
|
---|
| 4623 | -switching between method groups (see 'retry.cc').
|
---|
| 4624 | -
|
---|
| 4625 | -4.1.2 Selecting the default method
|
---|
| 4626 | -----------------------------------
|
---|
| 4627 | -
|
---|
| 4628 | -The default method that libitm uses for freshly started transactions
|
---|
| 4629 | -(but not necessarily for restarted transactions) can be set via an
|
---|
| 4630 | -environment variable ('ITM_DEFAULT_METHOD'), whose value should be equal
|
---|
| 4631 | -to the name of one of the factory methods returning abi_dispatch
|
---|
| 4632 | -subclasses but without the "dispatch_" prefix (e.g., "serialirr" instead
|
---|
| 4633 | -of 'GTM::dispatch_serialirr()').
|
---|
| 4634 | -
|
---|
| 4635 | - Note that this environment variable is only a hint for libitm and
|
---|
| 4636 | -might not be supported in the future.
|
---|
| 4637 | -
|
---|
| 4638 | -4.2 Nesting: flat vs. closed
|
---|
| 4639 | -============================
|
---|
| 4640 | -
|
---|
| 4641 | -We support two different kinds of nesting of transactions. In the case
|
---|
| 4642 | -of _flat nesting_, the nesting structure is flattened and all nested
|
---|
| 4643 | -transactions are subsumed by the enclosing transaction. In contrast,
|
---|
| 4644 | -with _closed nesting_, nested transactions that have not yet committed
|
---|
| 4645 | -can be rolled back separately from the enclosing transactions; when they
|
---|
| 4646 | -commit, they are subsumed by the enclosing transaction, and their
|
---|
| 4647 | -effects will be finally committed when the outermost transaction
|
---|
| 4648 | -commits. _Open nesting_ (where nested transactions can commit
|
---|
| 4649 | -independently of the enclosing transactions) are not supported.
|
---|
| 4650 | -
|
---|
| 4651 | - Flat nesting is the default nesting mode, but closed nesting is
|
---|
| 4652 | -supported and used when transactions contain user-controlled aborts
|
---|
| 4653 | -('__transaction_cancel' statements). We assume that user-controlled
|
---|
| 4654 | -aborts are rare in typical code and used mostly in exceptional
|
---|
| 4655 | -situations. Thus, it makes more sense to use flat nesting by default to
|
---|
| 4656 | -avoid the performance overhead of the additional checkpoints required
|
---|
| 4657 | -for closed nesting. User-controlled aborts will correctly abort the
|
---|
| 4658 | -innermost enclosing transaction, whereas the whole (i.e., outermost)
|
---|
| 4659 | -transaction will be restarted otherwise (e.g., when a transaction
|
---|
| 4660 | -encounters data conflicts during optimistic execution).
|
---|
| 4661 | -
|
---|
| 4662 | -4.3 Locking conventions
|
---|
| 4663 | -=======================
|
---|
| 4664 | -
|
---|
| 4665 | -This section documents the locking scheme and rules for all uses of
|
---|
| 4666 | -locking in libitm. We have to support serial(-irrevocable) mode, which
|
---|
| 4667 | -is implemented using a global lock as explained next (called the _serial
|
---|
| 4668 | -lock_). To simplify the overall design, we use the same lock as
|
---|
| 4669 | -catch-all locking mechanism for other infrequent tasks such as
|
---|
| 4670 | -(de)registering clone tables or threads. Besides the serial lock, there
|
---|
| 4671 | -are _per-method-group locks_ that are managed by specific method groups
|
---|
| 4672 | -(i.e., groups of similar TM concurrency control algorithms), and
|
---|
| 4673 | -lock-like constructs for quiescence-based operations such as ensuring
|
---|
| 4674 | -privatization safety.
|
---|
| 4675 | -
|
---|
| 4676 | - Thus, the actions that participate in the libitm-internal locking are
|
---|
| 4677 | -either _active transactions_ that do not run in serial mode, _serial
|
---|
| 4678 | -transactions_ (which (are about to) run in serial mode), and management
|
---|
| 4679 | -tasks that do not execute within a transaction but have acquired the
|
---|
| 4680 | -serial mode like a serial transaction would do (e.g., to be able to
|
---|
| 4681 | -register threads with libitm). Transactions become active as soon as
|
---|
| 4682 | -they have successfully used the serial lock to announce this globally
|
---|
| 4683 | -(*note Serial lock implementation: serial-lock-impl.). Likewise,
|
---|
| 4684 | -transactions become serial transactions as soon as they have acquired
|
---|
| 4685 | -the exclusive rights provided by the serial lock (i.e., serial mode,
|
---|
| 4686 | -which also means that there are no other concurrent active or serial
|
---|
| 4687 | -transactions). Note that active transactions can become serial
|
---|
| 4688 | -transactions when they enter serial mode during the runtime of the
|
---|
| 4689 | -transaction.
|
---|
| 4690 | -
|
---|
| 4691 | -4.3.1 State-to-lock mapping
|
---|
| 4692 | ----------------------------
|
---|
| 4693 | -
|
---|
| 4694 | -Application data is protected by the serial lock if there is a serial
|
---|
| 4695 | -transaction and no concurrently running active transaction (i.e.,
|
---|
| 4696 | -non-serial). Otherwise, application data is protected by the currently
|
---|
| 4697 | -selected method group, which might use per-method-group locks or other
|
---|
| 4698 | -mechanisms. Also note that application data that is about to be
|
---|
| 4699 | -privatized might not be allowed to be accessed by nontransactional code
|
---|
| 4700 | -until privatization safety has been ensured; the details of this are
|
---|
| 4701 | -handled by the current method group.
|
---|
| 4702 | -
|
---|
| 4703 | - libitm-internal state is either protected by the serial lock or
|
---|
| 4704 | -accessed through custom concurrent code. The latter applies to the
|
---|
| 4705 | -public/shared part of a transaction object and most typical
|
---|
| 4706 | -method-group-specific state.
|
---|
| 4707 | -
|
---|
| 4708 | - The former category (protected by the serial lock) includes:
|
---|
| 4709 | - * The list of active threads that have used transactions.
|
---|
| 4710 | - * The tables that map functions to their transactional clones.
|
---|
| 4711 | - * The current selection of which method group to use.
|
---|
| 4712 | - * Some method-group-specific data, or invariants of this data. For
|
---|
| 4713 | - example, resetting a method group to its initial state is handled
|
---|
| 4714 | - by switching to the same method group, so the serial lock protects
|
---|
| 4715 | - such resetting as well.
|
---|
| 4716 | - In general, such state is immutable whenever there exists an active
|
---|
| 4717 | -(non-serial) transaction. If there is no active transaction, a serial
|
---|
| 4718 | -transaction (or a thread that is not currently executing a transaction
|
---|
| 4719 | -but has acquired the serial lock) is allowed to modify this state (but
|
---|
| 4720 | -must of course be careful to not surprise the current method group's
|
---|
| 4721 | -implementation with such modifications).
|
---|
| 4722 | -
|
---|
| 4723 | -4.3.2 Lock acquisition order
|
---|
| 4724 | -----------------------------
|
---|
| 4725 | -
|
---|
| 4726 | -To prevent deadlocks, locks acquisition must happen in a globally
|
---|
| 4727 | -agreed-upon order. Note that this applies to other forms of blocking
|
---|
| 4728 | -too, but does not necessarily apply to lock acquisitions that do not
|
---|
| 4729 | -block (e.g., trylock() calls that do not get retried forever). Note
|
---|
| 4730 | -that serial transactions are never return back to active transactions
|
---|
| 4731 | -until the transaction has committed. Likewise, active transactions stay
|
---|
| 4732 | -active until they have committed. Per-method-group locks are typically
|
---|
| 4733 | -also not released before commit.
|
---|
| 4734 | -
|
---|
| 4735 | - Lock acquisition / blocking rules:
|
---|
| 4736 | -
|
---|
| 4737 | - * Transactions must become active or serial before they are allowed
|
---|
| 4738 | - to use method-group-specific locks or blocking (i.e., the serial
|
---|
| 4739 | - lock must be acquired before those other locks, either in serial or
|
---|
| 4740 | - nonserial mode).
|
---|
| 4741 | -
|
---|
| 4742 | - * Any number of threads that do not currently run active transactions
|
---|
| 4743 | - can block while trying to get the serial lock in exclusive mode.
|
---|
| 4744 | - Note that active transactions must not block when trying to upgrade
|
---|
| 4745 | - to serial mode unless there is no other transaction that is trying
|
---|
| 4746 | - that (the latter is ensured by the serial lock implementation.
|
---|
| 4747 | -
|
---|
| 4748 | - * Method groups must prevent deadlocks on their locks. In
|
---|
| 4749 | - particular, they must also be prepared for another active
|
---|
| 4750 | - transaction that has acquired method-group-specific locks but is
|
---|
| 4751 | - blocked during an attempt to upgrade to being a serial transaction.
|
---|
| 4752 | - See below for details.
|
---|
| 4753 | -
|
---|
| 4754 | - * Serial transactions can acquire method-group-specific locks because
|
---|
| 4755 | - there will be no other active nor serial transaction.
|
---|
| 4756 | -
|
---|
| 4757 | - There is no single rule for per-method-group blocking because this
|
---|
| 4758 | -depends on when a TM method might acquire locks. If no active
|
---|
| 4759 | -transaction can upgrade to being a serial transaction after it has
|
---|
| 4760 | -acquired per-method-group locks (e.g., when those locks are only
|
---|
| 4761 | -acquired during an attempt to commit), then the TM method does not need
|
---|
| 4762 | -to consider a potential deadlock due to serial mode.
|
---|
| 4763 | -
|
---|
| 4764 | - If there can be upgrades to serial mode after the acquisition of
|
---|
| 4765 | -per-method-group locks, then TM methods need to avoid those deadlocks:
|
---|
| 4766 | - * When upgrading to a serial transaction, after acquiring exclusive
|
---|
| 4767 | - rights to the serial lock but before waiting for concurrent active
|
---|
| 4768 | - transactions to finish (*note Serial lock implementation:
|
---|
| 4769 | - serial-lock-impl. for details), we have to wake up all active
|
---|
| 4770 | - transactions waiting on the upgrader's per-method-group locks.
|
---|
| 4771 | - * Active transactions blocking on per-method-group locks need to
|
---|
| 4772 | - check the serial lock and abort if there is a pending serial
|
---|
| 4773 | - transaction.
|
---|
| 4774 | - * Lost wake-ups have to be prevented (e.g., by changing a bit in each
|
---|
| 4775 | - per-method-group lock before doing the wake-up, and only blocking
|
---|
| 4776 | - on this lock using a futex if this bit is not group).
|
---|
| 4777 | -
|
---|
| 4778 | - *TODO*: Can reuse serial lock for gl-*? And if we can, does it make
|
---|
| 4779 | -sense to introduce further complexity in the serial lock? For gl-*, we
|
---|
| 4780 | -can really only avoid an abort if we do -wb and -vbv.
|
---|
| 4781 | -
|
---|
| 4782 | -4.3.3 Serial lock implementation
|
---|
| 4783 | ---------------------------------
|
---|
| 4784 | -
|
---|
| 4785 | -The serial lock implementation is optimized towards assuming that serial
|
---|
| 4786 | -transactions are infrequent and not the common case. However, the
|
---|
| 4787 | -performance of entering serial mode can matter because when only few
|
---|
| 4788 | -transactions are run concurrently or if there are few threads, then it
|
---|
| 4789 | -can be efficient to run transactions serially.
|
---|
| 4790 | -
|
---|
| 4791 | - The serial lock is similar to a multi-reader-single-writer lock in
|
---|
| 4792 | -that there can be several active transactions but only one serial
|
---|
| 4793 | -transaction. However, we do want to avoid contention (in the lock
|
---|
| 4794 | -implementation) between active transactions, so we split up the reader
|
---|
| 4795 | -side of the lock into per-transaction flags that are true iff the
|
---|
| 4796 | -transaction is active. The exclusive writer side remains a shared
|
---|
| 4797 | -single flag, which is acquired using a CAS, for example. On the
|
---|
| 4798 | -fast-path, the serial lock then works similar to Dekker's algorithm but
|
---|
| 4799 | -with several reader flags that a serial transaction would have to check.
|
---|
| 4800 | -A serial transaction thus requires a list of all threads with
|
---|
| 4801 | -potentially active transactions; we can use the serial lock itself to
|
---|
| 4802 | -protect this list (i.e., only threads that have acquired the serial lock
|
---|
| 4803 | -can modify this list).
|
---|
| 4804 | -
|
---|
| 4805 | - We want starvation-freedom for the serial lock to allow for using it
|
---|
| 4806 | -to ensure progress for potentially starved transactions (*note Progress
|
---|
| 4807 | -Guarantees: progress-guarantees. for details). However, this is
|
---|
| 4808 | -currently not enforced by the implementation of the serial lock.
|
---|
| 4809 | -
|
---|
| 4810 | - Here is pseudo-code for the read/write fast paths of acquiring the
|
---|
| 4811 | -serial lock (read-to-write upgrade is similar to write_lock:
|
---|
| 4812 | - // read_lock:
|
---|
| 4813 | - tx->shared_state |= active;
|
---|
| 4814 | - __sync_synchronize(); // or STLD membar, or C++0x seq-cst fence
|
---|
| 4815 | - while (!serial_lock.exclusive)
|
---|
| 4816 | - if (spinning_for_too_long) goto slowpath;
|
---|
| 4817 | -
|
---|
| 4818 | - // write_lock:
|
---|
| 4819 | - if (CAS(&serial_lock.exclusive, 0, this) != 0)
|
---|
| 4820 | - goto slowpath; // writer-writer contention
|
---|
| 4821 | - // need a membar here, but CAS already has full membar semantics
|
---|
| 4822 | - bool need_blocking = false;
|
---|
| 4823 | - for (t: all txns)
|
---|
| 4824 | - {
|
---|
| 4825 | - for (;t->shared_state & active;)
|
---|
| 4826 | - if (spinning_for_too_long) { need_blocking = true; break; }
|
---|
| 4827 | - }
|
---|
| 4828 | - if (need_blocking) goto slowpath;
|
---|
| 4829 | -
|
---|
| 4830 | - Releasing a lock in this spin-lock version then just consists of
|
---|
| 4831 | -resetting 'tx->shared_state' to inactive or clearing
|
---|
| 4832 | -'serial_lock.exclusive'.
|
---|
| 4833 | -
|
---|
| 4834 | - However, we can't rely on a pure spinlock because we need to get the
|
---|
| 4835 | -OS involved at some time (e.g., when there are more threads than CPUs to
|
---|
| 4836 | -run on). Therefore, the real implementation falls back to a blocking
|
---|
| 4837 | -slow path, either based on pthread mutexes or Linux futexes.
|
---|
| 4838 | -
|
---|
| 4839 | -4.3.4 Reentrancy
|
---|
| 4840 | -----------------
|
---|
| 4841 | -
|
---|
| 4842 | -libitm has to consider the following cases of reentrancy:
|
---|
| 4843 | -
|
---|
| 4844 | - * Transaction calls unsafe code that starts a new transaction: The
|
---|
| 4845 | - outer transaction will become a serial transaction before executing
|
---|
| 4846 | - unsafe code. Therefore, nesting within serial transactions must
|
---|
| 4847 | - work, even if the nested transaction is called from within
|
---|
| 4848 | - uninstrumented code.
|
---|
| 4849 | -
|
---|
| 4850 | - * Transaction calls either a transactional wrapper or safe code,
|
---|
| 4851 | - which in turn starts a new transaction: It is not yet defined in
|
---|
| 4852 | - the specification whether this is allowed. Thus, it is undefined
|
---|
| 4853 | - whether libitm supports this.
|
---|
| 4854 | -
|
---|
| 4855 | - * Code that starts new transactions might be called from within any
|
---|
| 4856 | - part of libitm: This kind of reentrancy would likely be rather
|
---|
| 4857 | - complex and can probably be avoided. Therefore, it is not
|
---|
| 4858 | - supported.
|
---|
| 4859 | -
|
---|
| 4860 | -4.3.5 Privatization safety
|
---|
| 4861 | ---------------------------
|
---|
| 4862 | -
|
---|
| 4863 | -Privatization safety is ensured by libitm using a quiescence-based
|
---|
| 4864 | -approach. Basically, a privatizing transaction waits until all
|
---|
| 4865 | -concurrent active transactions will either have finished (are not active
|
---|
| 4866 | -anymore) or operate on a sufficiently recent snapshot to not access the
|
---|
| 4867 | -privatized data anymore. This happens after the privatizing transaction
|
---|
| 4868 | -has stopped being an active transaction, so waiting for quiescence does
|
---|
| 4869 | -not contribute to deadlocks.
|
---|
| 4870 | -
|
---|
| 4871 | - In method groups that need to ensure publication safety explicitly,
|
---|
| 4872 | -active transactions maintain a flag or timestamp in the public/shared
|
---|
| 4873 | -part of the transaction descriptor. Before blocking, privatizers need
|
---|
| 4874 | -to let the other transactions know that they should wake up the
|
---|
| 4875 | -privatizer.
|
---|
| 4876 | -
|
---|
| 4877 | - *TODO* Ho to implement the waiters? Should those flags be
|
---|
| 4878 | -per-transaction or at a central place? We want to avoid one wake/wait
|
---|
| 4879 | -call per active transactions, so we might want to use either a tree or
|
---|
| 4880 | -combining to reduce the syscall overhead, or rather spin for a long
|
---|
| 4881 | -amount of time instead of doing blocking. Also, it would be good if
|
---|
| 4882 | -only the last transaction that the privatizer waits for would do the
|
---|
| 4883 | -wake-up.
|
---|
| 4884 | -
|
---|
| 4885 | -4.3.6 Progress guarantees
|
---|
| 4886 | --------------------------
|
---|
| 4887 | -
|
---|
| 4888 | -Transactions that do not make progress when using the current TM method
|
---|
| 4889 | -will eventually try to execute in serial mode. Thus, the serial lock's
|
---|
| 4890 | -progress guarantees determine the progress guarantees of the whole TM.
|
---|
| 4891 | -Obviously, we at least need deadlock-freedom for the serial lock, but it
|
---|
| 4892 | -would also be good to provide starvation-freedom (informally, all
|
---|
| 4893 | -threads will finish executing a transaction eventually iff they get
|
---|
| 4894 | -enough cycles).
|
---|
| 4895 | -
|
---|
| 4896 | - However, the scheduling of transactions (e.g., thread scheduling by
|
---|
| 4897 | -the OS) also affects the handling of progress guarantees by the TM.
|
---|
| 4898 | -First, the TM can only guarantee deadlock-freedom if threads do not get
|
---|
| 4899 | -stopped. Likewise, low-priority threads can starve if they do not get
|
---|
| 4900 | -scheduled when other high-priority threads get those cycles instead.
|
---|
| 4901 | -
|
---|
| 4902 | - If all threads get scheduled eventually, correct lock implementations
|
---|
| 4903 | -will provide deadlock-freedom, but might not provide starvation-freedom.
|
---|
| 4904 | -We can either enforce the latter in the TM's lock implementation, or
|
---|
| 4905 | -assume that the scheduling is sufficiently random to yield a
|
---|
| 4906 | -probabilistic guarantee that no thread will starve (because eventually,
|
---|
| 4907 | -a transaction will encounter a scheduling that will allow it to run).
|
---|
| 4908 | -This can indeed work well in practice but is not necessarily guaranteed
|
---|
| 4909 | -to work (e.g., simple spin locks can be pretty efficient).
|
---|
| 4910 | -
|
---|
| 4911 | - Because enforcing stronger progress guarantees in the TM has a higher
|
---|
| 4912 | -runtime overhead, we focus on deadlock-freedom right now and assume that
|
---|
| 4913 | -the threads will get scheduled eventually by the OS (but don't consider
|
---|
| 4914 | -threads with different priorities). We should support
|
---|
| 4915 | -starvation-freedom for serial transactions in the future. Everything
|
---|
| 4916 | -beyond that is highly related to proper contention management across all
|
---|
| 4917 | -of the TM (including with TM method to choose), and is future work.
|
---|
| 4918 | -
|
---|
| 4919 | - *TODO* Handling thread priorities: We want to avoid priority
|
---|
| 4920 | -inversion but it's unclear how often that actually matters in practice.
|
---|
| 4921 | -Workloads that have threads with different priorities will likely also
|
---|
| 4922 | -require lower latency or higher throughput for high-priority threads.
|
---|
| 4923 | -Therefore, it probably makes not that much sense (except for eventual
|
---|
| 4924 | -progress guarantees) to use priority inheritance until the TM has
|
---|
| 4925 | -priority-aware contention management.
|
---|
| 4926 | -
|
---|
| 4927 | -
|
---|
| 4928 | -File: libitm.info, Node: GNU Free Documentation License, Next: Index, Prev: Internals, Up: Top
|
---|
| 4929 | -
|
---|
| 4930 | -GNU Free Documentation License
|
---|
| 4931 | -******************************
|
---|
| 4932 | -
|
---|
| 4933 | - Version 1.3, 3 November 2008
|
---|
| 4934 | -
|
---|
| 4935 | - Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
|
---|
| 4936 | - <http://fsf.org/>
|
---|
| 4937 | -
|
---|
| 4938 | - Everyone is permitted to copy and distribute verbatim copies
|
---|
| 4939 | - of this license document, but changing it is not allowed.
|
---|
| 4940 | -
|
---|
| 4941 | - 0. PREAMBLE
|
---|
| 4942 | -
|
---|
| 4943 | - The purpose of this License is to make a manual, textbook, or other
|
---|
| 4944 | - functional and useful document "free" in the sense of freedom: to
|
---|
| 4945 | - assure everyone the effective freedom to copy and redistribute it,
|
---|
| 4946 | - with or without modifying it, either commercially or
|
---|
| 4947 | - noncommercially. Secondarily, this License preserves for the
|
---|
| 4948 | - author and publisher a way to get credit for their work, while not
|
---|
| 4949 | - being considered responsible for modifications made by others.
|
---|
| 4950 | -
|
---|
| 4951 | - This License is a kind of "copyleft", which means that derivative
|
---|
| 4952 | - works of the document must themselves be free in the same sense.
|
---|
| 4953 | - It complements the GNU General Public License, which is a copyleft
|
---|
| 4954 | - license designed for free software.
|
---|
| 4955 | -
|
---|
| 4956 | - We have designed this License in order to use it for manuals for
|
---|
| 4957 | - free software, because free software needs free documentation: a
|
---|
| 4958 | - free program should come with manuals providing the same freedoms
|
---|
| 4959 | - that the software does. But this License is not limited to
|
---|
| 4960 | - software manuals; it can be used for any textual work, regardless
|
---|
| 4961 | - of subject matter or whether it is published as a printed book. We
|
---|
| 4962 | - recommend this License principally for works whose purpose is
|
---|
| 4963 | - instruction or reference.
|
---|
| 4964 | -
|
---|
| 4965 | - 1. APPLICABILITY AND DEFINITIONS
|
---|
| 4966 | -
|
---|
| 4967 | - This License applies to any manual or other work, in any medium,
|
---|
| 4968 | - that contains a notice placed by the copyright holder saying it can
|
---|
| 4969 | - be distributed under the terms of this License. Such a notice
|
---|
| 4970 | - grants a world-wide, royalty-free license, unlimited in duration,
|
---|
| 4971 | - to use that work under the conditions stated herein. The
|
---|
| 4972 | - "Document", below, refers to any such manual or work. Any member
|
---|
| 4973 | - of the public is a licensee, and is addressed as "you". You accept
|
---|
| 4974 | - the license if you copy, modify or distribute the work in a way
|
---|
| 4975 | - requiring permission under copyright law.
|
---|
| 4976 | -
|
---|
| 4977 | - A "Modified Version" of the Document means any work containing the
|
---|
| 4978 | - Document or a portion of it, either copied verbatim, or with
|
---|
| 4979 | - modifications and/or translated into another language.
|
---|
| 4980 | -
|
---|
| 4981 | - A "Secondary Section" is a named appendix or a front-matter section
|
---|
| 4982 | - of the Document that deals exclusively with the relationship of the
|
---|
| 4983 | - publishers or authors of the Document to the Document's overall
|
---|
| 4984 | - subject (or to related matters) and contains nothing that could
|
---|
| 4985 | - fall directly within that overall subject. (Thus, if the Document
|
---|
| 4986 | - is in part a textbook of mathematics, a Secondary Section may not
|
---|
| 4987 | - explain any mathematics.) The relationship could be a matter of
|
---|
| 4988 | - historical connection with the subject or with related matters, or
|
---|
| 4989 | - of legal, commercial, philosophical, ethical or political position
|
---|
| 4990 | - regarding them.
|
---|
| 4991 | -
|
---|
| 4992 | - The "Invariant Sections" are certain Secondary Sections whose
|
---|
| 4993 | - titles are designated, as being those of Invariant Sections, in the
|
---|
| 4994 | - notice that says that the Document is released under this License.
|
---|
| 4995 | - If a section does not fit the above definition of Secondary then it
|
---|
| 4996 | - is not allowed to be designated as Invariant. The Document may
|
---|
| 4997 | - contain zero Invariant Sections. If the Document does not identify
|
---|
| 4998 | - any Invariant Sections then there are none.
|
---|
| 4999 | -
|
---|
| 5000 | - The "Cover Texts" are certain short passages of text that are
|
---|
| 5001 | - listed, as Front-Cover Texts or Back-Cover Texts, in the notice
|
---|
| 5002 | - that says that the Document is released under this License. A
|
---|
| 5003 | - Front-Cover Text may be at most 5 words, and a Back-Cover Text may
|
---|
| 5004 | - be at most 25 words.
|
---|
| 5005 | -
|
---|
| 5006 | - A "Transparent" copy of the Document means a machine-readable copy,
|
---|
| 5007 | - represented in a format whose specification is available to the
|
---|
| 5008 | - general public, that is suitable for revising the document
|
---|
| 5009 | - straightforwardly with generic text editors or (for images composed
|
---|
| 5010 | - of pixels) generic paint programs or (for drawings) some widely
|
---|
| 5011 | - available drawing editor, and that is suitable for input to text
|
---|
| 5012 | - formatters or for automatic translation to a variety of formats
|
---|
| 5013 | - suitable for input to text formatters. A copy made in an otherwise
|
---|
| 5014 | - Transparent file format whose markup, or absence of markup, has
|
---|
| 5015 | - been arranged to thwart or discourage subsequent modification by
|
---|
| 5016 | - readers is not Transparent. An image format is not Transparent if
|
---|
| 5017 | - used for any substantial amount of text. A copy that is not
|
---|
| 5018 | - "Transparent" is called "Opaque".
|
---|
| 5019 | -
|
---|
| 5020 | - Examples of suitable formats for Transparent copies include plain
|
---|
| 5021 | - ASCII without markup, Texinfo input format, LaTeX input format,
|
---|
| 5022 | - SGML or XML using a publicly available DTD, and standard-conforming
|
---|
| 5023 | - simple HTML, PostScript or PDF designed for human modification.
|
---|
| 5024 | - Examples of transparent image formats include PNG, XCF and JPG.
|
---|
| 5025 | - Opaque formats include proprietary formats that can be read and
|
---|
| 5026 | - edited only by proprietary word processors, SGML or XML for which
|
---|
| 5027 | - the DTD and/or processing tools are not generally available, and
|
---|
| 5028 | - the machine-generated HTML, PostScript or PDF produced by some word
|
---|
| 5029 | - processors for output purposes only.
|
---|
| 5030 | -
|
---|
| 5031 | - The "Title Page" means, for a printed book, the title page itself,
|
---|
| 5032 | - plus such following pages as are needed to hold, legibly, the
|
---|
| 5033 | - material this License requires to appear in the title page. For
|
---|
| 5034 | - works in formats which do not have any title page as such, "Title
|
---|
| 5035 | - Page" means the text near the most prominent appearance of the
|
---|
| 5036 | - work's title, preceding the beginning of the body of the text.
|
---|
| 5037 | -
|
---|
| 5038 | - The "publisher" means any person or entity that distributes copies
|
---|
| 5039 | - of the Document to the public.
|
---|
| 5040 | -
|
---|
| 5041 | - A section "Entitled XYZ" means a named subunit of the Document
|
---|
| 5042 | - whose title either is precisely XYZ or contains XYZ in parentheses
|
---|
| 5043 | - following text that translates XYZ in another language. (Here XYZ
|
---|
| 5044 | - stands for a specific section name mentioned below, such as
|
---|
| 5045 | - "Acknowledgements", "Dedications", "Endorsements", or "History".)
|
---|
| 5046 | - To "Preserve the Title" of such a section when you modify the
|
---|
| 5047 | - Document means that it remains a section "Entitled XYZ" according
|
---|
| 5048 | - to this definition.
|
---|
| 5049 | -
|
---|
| 5050 | - The Document may include Warranty Disclaimers next to the notice
|
---|
| 5051 | - which states that this License applies to the Document. These
|
---|
| 5052 | - Warranty Disclaimers are considered to be included by reference in
|
---|
| 5053 | - this License, but only as regards disclaiming warranties: any other
|
---|
| 5054 | - implication that these Warranty Disclaimers may have is void and
|
---|
| 5055 | - has no effect on the meaning of this License.
|
---|
| 5056 | -
|
---|
| 5057 | - 2. VERBATIM COPYING
|
---|
| 5058 | -
|
---|
| 5059 | - You may copy and distribute the Document in any medium, either
|
---|
| 5060 | - commercially or noncommercially, provided that this License, the
|
---|
| 5061 | - copyright notices, and the license notice saying this License
|
---|
| 5062 | - applies to the Document are reproduced in all copies, and that you
|
---|
| 5063 | - add no other conditions whatsoever to those of this License. You
|
---|
| 5064 | - may not use technical measures to obstruct or control the reading
|
---|
| 5065 | - or further copying of the copies you make or distribute. However,
|
---|
| 5066 | - you may accept compensation in exchange for copies. If you
|
---|
| 5067 | - distribute a large enough number of copies you must also follow the
|
---|
| 5068 | - conditions in section 3.
|
---|
| 5069 | -
|
---|
| 5070 | - You may also lend copies, under the same conditions stated above,
|
---|
| 5071 | - and you may publicly display copies.
|
---|
| 5072 | -
|
---|
| 5073 | - 3. COPYING IN QUANTITY
|
---|
| 5074 | -
|
---|
| 5075 | - If you publish printed copies (or copies in media that commonly
|
---|
| 5076 | - have printed covers) of the Document, numbering more than 100, and
|
---|
| 5077 | - the Document's license notice requires Cover Texts, you must
|
---|
| 5078 | - enclose the copies in covers that carry, clearly and legibly, all
|
---|
| 5079 | - these Cover Texts: Front-Cover Texts on the front cover, and
|
---|
| 5080 | - Back-Cover Texts on the back cover. Both covers must also clearly
|
---|
| 5081 | - and legibly identify you as the publisher of these copies. The
|
---|
| 5082 | - front cover must present the full title with all words of the title
|
---|
| 5083 | - equally prominent and visible. You may add other material on the
|
---|
| 5084 | - covers in addition. Copying with changes limited to the covers, as
|
---|
| 5085 | - long as they preserve the title of the Document and satisfy these
|
---|
| 5086 | - conditions, can be treated as verbatim copying in other respects.
|
---|
| 5087 | -
|
---|
| 5088 | - If the required texts for either cover are too voluminous to fit
|
---|
| 5089 | - legibly, you should put the first ones listed (as many as fit
|
---|
| 5090 | - reasonably) on the actual cover, and continue the rest onto
|
---|
| 5091 | - adjacent pages.
|
---|
| 5092 | -
|
---|
| 5093 | - If you publish or distribute Opaque copies of the Document
|
---|
| 5094 | - numbering more than 100, you must either include a machine-readable
|
---|
| 5095 | - Transparent copy along with each Opaque copy, or state in or with
|
---|
| 5096 | - each Opaque copy a computer-network location from which the general
|
---|
| 5097 | - network-using public has access to download using public-standard
|
---|
| 5098 | - network protocols a complete Transparent copy of the Document, free
|
---|
| 5099 | - of added material. If you use the latter option, you must take
|
---|
| 5100 | - reasonably prudent steps, when you begin distribution of Opaque
|
---|
| 5101 | - copies in quantity, to ensure that this Transparent copy will
|
---|
| 5102 | - remain thus accessible at the stated location until at least one
|
---|
| 5103 | - year after the last time you distribute an Opaque copy (directly or
|
---|
| 5104 | - through your agents or retailers) of that edition to the public.
|
---|
| 5105 | -
|
---|
| 5106 | - It is requested, but not required, that you contact the authors of
|
---|
| 5107 | - the Document well before redistributing any large number of copies,
|
---|
| 5108 | - to give them a chance to provide you with an updated version of the
|
---|
| 5109 | - Document.
|
---|
| 5110 | -
|
---|
| 5111 | - 4. MODIFICATIONS
|
---|
| 5112 | -
|
---|
| 5113 | - You may copy and distribute a Modified Version of the Document
|
---|
| 5114 | - under the conditions of sections 2 and 3 above, provided that you
|
---|
| 5115 | - release the Modified Version under precisely this License, with the
|
---|
| 5116 | - Modified Version filling the role of the Document, thus licensing
|
---|
| 5117 | - distribution and modification of the Modified Version to whoever
|
---|
| 5118 | - possesses a copy of it. In addition, you must do these things in
|
---|
| 5119 | - the Modified Version:
|
---|
| 5120 | -
|
---|
| 5121 | - A. Use in the Title Page (and on the covers, if any) a title
|
---|
| 5122 | - distinct from that of the Document, and from those of previous
|
---|
| 5123 | - versions (which should, if there were any, be listed in the
|
---|
| 5124 | - History section of the Document). You may use the same title
|
---|
| 5125 | - as a previous version if the original publisher of that
|
---|
| 5126 | - version gives permission.
|
---|
| 5127 | -
|
---|
| 5128 | - B. List on the Title Page, as authors, one or more persons or
|
---|
| 5129 | - entities responsible for authorship of the modifications in
|
---|
| 5130 | - the Modified Version, together with at least five of the
|
---|
| 5131 | - principal authors of the Document (all of its principal
|
---|
| 5132 | - authors, if it has fewer than five), unless they release you
|
---|
| 5133 | - from this requirement.
|
---|
| 5134 | -
|
---|
| 5135 | - C. State on the Title page the name of the publisher of the
|
---|
| 5136 | - Modified Version, as the publisher.
|
---|
| 5137 | -
|
---|
| 5138 | - D. Preserve all the copyright notices of the Document.
|
---|
| 5139 | -
|
---|
| 5140 | - E. Add an appropriate copyright notice for your modifications
|
---|
| 5141 | - adjacent to the other copyright notices.
|
---|
| 5142 | -
|
---|
| 5143 | - F. Include, immediately after the copyright notices, a license
|
---|
| 5144 | - notice giving the public permission to use the Modified
|
---|
| 5145 | - Version under the terms of this License, in the form shown in
|
---|
| 5146 | - the Addendum below.
|
---|
| 5147 | -
|
---|
| 5148 | - G. Preserve in that license notice the full lists of Invariant
|
---|
| 5149 | - Sections and required Cover Texts given in the Document's
|
---|
| 5150 | - license notice.
|
---|
| 5151 | -
|
---|
| 5152 | - H. Include an unaltered copy of this License.
|
---|
| 5153 | -
|
---|
| 5154 | - I. Preserve the section Entitled "History", Preserve its Title,
|
---|
| 5155 | - and add to it an item stating at least the title, year, new
|
---|
| 5156 | - authors, and publisher of the Modified Version as given on the
|
---|
| 5157 | - Title Page. If there is no section Entitled "History" in the
|
---|
| 5158 | - Document, create one stating the title, year, authors, and
|
---|
| 5159 | - publisher of the Document as given on its Title Page, then add
|
---|
| 5160 | - an item describing the Modified Version as stated in the
|
---|
| 5161 | - previous sentence.
|
---|
| 5162 | -
|
---|
| 5163 | - J. Preserve the network location, if any, given in the Document
|
---|
| 5164 | - for public access to a Transparent copy of the Document, and
|
---|
| 5165 | - likewise the network locations given in the Document for
|
---|
| 5166 | - previous versions it was based on. These may be placed in the
|
---|
| 5167 | - "History" section. You may omit a network location for a work
|
---|
| 5168 | - that was published at least four years before the Document
|
---|
| 5169 | - itself, or if the original publisher of the version it refers
|
---|
| 5170 | - to gives permission.
|
---|
| 5171 | -
|
---|
| 5172 | - K. For any section Entitled "Acknowledgements" or "Dedications",
|
---|
| 5173 | - Preserve the Title of the section, and preserve in the section
|
---|
| 5174 | - all the substance and tone of each of the contributor
|
---|
| 5175 | - acknowledgements and/or dedications given therein.
|
---|
| 5176 | -
|
---|
| 5177 | - L. Preserve all the Invariant Sections of the Document, unaltered
|
---|
| 5178 | - in their text and in their titles. Section numbers or the
|
---|
| 5179 | - equivalent are not considered part of the section titles.
|
---|
| 5180 | -
|
---|
| 5181 | - M. Delete any section Entitled "Endorsements". Such a section
|
---|
| 5182 | - may not be included in the Modified Version.
|
---|
| 5183 | -
|
---|
| 5184 | - N. Do not retitle any existing section to be Entitled
|
---|
| 5185 | - "Endorsements" or to conflict in title with any Invariant
|
---|
| 5186 | - Section.
|
---|
| 5187 | -
|
---|
| 5188 | - O. Preserve any Warranty Disclaimers.
|
---|
| 5189 | -
|
---|
| 5190 | - If the Modified Version includes new front-matter sections or
|
---|
| 5191 | - appendices that qualify as Secondary Sections and contain no
|
---|
| 5192 | - material copied from the Document, you may at your option designate
|
---|
| 5193 | - some or all of these sections as invariant. To do this, add their
|
---|
| 5194 | - titles to the list of Invariant Sections in the Modified Version's
|
---|
| 5195 | - license notice. These titles must be distinct from any other
|
---|
| 5196 | - section titles.
|
---|
| 5197 | -
|
---|
| 5198 | - You may add a section Entitled "Endorsements", provided it contains
|
---|
| 5199 | - nothing but endorsements of your Modified Version by various
|
---|
| 5200 | - parties--for example, statements of peer review or that the text
|
---|
| 5201 | - has been approved by an organization as the authoritative
|
---|
| 5202 | - definition of a standard.
|
---|
| 5203 | -
|
---|
| 5204 | - You may add a passage of up to five words as a Front-Cover Text,
|
---|
| 5205 | - and a passage of up to 25 words as a Back-Cover Text, to the end of
|
---|
| 5206 | - the list of Cover Texts in the Modified Version. Only one passage
|
---|
| 5207 | - of Front-Cover Text and one of Back-Cover Text may be added by (or
|
---|
| 5208 | - through arrangements made by) any one entity. If the Document
|
---|
| 5209 | - already includes a cover text for the same cover, previously added
|
---|
| 5210 | - by you or by arrangement made by the same entity you are acting on
|
---|
| 5211 | - behalf of, you may not add another; but you may replace the old
|
---|
| 5212 | - one, on explicit permission from the previous publisher that added
|
---|
| 5213 | - the old one.
|
---|
| 5214 | -
|
---|
| 5215 | - The author(s) and publisher(s) of the Document do not by this
|
---|
| 5216 | - License give permission to use their names for publicity for or to
|
---|
| 5217 | - assert or imply endorsement of any Modified Version.
|
---|
| 5218 | -
|
---|
| 5219 | - 5. COMBINING DOCUMENTS
|
---|
| 5220 | -
|
---|
| 5221 | - You may combine the Document with other documents released under
|
---|
| 5222 | - this License, under the terms defined in section 4 above for
|
---|
| 5223 | - modified versions, provided that you include in the combination all
|
---|
| 5224 | - of the Invariant Sections of all of the original documents,
|
---|
| 5225 | - unmodified, and list them all as Invariant Sections of your
|
---|
| 5226 | - combined work in its license notice, and that you preserve all
|
---|
| 5227 | - their Warranty Disclaimers.
|
---|
| 5228 | -
|
---|
| 5229 | - The combined work need only contain one copy of this License, and
|
---|
| 5230 | - multiple identical Invariant Sections may be replaced with a single
|
---|
| 5231 | - copy. If there are multiple Invariant Sections with the same name
|
---|
| 5232 | - but different contents, make the title of each such section unique
|
---|
| 5233 | - by adding at the end of it, in parentheses, the name of the
|
---|
| 5234 | - original author or publisher of that section if known, or else a
|
---|
| 5235 | - unique number. Make the same adjustment to the section titles in
|
---|
| 5236 | - the list of Invariant Sections in the license notice of the
|
---|
| 5237 | - combined work.
|
---|
| 5238 | -
|
---|
| 5239 | - In the combination, you must combine any sections Entitled
|
---|
| 5240 | - "History" in the various original documents, forming one section
|
---|
| 5241 | - Entitled "History"; likewise combine any sections Entitled
|
---|
| 5242 | - "Acknowledgements", and any sections Entitled "Dedications". You
|
---|
| 5243 | - must delete all sections Entitled "Endorsements."
|
---|
| 5244 | -
|
---|
| 5245 | - 6. COLLECTIONS OF DOCUMENTS
|
---|
| 5246 | -
|
---|
| 5247 | - You may make a collection consisting of the Document and other
|
---|
| 5248 | - documents released under this License, and replace the individual
|
---|
| 5249 | - copies of this License in the various documents with a single copy
|
---|
| 5250 | - that is included in the collection, provided that you follow the
|
---|
| 5251 | - rules of this License for verbatim copying of each of the documents
|
---|
| 5252 | - in all other respects.
|
---|
| 5253 | -
|
---|
| 5254 | - You may extract a single document from such a collection, and
|
---|
| 5255 | - distribute it individually under this License, provided you insert
|
---|
| 5256 | - a copy of this License into the extracted document, and follow this
|
---|
| 5257 | - License in all other respects regarding verbatim copying of that
|
---|
| 5258 | - document.
|
---|
| 5259 | -
|
---|
| 5260 | - 7. AGGREGATION WITH INDEPENDENT WORKS
|
---|
| 5261 | -
|
---|
| 5262 | - A compilation of the Document or its derivatives with other
|
---|
| 5263 | - separate and independent documents or works, in or on a volume of a
|
---|
| 5264 | - storage or distribution medium, is called an "aggregate" if the
|
---|
| 5265 | - copyright resulting from the compilation is not used to limit the
|
---|
| 5266 | - legal rights of the compilation's users beyond what the individual
|
---|
| 5267 | - works permit. When the Document is included in an aggregate, this
|
---|
| 5268 | - License does not apply to the other works in the aggregate which
|
---|
| 5269 | - are not themselves derivative works of the Document.
|
---|
| 5270 | -
|
---|
| 5271 | - If the Cover Text requirement of section 3 is applicable to these
|
---|
| 5272 | - copies of the Document, then if the Document is less than one half
|
---|
| 5273 | - of the entire aggregate, the Document's Cover Texts may be placed
|
---|
| 5274 | - on covers that bracket the Document within the aggregate, or the
|
---|
| 5275 | - electronic equivalent of covers if the Document is in electronic
|
---|
| 5276 | - form. Otherwise they must appear on printed covers that bracket
|
---|
| 5277 | - the whole aggregate.
|
---|
| 5278 | -
|
---|
| 5279 | - 8. TRANSLATION
|
---|
| 5280 | -
|
---|
| 5281 | - Translation is considered a kind of modification, so you may
|
---|
| 5282 | - distribute translations of the Document under the terms of section
|
---|
| 5283 | - 4. Replacing Invariant Sections with translations requires special
|
---|
| 5284 | - permission from their copyright holders, but you may include
|
---|
| 5285 | - translations of some or all Invariant Sections in addition to the
|
---|
| 5286 | - original versions of these Invariant Sections. You may include a
|
---|
| 5287 | - translation of this License, and all the license notices in the
|
---|
| 5288 | - Document, and any Warranty Disclaimers, provided that you also
|
---|
| 5289 | - include the original English version of this License and the
|
---|
| 5290 | - original versions of those notices and disclaimers. In case of a
|
---|
| 5291 | - disagreement between the translation and the original version of
|
---|
| 5292 | - this License or a notice or disclaimer, the original version will
|
---|
| 5293 | - prevail.
|
---|
| 5294 | -
|
---|
| 5295 | - If a section in the Document is Entitled "Acknowledgements",
|
---|
| 5296 | - "Dedications", or "History", the requirement (section 4) to
|
---|
| 5297 | - Preserve its Title (section 1) will typically require changing the
|
---|
| 5298 | - actual title.
|
---|
| 5299 | -
|
---|
| 5300 | - 9. TERMINATION
|
---|
| 5301 | -
|
---|
| 5302 | - You may not copy, modify, sublicense, or distribute the Document
|
---|
| 5303 | - except as expressly provided under this License. Any attempt
|
---|
| 5304 | - otherwise to copy, modify, sublicense, or distribute it is void,
|
---|
| 5305 | - and will automatically terminate your rights under this License.
|
---|
| 5306 | -
|
---|
| 5307 | - However, if you cease all violation of this License, then your
|
---|
| 5308 | - license from a particular copyright holder is reinstated (a)
|
---|
| 5309 | - provisionally, unless and until the copyright holder explicitly and
|
---|
| 5310 | - finally terminates your license, and (b) permanently, if the
|
---|
| 5311 | - copyright holder fails to notify you of the violation by some
|
---|
| 5312 | - reasonable means prior to 60 days after the cessation.
|
---|
| 5313 | -
|
---|
| 5314 | - Moreover, your license from a particular copyright holder is
|
---|
| 5315 | - reinstated permanently if the copyright holder notifies you of the
|
---|
| 5316 | - violation by some reasonable means, this is the first time you have
|
---|
| 5317 | - received notice of violation of this License (for any work) from
|
---|
| 5318 | - that copyright holder, and you cure the violation prior to 30 days
|
---|
| 5319 | - after your receipt of the notice.
|
---|
| 5320 | -
|
---|
| 5321 | - Termination of your rights under this section does not terminate
|
---|
| 5322 | - the licenses of parties who have received copies or rights from you
|
---|
| 5323 | - under this License. If your rights have been terminated and not
|
---|
| 5324 | - permanently reinstated, receipt of a copy of some or all of the
|
---|
| 5325 | - same material does not give you any rights to use it.
|
---|
| 5326 | -
|
---|
| 5327 | - 10. FUTURE REVISIONS OF THIS LICENSE
|
---|
| 5328 | -
|
---|
| 5329 | - The Free Software Foundation may publish new, revised versions of
|
---|
| 5330 | - the GNU Free Documentation License from time to time. Such new
|
---|
| 5331 | - versions will be similar in spirit to the present version, but may
|
---|
| 5332 | - differ in detail to address new problems or concerns. See
|
---|
| 5333 | - <http://www.gnu.org/copyleft/>.
|
---|
| 5334 | -
|
---|
| 5335 | - Each version of the License is given a distinguishing version
|
---|
| 5336 | - number. If the Document specifies that a particular numbered
|
---|
| 5337 | - version of this License "or any later version" applies to it, you
|
---|
| 5338 | - have the option of following the terms and conditions either of
|
---|
| 5339 | - that specified version or of any later version that has been
|
---|
| 5340 | - published (not as a draft) by the Free Software Foundation. If the
|
---|
| 5341 | - Document does not specify a version number of this License, you may
|
---|
| 5342 | - choose any version ever published (not as a draft) by the Free
|
---|
| 5343 | - Software Foundation. If the Document specifies that a proxy can
|
---|
| 5344 | - decide which future versions of this License can be used, that
|
---|
| 5345 | - proxy's public statement of acceptance of a version permanently
|
---|
| 5346 | - authorizes you to choose that version for the Document.
|
---|
| 5347 | -
|
---|
| 5348 | - 11. RELICENSING
|
---|
| 5349 | -
|
---|
| 5350 | - "Massive Multiauthor Collaboration Site" (or "MMC Site") means any
|
---|
| 5351 | - World Wide Web server that publishes copyrightable works and also
|
---|
| 5352 | - provides prominent facilities for anybody to edit those works. A
|
---|
| 5353 | - public wiki that anybody can edit is an example of such a server.
|
---|
| 5354 | - A "Massive Multiauthor Collaboration" (or "MMC") contained in the
|
---|
| 5355 | - site means any set of copyrightable works thus published on the MMC
|
---|
| 5356 | - site.
|
---|
| 5357 | -
|
---|
| 5358 | - "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
|
---|
| 5359 | - license published by Creative Commons Corporation, a not-for-profit
|
---|
| 5360 | - corporation with a principal place of business in San Francisco,
|
---|
| 5361 | - California, as well as future copyleft versions of that license
|
---|
| 5362 | - published by that same organization.
|
---|
| 5363 | -
|
---|
| 5364 | - "Incorporate" means to publish or republish a Document, in whole or
|
---|
| 5365 | - in part, as part of another Document.
|
---|
| 5366 | -
|
---|
| 5367 | - An MMC is "eligible for relicensing" if it is licensed under this
|
---|
| 5368 | - License, and if all works that were first published under this
|
---|
| 5369 | - License somewhere other than this MMC, and subsequently
|
---|
| 5370 | - incorporated in whole or in part into the MMC, (1) had no cover
|
---|
| 5371 | - texts or invariant sections, and (2) were thus incorporated prior
|
---|
| 5372 | - to November 1, 2008.
|
---|
| 5373 | -
|
---|
| 5374 | - The operator of an MMC Site may republish an MMC contained in the
|
---|
| 5375 | - site under CC-BY-SA on the same site at any time before August 1,
|
---|
| 5376 | - 2009, provided the MMC is eligible for relicensing.
|
---|
| 5377 | -
|
---|
| 5378 | -ADDENDUM: How to use this License for your documents
|
---|
| 5379 | -====================================================
|
---|
| 5380 | -
|
---|
| 5381 | -To use this License in a document you have written, include a copy of
|
---|
| 5382 | -the License in the document and put the following copyright and license
|
---|
| 5383 | -notices just after the title page:
|
---|
| 5384 | -
|
---|
| 5385 | - Copyright (C) YEAR YOUR NAME.
|
---|
| 5386 | - Permission is granted to copy, distribute and/or modify this document
|
---|
| 5387 | - under the terms of the GNU Free Documentation License, Version 1.3
|
---|
| 5388 | - or any later version published by the Free Software Foundation;
|
---|
| 5389 | - with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
|
---|
| 5390 | - Texts. A copy of the license is included in the section entitled ``GNU
|
---|
| 5391 | - Free Documentation License''.
|
---|
| 5392 | -
|
---|
| 5393 | - If you have Invariant Sections, Front-Cover Texts and Back-Cover
|
---|
| 5394 | -Texts, replace the "with...Texts." line with this:
|
---|
| 5395 | -
|
---|
| 5396 | - with the Invariant Sections being LIST THEIR TITLES, with
|
---|
| 5397 | - the Front-Cover Texts being LIST, and with the Back-Cover Texts
|
---|
| 5398 | - being LIST.
|
---|
| 5399 | -
|
---|
| 5400 | - If you have Invariant Sections without Cover Texts, or some other
|
---|
| 5401 | -combination of the three, merge those two alternatives to suit the
|
---|
| 5402 | -situation.
|
---|
| 5403 | -
|
---|
| 5404 | - If your document contains nontrivial examples of program code, we
|
---|
| 5405 | -recommend releasing these examples in parallel under your choice of free
|
---|
| 5406 | -software license, such as the GNU General Public License, to permit
|
---|
| 5407 | -their use in free software.
|
---|
| 5408 | -
|
---|
| 5409 | -
|
---|
| 5410 | -File: libitm.info, Node: Index, Prev: GNU Free Documentation License, Up: Top
|
---|
| 5411 | -
|
---|
| 5412 | -Index
|
---|
| 5413 | -*****
|
---|
| 5414 | -
|
---|
| 5415 | -[index]
|
---|
| 5416 | -* Menu:
|
---|
| 5417 | -
|
---|
| 5418 | -* FDL, GNU Free Documentation License: GNU Free Documentation License.
|
---|
| 5419 | - (line 6)
|
---|
| 5420 | -* Introduction: Top. (line 6)
|
---|
| 5421 | -
|
---|
| 5422 | -
|
---|
| 5423 | -
|
---|
| 5424 | -Tag Table:
|
---|
| 5425 | -Node: Top1141
|
---|
| 5426 | -Node: Enabling libitm2045
|
---|
| 5427 | -Node: C/C++ Language Constructs for TM2440
|
---|
| 5428 | -Node: The libitm ABI3923
|
---|
| 5429 | -Ref: txn-code-properties7721
|
---|
| 5430 | -Node: Internals18026
|
---|
| 5431 | -Ref: serial-lock-impl28064
|
---|
| 5432 | -Ref: progress-guarantees32825
|
---|
| 5433 | -Node: GNU Free Documentation License35103
|
---|
| 5434 | -Node: Index60224
|
---|
[88af5df] | 5435 | -
|
---|
| 5436 | -End Tag Table
|
---|
[2e59d11] | 5437 | diff -Naur gcc-4.8.2.orig/libquadmath/libquadmath.info gcc-4.8.2/libquadmath/libquadmath.info
|
---|
| 5438 | --- gcc-4.8.2.orig/libquadmath/libquadmath.info 2013-10-16 08:18:56.000000000 +0000
|
---|
| 5439 | +++ gcc-4.8.2/libquadmath/libquadmath.info 1970-01-01 00:00:00.000000000 +0000
|
---|
| 5440 | @@ -1,808 +0,0 @@
|
---|
| 5441 | -This is libquadmath.info, produced by makeinfo version 5.1 from
|
---|
| 5442 | -libquadmath.texi.
|
---|
| 5443 | -
|
---|
| 5444 | -Copyright (C) 2010-2013 Free Software Foundation, Inc.
|
---|
| 5445 | -
|
---|
| 5446 | - Permission is granted to copy, distribute and/or modify this
|
---|
| 5447 | - document under the terms of the GNU Free Documentation License,
|
---|
| 5448 | - Version 1.2 or any later version published by the Free Software
|
---|
| 5449 | - Foundation; with no Invariant Sections, with the Front-Cover Texts
|
---|
| 5450 | - being "A GNU Manual," and with the Back-Cover Texts as in (a)
|
---|
| 5451 | - below. A copy of the license is included in the section entitled
|
---|
| 5452 | - "GNU Free Documentation License."
|
---|
| 5453 | -
|
---|
| 5454 | - (a) The FSF's Back-Cover Text is: "You have the freedom to copy and
|
---|
| 5455 | - modify this GNU manual.
|
---|
| 5456 | -INFO-DIR-SECTION GNU Libraries
|
---|
| 5457 | -START-INFO-DIR-ENTRY
|
---|
| 5458 | -* libquadmath: (libquadmath). GCC Quad-Precision Math Library
|
---|
| 5459 | -END-INFO-DIR-ENTRY
|
---|
| 5460 | -
|
---|
| 5461 | - This manual documents the GCC Quad-Precision Math Library API.
|
---|
| 5462 | -
|
---|
| 5463 | - Published by the Free Software Foundation 51 Franklin Street, Fifth
|
---|
| 5464 | -Floor Boston, MA 02110-1301 USA
|
---|
| 5465 | -
|
---|
| 5466 | - Copyright (C) 2010-2013 Free Software Foundation, Inc.
|
---|
| 5467 | -
|
---|
| 5468 | - Permission is granted to copy, distribute and/or modify this
|
---|
| 5469 | - document under the terms of the GNU Free Documentation License,
|
---|
| 5470 | - Version 1.2 or any later version published by the Free Software
|
---|
| 5471 | - Foundation; with no Invariant Sections, with the Front-Cover Texts
|
---|
| 5472 | - being "A GNU Manual," and with the Back-Cover Texts as in (a)
|
---|
| 5473 | - below. A copy of the license is included in the section entitled
|
---|
| 5474 | - "GNU Free Documentation License."
|
---|
| 5475 | -
|
---|
| 5476 | - (a) The FSF's Back-Cover Text is: "You have the freedom to copy and
|
---|
| 5477 | - modify this GNU manual.
|
---|
| 5478 | -
|
---|
| 5479 | -
|
---|
| 5480 | -File: libquadmath.info, Node: Top, Next: Typedef and constants, Up: (dir)
|
---|
| 5481 | -
|
---|
| 5482 | -Introduction
|
---|
| 5483 | -************
|
---|
| 5484 | -
|
---|
| 5485 | -This manual documents the usage of libquadmath, the GCC Quad-Precision
|
---|
| 5486 | -Math Library Application Programming Interface (API).
|
---|
| 5487 | -
|
---|
| 5488 | -* Menu:
|
---|
| 5489 | -
|
---|
| 5490 | -* Typedef and constants:: Defined data types and constants
|
---|
| 5491 | -* Math Library Routines:: The Libquadmath math runtime application
|
---|
| 5492 | - programming interface.
|
---|
| 5493 | -* I/O Library Routines:: The Libquadmath I/O runtime application
|
---|
| 5494 | - programming interface.
|
---|
| 5495 | -* GNU Free Documentation License::
|
---|
| 5496 | - How you can copy and share this manual.
|
---|
| 5497 | -* Reporting Bugs:: How to report bugs in GCC Libquadmath.
|
---|
| 5498 | -
|
---|
| 5499 | -
|
---|
| 5500 | -File: libquadmath.info, Node: Typedef and constants, Next: Math Library Routines, Prev: Top, Up: Top
|
---|
| 5501 | -
|
---|
| 5502 | -1 Typedef and constants
|
---|
| 5503 | -***********************
|
---|
| 5504 | -
|
---|
| 5505 | -The following data type has been defined via 'typedef'.
|
---|
| 5506 | -
|
---|
| 5507 | -'__complex128': '__float128'-based complex number
|
---|
| 5508 | -
|
---|
| 5509 | - The following macros are defined, which give the numeric limits of
|
---|
| 5510 | -the '__float128' data type.
|
---|
| 5511 | -
|
---|
| 5512 | -'FLT128_MAX': largest finite number
|
---|
| 5513 | -'FLT128_MIN': smallest positive number with full precision
|
---|
| 5514 | -'FLT128_EPSILON': difference between 1 and the next larger
|
---|
| 5515 | - representable number
|
---|
| 5516 | -'FLT128_DENORM_MIN': smallest positive denormalized number
|
---|
| 5517 | -'FLT128_MANT_DIG': number of digits in the mantissa (bit precision)
|
---|
| 5518 | -'FLT128_MIN_EXP': maximal negative exponent
|
---|
| 5519 | -'FLT128_MAX_EXP': maximal positive exponent
|
---|
| 5520 | -'FLT128_DIG': number of decimal digits in the mantissa
|
---|
| 5521 | -'FLT128_MIN_10_EXP': maximal negative decimal exponent
|
---|
| 5522 | -'FLT128_MAX_10_EXP': maximal positive decimal exponent
|
---|
| 5523 | -
|
---|
| 5524 | - The following mathematical constants of type '__float128' are
|
---|
| 5525 | -defined.
|
---|
| 5526 | -
|
---|
| 5527 | -'M_Eq': the constant e (Euler's number)
|
---|
| 5528 | -'M_LOG2Eq': binary logarithm of 2
|
---|
| 5529 | -'M_LOG10Eq': common, decimal logarithm of 2
|
---|
| 5530 | -'M_LN2q': natural logarithm of 2
|
---|
| 5531 | -'M_LN10q': natural logarithm of 10
|
---|
| 5532 | -'M_PIq': pi
|
---|
| 5533 | -'M_PI_2q': pi divided by two
|
---|
| 5534 | -'M_PI_4q': pi divided by four
|
---|
| 5535 | -'M_1_PIq': one over pi
|
---|
| 5536 | -'M_2_PIq': one over two pi
|
---|
| 5537 | -'M_2_SQRTPIq': two over square root of pi
|
---|
| 5538 | -'M_SQRT2q': square root of 2
|
---|
| 5539 | -'M_SQRT1_2q': one over square root of 2
|
---|
| 5540 | -
|
---|
| 5541 | -
|
---|
| 5542 | -File: libquadmath.info, Node: Math Library Routines, Next: I/O Library Routines, Prev: Typedef and constants, Up: Top
|
---|
| 5543 | -
|
---|
| 5544 | -2 Math Library Routines
|
---|
| 5545 | -***********************
|
---|
| 5546 | -
|
---|
| 5547 | -The following mathematical functions are available:
|
---|
| 5548 | -
|
---|
| 5549 | -'acosq': arc cosine function
|
---|
| 5550 | -'acoshq': inverse hyperbolic cosine function
|
---|
| 5551 | -'asinq': arc sine function
|
---|
| 5552 | -'asinhq': inverse hyperbolic sine function
|
---|
| 5553 | -'atanq': arc tangent function
|
---|
| 5554 | -'atanhq': inverse hyperbolic tangent function
|
---|
| 5555 | -'atan2q': arc tangent function
|
---|
| 5556 | -'cbrtq': cube root function
|
---|
| 5557 | -'ceilq': ceiling value function
|
---|
| 5558 | -'copysignq': copy sign of a number
|
---|
| 5559 | -'coshq': hyperbolic cosine function
|
---|
| 5560 | -'cosq': cosine function
|
---|
| 5561 | -'erfq': error function
|
---|
| 5562 | -'erfcq': complementary error function
|
---|
| 5563 | -'expq': exponential function
|
---|
| 5564 | -'expm1q': exponential minus 1 function
|
---|
| 5565 | -'fabsq': absolute value function
|
---|
| 5566 | -'fdimq': positive difference function
|
---|
| 5567 | -'finiteq': check finiteness of value
|
---|
| 5568 | -'floorq': floor value function
|
---|
| 5569 | -'fmaq': fused multiply and add
|
---|
| 5570 | -'fmaxq': determine maximum of two values
|
---|
| 5571 | -'fminq': determine minimum of two values
|
---|
| 5572 | -'fmodq': remainder value function
|
---|
| 5573 | -'frexpq': extract mantissa and exponent
|
---|
| 5574 | -'hypotq': Eucledian distance function
|
---|
| 5575 | -'ilogbq': get exponent of the value
|
---|
| 5576 | -'isinfq': check for infinity
|
---|
| 5577 | -'isnanq': check for not a number
|
---|
| 5578 | -'j0q': Bessel function of the first kind, first order
|
---|
| 5579 | -'j1q': Bessel function of the first kind, second order
|
---|
| 5580 | -'jnq': Bessel function of the first kind, N-th order
|
---|
| 5581 | -'ldexpq': load exponent of the value
|
---|
| 5582 | -'lgammaq': logarithmic gamma function
|
---|
| 5583 | -'llrintq': round to nearest integer value
|
---|
| 5584 | -'llroundq': round to nearest integer value away from zero
|
---|
| 5585 | -'logq': natural logarithm function
|
---|
| 5586 | -'log10q': base 10 logarithm function
|
---|
| 5587 | -'log1pq': compute natural logarithm of the value plus one
|
---|
| 5588 | -'log2q': base 2 logarithm function
|
---|
| 5589 | -'lrintq': round to nearest integer value
|
---|
| 5590 | -'lroundq': round to nearest integer value away from zero
|
---|
| 5591 | -'modfq': decompose the floating-point number
|
---|
| 5592 | -'nanq': return quiet NaN
|
---|
| 5593 | -'nearbyintq': round to nearest integer
|
---|
| 5594 | -'nextafterq': next representable floating-point number
|
---|
| 5595 | -'powq': power function
|
---|
| 5596 | -'remainderq': remainder function
|
---|
| 5597 | -'remquoq': remainder and part of quotient
|
---|
| 5598 | -'rintq': round-to-nearest integral value
|
---|
| 5599 | -'roundq': round-to-nearest integral value, return '__float128'
|
---|
| 5600 | -'scalblnq': compute exponent using 'FLT_RADIX'
|
---|
| 5601 | -'scalbnq': compute exponent using 'FLT_RADIX'
|
---|
| 5602 | -'signbitq': return sign bit
|
---|
| 5603 | -'sincosq': calculate sine and cosine simulataneously
|
---|
| 5604 | -'sinhq': hyperbolic sine function
|
---|
| 5605 | -'sinq': sine function
|
---|
| 5606 | -'sqrtq': square root function
|
---|
| 5607 | -'tanq': tangent function
|
---|
| 5608 | -'tanhq': hyperbolic tangent function
|
---|
| 5609 | -'tgammaq': true gamma function
|
---|
| 5610 | -'truncq': round to integer, towards zero
|
---|
| 5611 | -'y0q': Bessel function of the second kind, first order
|
---|
| 5612 | -'y1q': Bessel function of the second kind, second order
|
---|
| 5613 | -'ynq': Bessel function of the second kind, N-th order
|
---|
| 5614 | -'cabsq' complex absolute value function
|
---|
| 5615 | -'cargq': calculate the argument
|
---|
| 5616 | -'cimagq' imaginary part of complex number
|
---|
| 5617 | -'crealq': real part of complex number
|
---|
| 5618 | -'cacoshq': complex arc hyperbolic cosine function
|
---|
| 5619 | -'cacosq': complex arc cosine function
|
---|
| 5620 | -'casinhq': complex arc hyperbolic sine function
|
---|
| 5621 | -'casinq': complex arc sine function
|
---|
| 5622 | -'catanhq': complex arc hyperbolic tangent function
|
---|
| 5623 | -'catanq': complex arc tangent function
|
---|
| 5624 | -'ccosq' complex cosine function:
|
---|
| 5625 | -'ccoshq': complex hyperbolic cosine function
|
---|
| 5626 | -'cexpq': complex exponential function
|
---|
| 5627 | -'cexpiq': computes the exponential function of "i" times a
|
---|
| 5628 | - real value
|
---|
| 5629 | -'clogq': complex natural logarithm
|
---|
| 5630 | -'clog10q': complex base 10 logarithm
|
---|
| 5631 | -'conjq': complex conjugate function
|
---|
| 5632 | -'cpowq': complex power function
|
---|
| 5633 | -'cprojq': project into Riemann Sphere
|
---|
| 5634 | -'csinq': complex sine function
|
---|
| 5635 | -'csinhq': complex hyperbolic sine function
|
---|
| 5636 | -'csqrtq': complex square root
|
---|
| 5637 | -'ctanq': complex tangent function
|
---|
| 5638 | -'ctanhq': complex hyperbolic tangent function
|
---|
| 5639 | -
|
---|
| 5640 | -
|
---|
| 5641 | -File: libquadmath.info, Node: I/O Library Routines, Next: GNU Free Documentation License, Prev: Math Library Routines, Up: Top
|
---|
| 5642 | -
|
---|
| 5643 | -3 I/O Library Routines
|
---|
| 5644 | -**********************
|
---|
| 5645 | -
|
---|
| 5646 | -* Menu:
|
---|
| 5647 | -
|
---|
| 5648 | -* 'strtoflt128': strtoflt128, Convert from string
|
---|
| 5649 | -* 'quadmath_snprintf': quadmath_snprintf, Convert to string
|
---|
| 5650 | -
|
---|
| 5651 | -
|
---|
| 5652 | -File: libquadmath.info, Node: strtoflt128, Next: quadmath_snprintf, Up: I/O Library Routines
|
---|
| 5653 | -
|
---|
| 5654 | -3.1 'strtoflt128' -- Convert from string
|
---|
| 5655 | -========================================
|
---|
| 5656 | -
|
---|
| 5657 | -The function 'strtoflt128' converts a string into a '__float128' number.
|
---|
| 5658 | -
|
---|
| 5659 | -Syntax
|
---|
| 5660 | - '__float128 strtoflt128 (const char *s, char **sp)'
|
---|
| 5661 | -
|
---|
| 5662 | -_Arguments_:
|
---|
| 5663 | - S input string
|
---|
| 5664 | - SP the address of the next character in the string
|
---|
| 5665 | -
|
---|
| 5666 | - The argument SP contains, if not 'NULL', the address of the next
|
---|
| 5667 | - character following the parts of the string, which have been read.
|
---|
| 5668 | -
|
---|
| 5669 | -Example
|
---|
| 5670 | - #include <quadmath.h>
|
---|
| 5671 | -
|
---|
| 5672 | - int main ()
|
---|
| 5673 | - {
|
---|
| 5674 | - __float128 r;
|
---|
| 5675 | -
|
---|
| 5676 | - r = strtoflt128 ("1.2345678", NULL);
|
---|
| 5677 | -
|
---|
| 5678 | - return 0;
|
---|
| 5679 | - }
|
---|
| 5680 | -
|
---|
| 5681 | -
|
---|
| 5682 | -File: libquadmath.info, Node: quadmath_snprintf, Prev: strtoflt128, Up: I/O Library Routines
|
---|
| 5683 | -
|
---|
| 5684 | -3.2 'quadmath_snprintf' -- Convert to string
|
---|
| 5685 | -============================================
|
---|
| 5686 | -
|
---|
| 5687 | -The function 'quadmath_snprintf' converts a '__float128' floating-point
|
---|
| 5688 | -number into a string. It is a specialized alternative to 'snprintf',
|
---|
| 5689 | -where the format string is restricted to a single conversion specifier
|
---|
| 5690 | -with 'Q' modifier and conversion specifier 'e', 'E', 'f', 'F', 'g', 'G',
|
---|
| 5691 | -'a' or 'A', with no extra characters before or after the conversion
|
---|
| 5692 | -specifier. The '%m$' or '*m$' style must not be used in the format.
|
---|
| 5693 | -
|
---|
| 5694 | -Syntax
|
---|
| 5695 | - 'int quadmath_snprintf (char *s, size_t size, const char *format,
|
---|
| 5696 | - ...)'
|
---|
| 5697 | -
|
---|
| 5698 | -_Arguments_:
|
---|
| 5699 | - S output string
|
---|
| 5700 | - SIZE byte size of the string, including tailing NUL
|
---|
| 5701 | - FORMAT conversion specifier string
|
---|
| 5702 | -
|
---|
| 5703 | -Note
|
---|
| 5704 | - On some targets when supported by the C library hooks are installed
|
---|
| 5705 | - for 'printf' family of functions, so that 'printf ("%Qe", 1.2Q);'
|
---|
| 5706 | - etc. works too.
|
---|
| 5707 | -
|
---|
| 5708 | -Example
|
---|
| 5709 | - #include <quadmath.h>
|
---|
| 5710 | - #include <stdlib.h>
|
---|
| 5711 | - #include <stdio.h>
|
---|
| 5712 | -
|
---|
| 5713 | - int main ()
|
---|
| 5714 | - {
|
---|
| 5715 | - __float128 r;
|
---|
| 5716 | - int prec = 20;
|
---|
| 5717 | - int width = 46;
|
---|
| 5718 | - char buf[128];
|
---|
| 5719 | -
|
---|
| 5720 | - r = 2.0q;
|
---|
| 5721 | - r = sqrtq (r);
|
---|
| 5722 | - int n = quadmath_snprintf (buf, sizeof buf, "%+-#*.20Qe", width, r);
|
---|
| 5723 | - if ((size_t) n < sizeof buf)
|
---|
| 5724 | - printf ("%s\n", buf);
|
---|
| 5725 | - /* Prints: +1.41421356237309504880e+00 */
|
---|
| 5726 | - quadmath_snprintf (buf, sizeof buf, "%Qa", r);
|
---|
| 5727 | - if ((size_t) n < sizeof buf)
|
---|
| 5728 | - printf ("%s\n", buf);
|
---|
| 5729 | - /* Prints: 0x1.6a09e667f3bcc908b2fb1366ea96p+0 */
|
---|
| 5730 | - n = quadmath_snprintf (NULL, 0, "%+-#46.*Qe", prec, r);
|
---|
| 5731 | - if (n > -1)
|
---|
| 5732 | - {
|
---|
| 5733 | - char *str = malloc (n + 1);
|
---|
| 5734 | - if (str)
|
---|
| 5735 | - {
|
---|
| 5736 | - quadmath_snprintf (str, n + 1, "%+-#46.*Qe", prec, r);
|
---|
| 5737 | - printf ("%s\n", str);
|
---|
| 5738 | - /* Prints: +1.41421356237309504880e+00 */
|
---|
| 5739 | - }
|
---|
| 5740 | - free (str);
|
---|
| 5741 | - }
|
---|
| 5742 | - return 0;
|
---|
| 5743 | - }
|
---|
| 5744 | -
|
---|
| 5745 | -
|
---|
| 5746 | -File: libquadmath.info, Node: GNU Free Documentation License, Next: Reporting Bugs, Prev: I/O Library Routines, Up: Top
|
---|
| 5747 | -
|
---|
| 5748 | -GNU Free Documentation License
|
---|
| 5749 | -******************************
|
---|
| 5750 | -
|
---|
| 5751 | - Version 1.3, 3 November 2008
|
---|
| 5752 | -
|
---|
| 5753 | - Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
|
---|
| 5754 | - <http://fsf.org/>
|
---|
| 5755 | -
|
---|
| 5756 | - Everyone is permitted to copy and distribute verbatim copies
|
---|
| 5757 | - of this license document, but changing it is not allowed.
|
---|
| 5758 | -
|
---|
| 5759 | - 0. PREAMBLE
|
---|
| 5760 | -
|
---|
| 5761 | - The purpose of this License is to make a manual, textbook, or other
|
---|
| 5762 | - functional and useful document "free" in the sense of freedom: to
|
---|
| 5763 | - assure everyone the effective freedom to copy and redistribute it,
|
---|
| 5764 | - with or without modifying it, either commercially or
|
---|
| 5765 | - noncommercially. Secondarily, this License preserves for the
|
---|
| 5766 | - author and publisher a way to get credit for their work, while not
|
---|
| 5767 | - being considered responsible for modifications made by others.
|
---|
| 5768 | -
|
---|
| 5769 | - This License is a kind of "copyleft", which means that derivative
|
---|
| 5770 | - works of the document must themselves be free in the same sense.
|
---|
| 5771 | - It complements the GNU General Public License, which is a copyleft
|
---|
| 5772 | - license designed for free software.
|
---|
| 5773 | -
|
---|
| 5774 | - We have designed this License in order to use it for manuals for
|
---|
| 5775 | - free software, because free software needs free documentation: a
|
---|
| 5776 | - free program should come with manuals providing the same freedoms
|
---|
| 5777 | - that the software does. But this License is not limited to
|
---|
| 5778 | - software manuals; it can be used for any textual work, regardless
|
---|
| 5779 | - of subject matter or whether it is published as a printed book. We
|
---|
| 5780 | - recommend this License principally for works whose purpose is
|
---|
| 5781 | - instruction or reference.
|
---|
| 5782 | -
|
---|
| 5783 | - 1. APPLICABILITY AND DEFINITIONS
|
---|
| 5784 | -
|
---|
| 5785 | - This License applies to any manual or other work, in any medium,
|
---|
| 5786 | - that contains a notice placed by the copyright holder saying it can
|
---|
| 5787 | - be distributed under the terms of this License. Such a notice
|
---|
| 5788 | - grants a world-wide, royalty-free license, unlimited in duration,
|
---|
| 5789 | - to use that work under the conditions stated herein. The
|
---|
| 5790 | - "Document", below, refers to any such manual or work. Any member
|
---|
| 5791 | - of the public is a licensee, and is addressed as "you". You accept
|
---|
| 5792 | - the license if you copy, modify or distribute the work in a way
|
---|
| 5793 | - requiring permission under copyright law.
|
---|
| 5794 | -
|
---|
| 5795 | - A "Modified Version" of the Document means any work containing the
|
---|
| 5796 | - Document or a portion of it, either copied verbatim, or with
|
---|
| 5797 | - modifications and/or translated into another language.
|
---|
| 5798 | -
|
---|
| 5799 | - A "Secondary Section" is a named appendix or a front-matter section
|
---|
| 5800 | - of the Document that deals exclusively with the relationship of the
|
---|
| 5801 | - publishers or authors of the Document to the Document's overall
|
---|
| 5802 | - subject (or to related matters) and contains nothing that could
|
---|
| 5803 | - fall directly within that overall subject. (Thus, if the Document
|
---|
| 5804 | - is in part a textbook of mathematics, a Secondary Section may not
|
---|
| 5805 | - explain any mathematics.) The relationship could be a matter of
|
---|
| 5806 | - historical connection with the subject or with related matters, or
|
---|
| 5807 | - of legal, commercial, philosophical, ethical or political position
|
---|
| 5808 | - regarding them.
|
---|
| 5809 | -
|
---|
| 5810 | - The "Invariant Sections" are certain Secondary Sections whose
|
---|
| 5811 | - titles are designated, as being those of Invariant Sections, in the
|
---|
| 5812 | - notice that says that the Document is released under this License.
|
---|
| 5813 | - If a section does not fit the above definition of Secondary then it
|
---|
| 5814 | - is not allowed to be designated as Invariant. The Document may
|
---|
| 5815 | - contain zero Invariant Sections. If the Document does not identify
|
---|
| 5816 | - any Invariant Sections then there are none.
|
---|
| 5817 | -
|
---|
| 5818 | - The "Cover Texts" are certain short passages of text that are
|
---|
| 5819 | - listed, as Front-Cover Texts or Back-Cover Texts, in the notice
|
---|
| 5820 | - that says that the Document is released under this License. A
|
---|
| 5821 | - Front-Cover Text may be at most 5 words, and a Back-Cover Text may
|
---|
| 5822 | - be at most 25 words.
|
---|
| 5823 | -
|
---|
| 5824 | - A "Transparent" copy of the Document means a machine-readable copy,
|
---|
| 5825 | - represented in a format whose specification is available to the
|
---|
| 5826 | - general public, that is suitable for revising the document
|
---|
| 5827 | - straightforwardly with generic text editors or (for images composed
|
---|
| 5828 | - of pixels) generic paint programs or (for drawings) some widely
|
---|
| 5829 | - available drawing editor, and that is suitable for input to text
|
---|
| 5830 | - formatters or for automatic translation to a variety of formats
|
---|
| 5831 | - suitable for input to text formatters. A copy made in an otherwise
|
---|
| 5832 | - Transparent file format whose markup, or absence of markup, has
|
---|
| 5833 | - been arranged to thwart or discourage subsequent modification by
|
---|
| 5834 | - readers is not Transparent. An image format is not Transparent if
|
---|
| 5835 | - used for any substantial amount of text. A copy that is not
|
---|
| 5836 | - "Transparent" is called "Opaque".
|
---|
| 5837 | -
|
---|
| 5838 | - Examples of suitable formats for Transparent copies include plain
|
---|
| 5839 | - ASCII without markup, Texinfo input format, LaTeX input format,
|
---|
| 5840 | - SGML or XML using a publicly available DTD, and standard-conforming
|
---|
| 5841 | - simple HTML, PostScript or PDF designed for human modification.
|
---|
| 5842 | - Examples of transparent image formats include PNG, XCF and JPG.
|
---|
| 5843 | - Opaque formats include proprietary formats that can be read and
|
---|
| 5844 | - edited only by proprietary word processors, SGML or XML for which
|
---|
| 5845 | - the DTD and/or processing tools are not generally available, and
|
---|
| 5846 | - the machine-generated HTML, PostScript or PDF produced by some word
|
---|
| 5847 | - processors for output purposes only.
|
---|
| 5848 | -
|
---|
| 5849 | - The "Title Page" means, for a printed book, the title page itself,
|
---|
| 5850 | - plus such following pages as are needed to hold, legibly, the
|
---|
| 5851 | - material this License requires to appear in the title page. For
|
---|
| 5852 | - works in formats which do not have any title page as such, "Title
|
---|
| 5853 | - Page" means the text near the most prominent appearance of the
|
---|
| 5854 | - work's title, preceding the beginning of the body of the text.
|
---|
| 5855 | -
|
---|
| 5856 | - The "publisher" means any person or entity that distributes copies
|
---|
| 5857 | - of the Document to the public.
|
---|
| 5858 | -
|
---|
| 5859 | - A section "Entitled XYZ" means a named subunit of the Document
|
---|
| 5860 | - whose title either is precisely XYZ or contains XYZ in parentheses
|
---|
| 5861 | - following text that translates XYZ in another language. (Here XYZ
|
---|
| 5862 | - stands for a specific section name mentioned below, such as
|
---|
| 5863 | - "Acknowledgements", "Dedications", "Endorsements", or "History".)
|
---|
| 5864 | - To "Preserve the Title" of such a section when you modify the
|
---|
| 5865 | - Document means that it remains a section "Entitled XYZ" according
|
---|
| 5866 | - to this definition.
|
---|
| 5867 | -
|
---|
| 5868 | - The Document may include Warranty Disclaimers next to the notice
|
---|
| 5869 | - which states that this License applies to the Document. These
|
---|
| 5870 | - Warranty Disclaimers are considered to be included by reference in
|
---|
| 5871 | - this License, but only as regards disclaiming warranties: any other
|
---|
| 5872 | - implication that these Warranty Disclaimers may have is void and
|
---|
| 5873 | - has no effect on the meaning of this License.
|
---|
| 5874 | -
|
---|
| 5875 | - 2. VERBATIM COPYING
|
---|
| 5876 | -
|
---|
| 5877 | - You may copy and distribute the Document in any medium, either
|
---|
| 5878 | - commercially or noncommercially, provided that this License, the
|
---|
| 5879 | - copyright notices, and the license notice saying this License
|
---|
| 5880 | - applies to the Document are reproduced in all copies, and that you
|
---|
| 5881 | - add no other conditions whatsoever to those of this License. You
|
---|
| 5882 | - may not use technical measures to obstruct or control the reading
|
---|
| 5883 | - or further copying of the copies you make or distribute. However,
|
---|
| 5884 | - you may accept compensation in exchange for copies. If you
|
---|
| 5885 | - distribute a large enough number of copies you must also follow the
|
---|
| 5886 | - conditions in section 3.
|
---|
| 5887 | -
|
---|
| 5888 | - You may also lend copies, under the same conditions stated above,
|
---|
| 5889 | - and you may publicly display copies.
|
---|
| 5890 | -
|
---|
| 5891 | - 3. COPYING IN QUANTITY
|
---|
| 5892 | -
|
---|
| 5893 | - If you publish printed copies (or copies in media that commonly
|
---|
| 5894 | - have printed covers) of the Document, numbering more than 100, and
|
---|
| 5895 | - the Document's license notice requires Cover Texts, you must
|
---|
| 5896 | - enclose the copies in covers that carry, clearly and legibly, all
|
---|
| 5897 | - these Cover Texts: Front-Cover Texts on the front cover, and
|
---|
| 5898 | - Back-Cover Texts on the back cover. Both covers must also clearly
|
---|
| 5899 | - and legibly identify you as the publisher of these copies. The
|
---|
| 5900 | - front cover must present the full title with all words of the title
|
---|
| 5901 | - equally prominent and visible. You may add other material on the
|
---|
| 5902 | - covers in addition. Copying with changes limited to the covers, as
|
---|
| 5903 | - long as they preserve the title of the Document and satisfy these
|
---|
| 5904 | - conditions, can be treated as verbatim copying in other respects.
|
---|
| 5905 | -
|
---|
| 5906 | - If the required texts for either cover are too voluminous to fit
|
---|
| 5907 | - legibly, you should put the first ones listed (as many as fit
|
---|
| 5908 | - reasonably) on the actual cover, and continue the rest onto
|
---|
| 5909 | - adjacent pages.
|
---|
| 5910 | -
|
---|
| 5911 | - If you publish or distribute Opaque copies of the Document
|
---|
| 5912 | - numbering more than 100, you must either include a machine-readable
|
---|
| 5913 | - Transparent copy along with each Opaque copy, or state in or with
|
---|
| 5914 | - each Opaque copy a computer-network location from which the general
|
---|
| 5915 | - network-using public has access to download using public-standard
|
---|
| 5916 | - network protocols a complete Transparent copy of the Document, free
|
---|
| 5917 | - of added material. If you use the latter option, you must take
|
---|
| 5918 | - reasonably prudent steps, when you begin distribution of Opaque
|
---|
| 5919 | - copies in quantity, to ensure that this Transparent copy will
|
---|
| 5920 | - remain thus accessible at the stated location until at least one
|
---|
| 5921 | - year after the last time you distribute an Opaque copy (directly or
|
---|
| 5922 | - through your agents or retailers) of that edition to the public.
|
---|
| 5923 | -
|
---|
| 5924 | - It is requested, but not required, that you contact the authors of
|
---|
| 5925 | - the Document well before redistributing any large number of copies,
|
---|
| 5926 | - to give them a chance to provide you with an updated version of the
|
---|
| 5927 | - Document.
|
---|
| 5928 | -
|
---|
| 5929 | - 4. MODIFICATIONS
|
---|
| 5930 | -
|
---|
| 5931 | - You may copy and distribute a Modified Version of the Document
|
---|
| 5932 | - under the conditions of sections 2 and 3 above, provided that you
|
---|
| 5933 | - release the Modified Version under precisely this License, with the
|
---|
| 5934 | - Modified Version filling the role of the Document, thus licensing
|
---|
| 5935 | - distribution and modification of the Modified Version to whoever
|
---|
| 5936 | - possesses a copy of it. In addition, you must do these things in
|
---|
| 5937 | - the Modified Version:
|
---|
| 5938 | -
|
---|
| 5939 | - A. Use in the Title Page (and on the covers, if any) a title
|
---|
| 5940 | - distinct from that of the Document, and from those of previous
|
---|
| 5941 | - versions (which should, if there were any, be listed in the
|
---|
| 5942 | - History section of the Document). You may use the same title
|
---|
| 5943 | - as a previous version if the original publisher of that
|
---|
| 5944 | - version gives permission.
|
---|
| 5945 | -
|
---|
| 5946 | - B. List on the Title Page, as authors, one or more persons or
|
---|
| 5947 | - entities responsible for authorship of the modifications in
|
---|
| 5948 | - the Modified Version, together with at least five of the
|
---|
| 5949 | - principal authors of the Document (all of its principal
|
---|
| 5950 | - authors, if it has fewer than five), unless they release you
|
---|
| 5951 | - from this requirement.
|
---|
| 5952 | -
|
---|
| 5953 | - C. State on the Title page the name of the publisher of the
|
---|
| 5954 | - Modified Version, as the publisher.
|
---|
| 5955 | -
|
---|
| 5956 | - D. Preserve all the copyright notices of the Document.
|
---|
| 5957 | -
|
---|
| 5958 | - E. Add an appropriate copyright notice for your modifications
|
---|
| 5959 | - adjacent to the other copyright notices.
|
---|
| 5960 | -
|
---|
| 5961 | - F. Include, immediately after the copyright notices, a license
|
---|
| 5962 | - notice giving the public permission to use the Modified
|
---|
| 5963 | - Version under the terms of this License, in the form shown in
|
---|
| 5964 | - the Addendum below.
|
---|
| 5965 | -
|
---|
| 5966 | - G. Preserve in that license notice the full lists of Invariant
|
---|
| 5967 | - Sections and required Cover Texts given in the Document's
|
---|
| 5968 | - license notice.
|
---|
| 5969 | -
|
---|
| 5970 | - H. Include an unaltered copy of this License.
|
---|
| 5971 | -
|
---|
| 5972 | - I. Preserve the section Entitled "History", Preserve its Title,
|
---|
| 5973 | - and add to it an item stating at least the title, year, new
|
---|
| 5974 | - authors, and publisher of the Modified Version as given on the
|
---|
| 5975 | - Title Page. If there is no section Entitled "History" in the
|
---|
| 5976 | - Document, create one stating the title, year, authors, and
|
---|
| 5977 | - publisher of the Document as given on its Title Page, then add
|
---|
| 5978 | - an item describing the Modified Version as stated in the
|
---|
| 5979 | - previous sentence.
|
---|
| 5980 | -
|
---|
| 5981 | - J. Preserve the network location, if any, given in the Document
|
---|
| 5982 | - for public access to a Transparent copy of the Document, and
|
---|
| 5983 | - likewise the network locations given in the Document for
|
---|
| 5984 | - previous versions it was based on. These may be placed in the
|
---|
| 5985 | - "History" section. You may omit a network location for a work
|
---|
| 5986 | - that was published at least four years before the Document
|
---|
| 5987 | - itself, or if the original publisher of the version it refers
|
---|
| 5988 | - to gives permission.
|
---|
| 5989 | -
|
---|
| 5990 | - K. For any section Entitled "Acknowledgements" or "Dedications",
|
---|
| 5991 | - Preserve the Title of the section, and preserve in the section
|
---|
| 5992 | - all the substance and tone of each of the contributor
|
---|
| 5993 | - acknowledgements and/or dedications given therein.
|
---|
| 5994 | -
|
---|
| 5995 | - L. Preserve all the Invariant Sections of the Document, unaltered
|
---|
| 5996 | - in their text and in their titles. Section numbers or the
|
---|
| 5997 | - equivalent are not considered part of the section titles.
|
---|
| 5998 | -
|
---|
| 5999 | - M. Delete any section Entitled "Endorsements". Such a section
|
---|
| 6000 | - may not be included in the Modified Version.
|
---|
| 6001 | -
|
---|
| 6002 | - N. Do not retitle any existing section to be Entitled
|
---|
| 6003 | - "Endorsements" or to conflict in title with any Invariant
|
---|
| 6004 | - Section.
|
---|
| 6005 | -
|
---|
| 6006 | - O. Preserve any Warranty Disclaimers.
|
---|
| 6007 | -
|
---|
| 6008 | - If the Modified Version includes new front-matter sections or
|
---|
| 6009 | - appendices that qualify as Secondary Sections and contain no
|
---|
| 6010 | - material copied from the Document, you may at your option designate
|
---|
| 6011 | - some or all of these sections as invariant. To do this, add their
|
---|
| 6012 | - titles to the list of Invariant Sections in the Modified Version's
|
---|
| 6013 | - license notice. These titles must be distinct from any other
|
---|
| 6014 | - section titles.
|
---|
| 6015 | -
|
---|
| 6016 | - You may add a section Entitled "Endorsements", provided it contains
|
---|
| 6017 | - nothing but endorsements of your Modified Version by various
|
---|
| 6018 | - parties--for example, statements of peer review or that the text
|
---|
| 6019 | - has been approved by an organization as the authoritative
|
---|
| 6020 | - definition of a standard.
|
---|
| 6021 | -
|
---|
| 6022 | - You may add a passage of up to five words as a Front-Cover Text,
|
---|
| 6023 | - and a passage of up to 25 words as a Back-Cover Text, to the end of
|
---|
| 6024 | - the list of Cover Texts in the Modified Version. Only one passage
|
---|
| 6025 | - of Front-Cover Text and one of Back-Cover Text may be added by (or
|
---|
| 6026 | - through arrangements made by) any one entity. If the Document
|
---|
| 6027 | - already includes a cover text for the same cover, previously added
|
---|
| 6028 | - by you or by arrangement made by the same entity you are acting on
|
---|
| 6029 | - behalf of, you may not add another; but you may replace the old
|
---|
| 6030 | - one, on explicit permission from the previous publisher that added
|
---|
| 6031 | - the old one.
|
---|
| 6032 | -
|
---|
| 6033 | - The author(s) and publisher(s) of the Document do not by this
|
---|
| 6034 | - License give permission to use their names for publicity for or to
|
---|
| 6035 | - assert or imply endorsement of any Modified Version.
|
---|
| 6036 | -
|
---|
| 6037 | - 5. COMBINING DOCUMENTS
|
---|
| 6038 | -
|
---|
| 6039 | - You may combine the Document with other documents released under
|
---|
| 6040 | - this License, under the terms defined in section 4 above for
|
---|
| 6041 | - modified versions, provided that you include in the combination all
|
---|
| 6042 | - of the Invariant Sections of all of the original documents,
|
---|
| 6043 | - unmodified, and list them all as Invariant Sections of your
|
---|
| 6044 | - combined work in its license notice, and that you preserve all
|
---|
| 6045 | - their Warranty Disclaimers.
|
---|
| 6046 | -
|
---|
| 6047 | - The combined work need only contain one copy of this License, and
|
---|
| 6048 | - multiple identical Invariant Sections may be replaced with a single
|
---|
| 6049 | - copy. If there are multiple Invariant Sections with the same name
|
---|
| 6050 | - but different contents, make the title of each such section unique
|
---|
| 6051 | - by adding at the end of it, in parentheses, the name of the
|
---|
| 6052 | - original author or publisher of that section if known, or else a
|
---|
| 6053 | - unique number. Make the same adjustment to the section titles in
|
---|
| 6054 | - the list of Invariant Sections in the license notice of the
|
---|
| 6055 | - combined work.
|
---|
| 6056 | -
|
---|
| 6057 | - In the combination, you must combine any sections Entitled
|
---|
| 6058 | - "History" in the various original documents, forming one section
|
---|
| 6059 | - Entitled "History"; likewise combine any sections Entitled
|
---|
| 6060 | - "Acknowledgements", and any sections Entitled "Dedications". You
|
---|
| 6061 | - must delete all sections Entitled "Endorsements."
|
---|
| 6062 | -
|
---|
| 6063 | - 6. COLLECTIONS OF DOCUMENTS
|
---|
| 6064 | -
|
---|
| 6065 | - You may make a collection consisting of the Document and other
|
---|
| 6066 | - documents released under this License, and replace the individual
|
---|
| 6067 | - copies of this License in the various documents with a single copy
|
---|
| 6068 | - that is included in the collection, provided that you follow the
|
---|
| 6069 | - rules of this License for verbatim copying of each of the documents
|
---|
| 6070 | - in all other respects.
|
---|
| 6071 | -
|
---|
| 6072 | - You may extract a single document from such a collection, and
|
---|
| 6073 | - distribute it individually under this License, provided you insert
|
---|
| 6074 | - a copy of this License into the extracted document, and follow this
|
---|
| 6075 | - License in all other respects regarding verbatim copying of that
|
---|
| 6076 | - document.
|
---|
| 6077 | -
|
---|
| 6078 | - 7. AGGREGATION WITH INDEPENDENT WORKS
|
---|
| 6079 | -
|
---|
| 6080 | - A compilation of the Document or its derivatives with other
|
---|
| 6081 | - separate and independent documents or works, in or on a volume of a
|
---|
| 6082 | - storage or distribution medium, is called an "aggregate" if the
|
---|
| 6083 | - copyright resulting from the compilation is not used to limit the
|
---|
| 6084 | - legal rights of the compilation's users beyond what the individual
|
---|
| 6085 | - works permit. When the Document is included in an aggregate, this
|
---|
| 6086 | - License does not apply to the other works in the aggregate which
|
---|
| 6087 | - are not themselves derivative works of the Document.
|
---|
| 6088 | -
|
---|
| 6089 | - If the Cover Text requirement of section 3 is applicable to these
|
---|
| 6090 | - copies of the Document, then if the Document is less than one half
|
---|
| 6091 | - of the entire aggregate, the Document's Cover Texts may be placed
|
---|
| 6092 | - on covers that bracket the Document within the aggregate, or the
|
---|
| 6093 | - electronic equivalent of covers if the Document is in electronic
|
---|
| 6094 | - form. Otherwise they must appear on printed covers that bracket
|
---|
| 6095 | - the whole aggregate.
|
---|
| 6096 | -
|
---|
| 6097 | - 8. TRANSLATION
|
---|
| 6098 | -
|
---|
| 6099 | - Translation is considered a kind of modification, so you may
|
---|
| 6100 | - distribute translations of the Document under the terms of section
|
---|
| 6101 | - 4. Replacing Invariant Sections with translations requires special
|
---|
| 6102 | - permission from their copyright holders, but you may include
|
---|
| 6103 | - translations of some or all Invariant Sections in addition to the
|
---|
| 6104 | - original versions of these Invariant Sections. You may include a
|
---|
| 6105 | - translation of this License, and all the license notices in the
|
---|
| 6106 | - Document, and any Warranty Disclaimers, provided that you also
|
---|
| 6107 | - include the original English version of this License and the
|
---|
| 6108 | - original versions of those notices and disclaimers. In case of a
|
---|
| 6109 | - disagreement between the translation and the original version of
|
---|
| 6110 | - this License or a notice or disclaimer, the original version will
|
---|
| 6111 | - prevail.
|
---|
| 6112 | -
|
---|
| 6113 | - If a section in the Document is Entitled "Acknowledgements",
|
---|
| 6114 | - "Dedications", or "History", the requirement (section 4) to
|
---|
| 6115 | - Preserve its Title (section 1) will typically require changing the
|
---|
| 6116 | - actual title.
|
---|
| 6117 | -
|
---|
| 6118 | - 9. TERMINATION
|
---|
| 6119 | -
|
---|
| 6120 | - You may not copy, modify, sublicense, or distribute the Document
|
---|
| 6121 | - except as expressly provided under this License. Any attempt
|
---|
| 6122 | - otherwise to copy, modify, sublicense, or distribute it is void,
|
---|
| 6123 | - and will automatically terminate your rights under this License.
|
---|
| 6124 | -
|
---|
| 6125 | - However, if you cease all violation of this License, then your
|
---|
| 6126 | - license from a particular copyright holder is reinstated (a)
|
---|
| 6127 | - provisionally, unless and until the copyright holder explicitly and
|
---|
| 6128 | - finally terminates your license, and (b) permanently, if the
|
---|
| 6129 | - copyright holder fails to notify you of the violation by some
|
---|
| 6130 | - reasonable means prior to 60 days after the cessation.
|
---|
| 6131 | -
|
---|
| 6132 | - Moreover, your license from a particular copyright holder is
|
---|
| 6133 | - reinstated permanently if the copyright holder notifies you of the
|
---|
| 6134 | - violation by some reasonable means, this is the first time you have
|
---|
| 6135 | - received notice of violation of this License (for any work) from
|
---|
| 6136 | - that copyright holder, and you cure the violation prior to 30 days
|
---|
| 6137 | - after your receipt of the notice.
|
---|
| 6138 | -
|
---|
| 6139 | - Termination of your rights under this section does not terminate
|
---|
| 6140 | - the licenses of parties who have received copies or rights from you
|
---|
| 6141 | - under this License. If your rights have been terminated and not
|
---|
| 6142 | - permanently reinstated, receipt of a copy of some or all of the
|
---|
| 6143 | - same material does not give you any rights to use it.
|
---|
| 6144 | -
|
---|
| 6145 | - 10. FUTURE REVISIONS OF THIS LICENSE
|
---|
| 6146 | -
|
---|
| 6147 | - The Free Software Foundation may publish new, revised versions of
|
---|
| 6148 | - the GNU Free Documentation License from time to time. Such new
|
---|
| 6149 | - versions will be similar in spirit to the present version, but may
|
---|
| 6150 | - differ in detail to address new problems or concerns. See
|
---|
| 6151 | - <http://www.gnu.org/copyleft/>.
|
---|
| 6152 | -
|
---|
| 6153 | - Each version of the License is given a distinguishing version
|
---|
| 6154 | - number. If the Document specifies that a particular numbered
|
---|
| 6155 | - version of this License "or any later version" applies to it, you
|
---|
| 6156 | - have the option of following the terms and conditions either of
|
---|
| 6157 | - that specified version or of any later version that has been
|
---|
| 6158 | - published (not as a draft) by the Free Software Foundation. If the
|
---|
| 6159 | - Document does not specify a version number of this License, you may
|
---|
| 6160 | - choose any version ever published (not as a draft) by the Free
|
---|
| 6161 | - Software Foundation. If the Document specifies that a proxy can
|
---|
| 6162 | - decide which future versions of this License can be used, that
|
---|
| 6163 | - proxy's public statement of acceptance of a version permanently
|
---|
| 6164 | - authorizes you to choose that version for the Document.
|
---|
| 6165 | -
|
---|
| 6166 | - 11. RELICENSING
|
---|
| 6167 | -
|
---|
| 6168 | - "Massive Multiauthor Collaboration Site" (or "MMC Site") means any
|
---|
| 6169 | - World Wide Web server that publishes copyrightable works and also
|
---|
| 6170 | - provides prominent facilities for anybody to edit those works. A
|
---|
| 6171 | - public wiki that anybody can edit is an example of such a server.
|
---|
| 6172 | - A "Massive Multiauthor Collaboration" (or "MMC") contained in the
|
---|
| 6173 | - site means any set of copyrightable works thus published on the MMC
|
---|
| 6174 | - site.
|
---|
| 6175 | -
|
---|
| 6176 | - "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
|
---|
| 6177 | - license published by Creative Commons Corporation, a not-for-profit
|
---|
| 6178 | - corporation with a principal place of business in San Francisco,
|
---|
| 6179 | - California, as well as future copyleft versions of that license
|
---|
| 6180 | - published by that same organization.
|
---|
| 6181 | -
|
---|
| 6182 | - "Incorporate" means to publish or republish a Document, in whole or
|
---|
| 6183 | - in part, as part of another Document.
|
---|
| 6184 | -
|
---|
| 6185 | - An MMC is "eligible for relicensing" if it is licensed under this
|
---|
| 6186 | - License, and if all works that were first published under this
|
---|
| 6187 | - License somewhere other than this MMC, and subsequently
|
---|
| 6188 | - incorporated in whole or in part into the MMC, (1) had no cover
|
---|
| 6189 | - texts or invariant sections, and (2) were thus incorporated prior
|
---|
| 6190 | - to November 1, 2008.
|
---|
| 6191 | -
|
---|
| 6192 | - The operator of an MMC Site may republish an MMC contained in the
|
---|
| 6193 | - site under CC-BY-SA on the same site at any time before August 1,
|
---|
| 6194 | - 2009, provided the MMC is eligible for relicensing.
|
---|
| 6195 | -
|
---|
| 6196 | -ADDENDUM: How to use this License for your documents
|
---|
| 6197 | -====================================================
|
---|
| 6198 | -
|
---|
| 6199 | -To use this License in a document you have written, include a copy of
|
---|
| 6200 | -the License in the document and put the following copyright and license
|
---|
| 6201 | -notices just after the title page:
|
---|
| 6202 | -
|
---|
| 6203 | - Copyright (C) YEAR YOUR NAME.
|
---|
| 6204 | - Permission is granted to copy, distribute and/or modify this document
|
---|
| 6205 | - under the terms of the GNU Free Documentation License, Version 1.3
|
---|
| 6206 | - or any later version published by the Free Software Foundation;
|
---|
| 6207 | - with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
|
---|
| 6208 | - Texts. A copy of the license is included in the section entitled ``GNU
|
---|
| 6209 | - Free Documentation License''.
|
---|
| 6210 | -
|
---|
| 6211 | - If you have Invariant Sections, Front-Cover Texts and Back-Cover
|
---|
| 6212 | -Texts, replace the "with...Texts." line with this:
|
---|
| 6213 | -
|
---|
| 6214 | - with the Invariant Sections being LIST THEIR TITLES, with
|
---|
| 6215 | - the Front-Cover Texts being LIST, and with the Back-Cover Texts
|
---|
| 6216 | - being LIST.
|
---|
| 6217 | -
|
---|
| 6218 | - If you have Invariant Sections without Cover Texts, or some other
|
---|
| 6219 | -combination of the three, merge those two alternatives to suit the
|
---|
| 6220 | -situation.
|
---|
| 6221 | -
|
---|
| 6222 | - If your document contains nontrivial examples of program code, we
|
---|
| 6223 | -recommend releasing these examples in parallel under your choice of free
|
---|
| 6224 | -software license, such as the GNU General Public License, to permit
|
---|
| 6225 | -their use in free software.
|
---|
| 6226 | -
|
---|
| 6227 | -
|
---|
| 6228 | -File: libquadmath.info, Node: Reporting Bugs, Prev: GNU Free Documentation License, Up: Top
|
---|
| 6229 | -
|
---|
| 6230 | -4 Reporting Bugs
|
---|
| 6231 | -****************
|
---|
| 6232 | -
|
---|
| 6233 | -Bugs in the GCC Quad-Precision Math Library implementation should be
|
---|
| 6234 | -reported via <http://gcc.gnu.org/bugs.html>.
|
---|
| 6235 | -
|
---|
| 6236 | -
|
---|
| 6237 | -
|
---|
| 6238 | -Tag Table:
|
---|
| 6239 | -Node: Top1633
|
---|
| 6240 | -Node: Typedef and constants2367
|
---|
| 6241 | -Node: Math Library Routines3786
|
---|
| 6242 | -Node: I/O Library Routines7503
|
---|
| 6243 | -Node: strtoflt1287828
|
---|
| 6244 | -Node: quadmath_snprintf8588
|
---|
| 6245 | -Node: GNU Free Documentation License10798
|
---|
[88af5df] | 6246 | -Node: Reporting Bugs35944
|
---|
| 6247 | -
|
---|
| 6248 | -End Tag Table
|
---|
| 6249 | diff -Naur gcc-4.8.2.orig/libstdc++-v3/include/bits/shared_ptr_base.h gcc-4.8.2/libstdc++-v3/include/bits/shared_ptr_base.h
|
---|
| 6250 | --- gcc-4.8.2.orig/libstdc++-v3/include/bits/shared_ptr_base.h 2013-10-08 13:38:21.000000000 +0000
|
---|
| 6251 | +++ gcc-4.8.2/libstdc++-v3/include/bits/shared_ptr_base.h 2013-11-01 16:12:34.311851849 +0000
|
---|
| 6252 | @@ -391,7 +391,7 @@
|
---|
| 6253 | public:
|
---|
| 6254 | template<typename... _Args>
|
---|
| 6255 | _Sp_counted_ptr_inplace(_Alloc __a, _Args&&... __args)
|
---|
| 6256 | - : _M_impl(__a), _M_storage()
|
---|
| 6257 | + : _M_impl(__a)
|
---|
| 6258 | {
|
---|
| 6259 | _M_impl._M_ptr = static_cast<_Tp*>(static_cast<void*>(&_M_storage));
|
---|
| 6260 | // _GLIBCXX_RESOLVE_LIB_DEFECTS
|
---|
| 6261 | @@ -819,7 +819,7 @@
|
---|
| 6262 | : _M_ptr(__r.get()), _M_refcount()
|
---|
| 6263 | {
|
---|
| 6264 | __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
|
---|
| 6265 | - auto __tmp = std::__addressof(*__r.get());
|
---|
| 6266 | + auto __tmp = __r.get();
|
---|
[2e59d11] | 6267 | _M_refcount = __shared_count<_Lp>(std::move(__r));
|
---|
[88af5df] | 6268 | __enable_shared_from_this_helper(_M_refcount, __tmp, __tmp);
|
---|
| 6269 | }
|
---|
[2e59d11] | 6270 | diff -Naur gcc-4.8.2.orig/libstdc++-v3/include/bits/stl_algo.h gcc-4.8.2/libstdc++-v3/include/bits/stl_algo.h
|
---|
| 6271 | --- gcc-4.8.2.orig/libstdc++-v3/include/bits/stl_algo.h 2013-09-30 17:42:52.000000000 +0000
|
---|
| 6272 | +++ gcc-4.8.2/libstdc++-v3/include/bits/stl_algo.h 2013-11-01 16:12:34.399866997 +0000
|
---|
| 6273 | @@ -2279,7 +2279,7 @@
|
---|
| 6274 | _RandomAccessIterator __last)
|
---|
| 6275 | {
|
---|
| 6276 | _RandomAccessIterator __mid = __first + (__last - __first) / 2;
|
---|
| 6277 | - std::__move_median_to_first(__first, __first + 1, __mid, (__last - 2));
|
---|
| 6278 | + std::__move_median_to_first(__first, __first + 1, __mid, __last - 1);
|
---|
| 6279 | return std::__unguarded_partition(__first + 1, __last, *__first);
|
---|
| 6280 | }
|
---|
| 6281 |
|
---|
| 6282 | @@ -2291,7 +2291,7 @@
|
---|
| 6283 | _RandomAccessIterator __last, _Compare __comp)
|
---|
| 6284 | {
|
---|
| 6285 | _RandomAccessIterator __mid = __first + (__last - __first) / 2;
|
---|
| 6286 | - std::__move_median_to_first(__first, __first + 1, __mid, (__last - 2),
|
---|
| 6287 | + std::__move_median_to_first(__first, __first + 1, __mid, __last - 1,
|
---|
[88af5df] | 6288 | __comp);
|
---|
| 6289 | return std::__unguarded_partition(__first + 1, __last, *__first, __comp);
|
---|
| 6290 | }
|
---|
| 6291 | diff -Naur gcc-4.8.2.orig/libstdc++-v3/include/c_global/cstdio gcc-4.8.2/libstdc++-v3/include/c_global/cstdio
|
---|
| 6292 | --- gcc-4.8.2.orig/libstdc++-v3/include/c_global/cstdio 2013-02-03 17:54:05.000000000 +0000
|
---|
| 6293 | +++ gcc-4.8.2/libstdc++-v3/include/c_global/cstdio 2013-11-01 16:12:34.399866997 +0000
|
---|
| 6294 | @@ -69,6 +69,7 @@
|
---|
| 6295 | #undef ftell
|
---|
| 6296 | #undef fwrite
|
---|
| 6297 | #undef getc
|
---|
| 6298 | +#undef getchar
|
---|
[2e59d11] | 6299 | #undef gets
|
---|
[88af5df] | 6300 | #undef perror
|
---|
| 6301 | #undef printf
|
---|
[2e59d11] | 6302 | diff -Naur gcc-4.8.2.orig/libstdc++-v3/include/debug/functions.h gcc-4.8.2/libstdc++-v3/include/debug/functions.h
|
---|
| 6303 | --- gcc-4.8.2.orig/libstdc++-v3/include/debug/functions.h 2013-02-03 17:54:05.000000000 +0000
|
---|
| 6304 | +++ gcc-4.8.2/libstdc++-v3/include/debug/functions.h 2013-11-01 16:12:34.399866997 +0000
|
---|
| 6305 | @@ -345,11 +345,13 @@
|
---|
| 6306 | return __check_sorted_set_aux(__first, __last, __pred, _SameType());
|
---|
| 6307 | }
|
---|
| 6308 |
|
---|
| 6309 | + // _GLIBCXX_RESOLVE_LIB_DEFECTS
|
---|
| 6310 | + // 270. Binary search requirements overly strict
|
---|
| 6311 | + // Determine if a sequence is partitioned w.r.t. this element.
|
---|
| 6312 | template<typename _ForwardIterator, typename _Tp>
|
---|
| 6313 | inline bool
|
---|
| 6314 | - __check_partitioned_lower_aux(_ForwardIterator __first,
|
---|
| 6315 | - _ForwardIterator __last, const _Tp& __value,
|
---|
| 6316 | - std::forward_iterator_tag)
|
---|
| 6317 | + __check_partitioned_lower(_ForwardIterator __first,
|
---|
| 6318 | + _ForwardIterator __last, const _Tp& __value)
|
---|
| 6319 | {
|
---|
| 6320 | while (__first != __last && *__first < __value)
|
---|
| 6321 | ++__first;
|
---|
| 6322 | @@ -362,38 +364,11 @@
|
---|
| 6323 | return __first == __last;
|
---|
| 6324 | }
|
---|
| 6325 |
|
---|
| 6326 | - // For performance reason, as the iterator range has been validated, check on
|
---|
| 6327 | - // random access safe iterators is done using the base iterator.
|
---|
| 6328 | - template<typename _Iterator, typename _Sequence, typename _Tp>
|
---|
| 6329 | - inline bool
|
---|
| 6330 | - __check_partitioned_lower_aux(
|
---|
| 6331 | - const _Safe_iterator<_Iterator, _Sequence>& __first,
|
---|
| 6332 | - const _Safe_iterator<_Iterator, _Sequence>& __last,
|
---|
| 6333 | - const _Tp& __value,
|
---|
| 6334 | - std::random_access_iterator_tag __tag)
|
---|
| 6335 | - {
|
---|
| 6336 | - return __check_partitioned_lower_aux(__first.base(), __last.base(),
|
---|
| 6337 | - __value, __tag);
|
---|
| 6338 | - }
|
---|
| 6339 | -
|
---|
| 6340 | - // _GLIBCXX_RESOLVE_LIB_DEFECTS
|
---|
| 6341 | - // 270. Binary search requirements overly strict
|
---|
| 6342 | - // Determine if a sequence is partitioned w.r.t. this element.
|
---|
| 6343 | template<typename _ForwardIterator, typename _Tp>
|
---|
| 6344 | inline bool
|
---|
| 6345 | - __check_partitioned_lower(_ForwardIterator __first,
|
---|
| 6346 | + __check_partitioned_upper(_ForwardIterator __first,
|
---|
| 6347 | _ForwardIterator __last, const _Tp& __value)
|
---|
| 6348 | {
|
---|
| 6349 | - return __check_partitioned_lower_aux(__first, __last, __value,
|
---|
| 6350 | - std::__iterator_category(__first));
|
---|
| 6351 | - }
|
---|
| 6352 | -
|
---|
| 6353 | - template<typename _ForwardIterator, typename _Tp>
|
---|
| 6354 | - inline bool
|
---|
| 6355 | - __check_partitioned_upper_aux(_ForwardIterator __first,
|
---|
| 6356 | - _ForwardIterator __last, const _Tp& __value,
|
---|
| 6357 | - std::forward_iterator_tag)
|
---|
| 6358 | - {
|
---|
| 6359 | while (__first != __last && !(__value < *__first))
|
---|
| 6360 | ++__first;
|
---|
| 6361 | if (__first != __last)
|
---|
| 6362 | @@ -405,35 +380,12 @@
|
---|
| 6363 | return __first == __last;
|
---|
| 6364 | }
|
---|
| 6365 |
|
---|
| 6366 | - // For performance reason, as the iterator range has been validated, check on
|
---|
| 6367 | - // random access safe iterators is done using the base iterator.
|
---|
| 6368 | - template<typename _Iterator, typename _Sequence, typename _Tp>
|
---|
| 6369 | - inline bool
|
---|
| 6370 | - __check_partitioned_upper_aux(
|
---|
| 6371 | - const _Safe_iterator<_Iterator, _Sequence>& __first,
|
---|
| 6372 | - const _Safe_iterator<_Iterator, _Sequence>& __last,
|
---|
| 6373 | - const _Tp& __value,
|
---|
| 6374 | - std::random_access_iterator_tag __tag)
|
---|
| 6375 | - {
|
---|
| 6376 | - return __check_partitioned_upper_aux(__first.base(), __last.base(),
|
---|
| 6377 | - __value, __tag);
|
---|
| 6378 | - }
|
---|
| 6379 | -
|
---|
| 6380 | - template<typename _ForwardIterator, typename _Tp>
|
---|
| 6381 | - inline bool
|
---|
| 6382 | - __check_partitioned_upper(_ForwardIterator __first,
|
---|
| 6383 | - _ForwardIterator __last, const _Tp& __value)
|
---|
| 6384 | - {
|
---|
| 6385 | - return __check_partitioned_upper_aux(__first, __last, __value,
|
---|
| 6386 | - std::__iterator_category(__first));
|
---|
| 6387 | - }
|
---|
| 6388 | -
|
---|
| 6389 | + // Determine if a sequence is partitioned w.r.t. this element.
|
---|
| 6390 | template<typename _ForwardIterator, typename _Tp, typename _Pred>
|
---|
| 6391 | inline bool
|
---|
| 6392 | - __check_partitioned_lower_aux(_ForwardIterator __first,
|
---|
| 6393 | - _ForwardIterator __last, const _Tp& __value,
|
---|
| 6394 | - _Pred __pred,
|
---|
| 6395 | - std::forward_iterator_tag)
|
---|
| 6396 | + __check_partitioned_lower(_ForwardIterator __first,
|
---|
| 6397 | + _ForwardIterator __last, const _Tp& __value,
|
---|
| 6398 | + _Pred __pred)
|
---|
| 6399 | {
|
---|
| 6400 | while (__first != __last && bool(__pred(*__first, __value)))
|
---|
| 6401 | ++__first;
|
---|
| 6402 | @@ -446,39 +398,12 @@
|
---|
| 6403 | return __first == __last;
|
---|
| 6404 | }
|
---|
| 6405 |
|
---|
| 6406 | - // For performance reason, as the iterator range has been validated, check on
|
---|
| 6407 | - // random access safe iterators is done using the base iterator.
|
---|
| 6408 | - template<typename _Iterator, typename _Sequence,
|
---|
| 6409 | - typename _Tp, typename _Pred>
|
---|
| 6410 | - inline bool
|
---|
| 6411 | - __check_partitioned_lower_aux(
|
---|
| 6412 | - const _Safe_iterator<_Iterator, _Sequence>& __first,
|
---|
| 6413 | - const _Safe_iterator<_Iterator, _Sequence>& __last,
|
---|
| 6414 | - const _Tp& __value, _Pred __pred,
|
---|
| 6415 | - std::random_access_iterator_tag __tag)
|
---|
| 6416 | - {
|
---|
| 6417 | - return __check_partitioned_lower_aux(__first.base(), __last.base(),
|
---|
| 6418 | - __value, __pred, __tag);
|
---|
| 6419 | - }
|
---|
| 6420 | -
|
---|
| 6421 | - // Determine if a sequence is partitioned w.r.t. this element.
|
---|
| 6422 | template<typename _ForwardIterator, typename _Tp, typename _Pred>
|
---|
| 6423 | inline bool
|
---|
| 6424 | - __check_partitioned_lower(_ForwardIterator __first,
|
---|
| 6425 | + __check_partitioned_upper(_ForwardIterator __first,
|
---|
| 6426 | _ForwardIterator __last, const _Tp& __value,
|
---|
| 6427 | _Pred __pred)
|
---|
| 6428 | {
|
---|
| 6429 | - return __check_partitioned_lower_aux(__first, __last, __value, __pred,
|
---|
| 6430 | - std::__iterator_category(__first));
|
---|
| 6431 | - }
|
---|
| 6432 | -
|
---|
| 6433 | - template<typename _ForwardIterator, typename _Tp, typename _Pred>
|
---|
| 6434 | - inline bool
|
---|
| 6435 | - __check_partitioned_upper_aux(_ForwardIterator __first,
|
---|
| 6436 | - _ForwardIterator __last, const _Tp& __value,
|
---|
| 6437 | - _Pred __pred,
|
---|
| 6438 | - std::forward_iterator_tag)
|
---|
| 6439 | - {
|
---|
| 6440 | while (__first != __last && !bool(__pred(__value, *__first)))
|
---|
| 6441 | ++__first;
|
---|
| 6442 | if (__first != __last)
|
---|
| 6443 | @@ -490,31 +415,6 @@
|
---|
| 6444 | return __first == __last;
|
---|
| 6445 | }
|
---|
| 6446 |
|
---|
| 6447 | - // For performance reason, as the iterator range has been validated, check on
|
---|
| 6448 | - // random access safe iterators is done using the base iterator.
|
---|
| 6449 | - template<typename _Iterator, typename _Sequence,
|
---|
| 6450 | - typename _Tp, typename _Pred>
|
---|
| 6451 | - inline bool
|
---|
| 6452 | - __check_partitioned_upper_aux(
|
---|
| 6453 | - const _Safe_iterator<_Iterator, _Sequence>& __first,
|
---|
| 6454 | - const _Safe_iterator<_Iterator, _Sequence>& __last,
|
---|
| 6455 | - const _Tp& __value, _Pred __pred,
|
---|
| 6456 | - std::random_access_iterator_tag __tag)
|
---|
| 6457 | - {
|
---|
| 6458 | - return __check_partitioned_upper_aux(__first.base(), __last.base(),
|
---|
| 6459 | - __value, __pred, __tag);
|
---|
| 6460 | - }
|
---|
| 6461 | -
|
---|
| 6462 | - template<typename _ForwardIterator, typename _Tp, typename _Pred>
|
---|
| 6463 | - inline bool
|
---|
| 6464 | - __check_partitioned_upper(_ForwardIterator __first,
|
---|
| 6465 | - _ForwardIterator __last, const _Tp& __value,
|
---|
| 6466 | - _Pred __pred)
|
---|
| 6467 | - {
|
---|
| 6468 | - return __check_partitioned_upper_aux(__first, __last, __value, __pred,
|
---|
| 6469 | - std::__iterator_category(__first));
|
---|
| 6470 | - }
|
---|
| 6471 | -
|
---|
| 6472 | // Helper struct to detect random access safe iterators.
|
---|
[88af5df] | 6473 | template<typename _Iterator>
|
---|
| 6474 | struct __is_safe_random_iterator
|
---|
[2e59d11] | 6475 | diff -Naur gcc-4.8.2.orig/libstdc++-v3/include/debug/macros.h gcc-4.8.2/libstdc++-v3/include/debug/macros.h
|
---|
| 6476 | --- gcc-4.8.2.orig/libstdc++-v3/include/debug/macros.h 2013-02-03 17:54:05.000000000 +0000
|
---|
| 6477 | +++ gcc-4.8.2/libstdc++-v3/include/debug/macros.h 2013-11-01 16:12:34.403867685 +0000
|
---|
| 6478 | @@ -261,8 +261,9 @@
|
---|
| 6479 | w.r.t. the value _Value. */
|
---|
| 6480 | #define __glibcxx_check_partitioned_lower(_First,_Last,_Value) \
|
---|
| 6481 | __glibcxx_check_valid_range(_First,_Last); \
|
---|
| 6482 | -_GLIBCXX_DEBUG_VERIFY(__gnu_debug::__check_partitioned_lower(_First, _Last, \
|
---|
| 6483 | - _Value), \
|
---|
| 6484 | +_GLIBCXX_DEBUG_VERIFY(__gnu_debug::__check_partitioned_lower( \
|
---|
| 6485 | + __gnu_debug::__base(_First), \
|
---|
| 6486 | + __gnu_debug::__base(_Last), _Value), \
|
---|
| 6487 | _M_message(__gnu_debug::__msg_unpartitioned) \
|
---|
| 6488 | ._M_iterator(_First, #_First) \
|
---|
| 6489 | ._M_iterator(_Last, #_Last) \
|
---|
| 6490 | @@ -270,8 +271,9 @@
|
---|
| 6491 |
|
---|
| 6492 | #define __glibcxx_check_partitioned_upper(_First,_Last,_Value) \
|
---|
| 6493 | __glibcxx_check_valid_range(_First,_Last); \
|
---|
| 6494 | -_GLIBCXX_DEBUG_VERIFY(__gnu_debug::__check_partitioned_upper(_First, _Last, \
|
---|
| 6495 | - _Value), \
|
---|
| 6496 | +_GLIBCXX_DEBUG_VERIFY(__gnu_debug::__check_partitioned_upper( \
|
---|
| 6497 | + __gnu_debug::__base(_First), \
|
---|
| 6498 | + __gnu_debug::__base(_Last), _Value), \
|
---|
| 6499 | _M_message(__gnu_debug::__msg_unpartitioned) \
|
---|
| 6500 | ._M_iterator(_First, #_First) \
|
---|
| 6501 | ._M_iterator(_Last, #_Last) \
|
---|
| 6502 | @@ -281,8 +283,9 @@
|
---|
| 6503 | w.r.t. the value _Value and predicate _Pred. */
|
---|
| 6504 | #define __glibcxx_check_partitioned_lower_pred(_First,_Last,_Value,_Pred) \
|
---|
| 6505 | __glibcxx_check_valid_range(_First,_Last); \
|
---|
| 6506 | -_GLIBCXX_DEBUG_VERIFY(__gnu_debug::__check_partitioned_lower(_First, _Last, \
|
---|
| 6507 | - _Value, _Pred), \
|
---|
| 6508 | +_GLIBCXX_DEBUG_VERIFY(__gnu_debug::__check_partitioned_lower( \
|
---|
| 6509 | + __gnu_debug::__base(_First), \
|
---|
| 6510 | + __gnu_debug::__base(_Last), _Value, _Pred), \
|
---|
| 6511 | _M_message(__gnu_debug::__msg_unpartitioned_pred) \
|
---|
| 6512 | ._M_iterator(_First, #_First) \
|
---|
| 6513 | ._M_iterator(_Last, #_Last) \
|
---|
| 6514 | @@ -293,8 +296,9 @@
|
---|
| 6515 | w.r.t. the value _Value and predicate _Pred. */
|
---|
| 6516 | #define __glibcxx_check_partitioned_upper_pred(_First,_Last,_Value,_Pred) \
|
---|
| 6517 | __glibcxx_check_valid_range(_First,_Last); \
|
---|
| 6518 | -_GLIBCXX_DEBUG_VERIFY(__gnu_debug::__check_partitioned_upper(_First, _Last, \
|
---|
| 6519 | - _Value, _Pred), \
|
---|
| 6520 | +_GLIBCXX_DEBUG_VERIFY(__gnu_debug::__check_partitioned_upper( \
|
---|
| 6521 | + __gnu_debug::__base(_First), \
|
---|
| 6522 | + __gnu_debug::__base(_Last), _Value, _Pred), \
|
---|
[88af5df] | 6523 | _M_message(__gnu_debug::__msg_unpartitioned_pred) \
|
---|
| 6524 | ._M_iterator(_First, #_First) \
|
---|
| 6525 | ._M_iterator(_Last, #_Last) \
|
---|
| 6526 | diff -Naur gcc-4.8.2.orig/libstdc++-v3/testsuite/20_util/shared_ptr/cons/58839.cc gcc-4.8.2/libstdc++-v3/testsuite/20_util/shared_ptr/cons/58839.cc
|
---|
| 6527 | --- gcc-4.8.2.orig/libstdc++-v3/testsuite/20_util/shared_ptr/cons/58839.cc 1970-01-01 00:00:00.000000000 +0000
|
---|
| 6528 | +++ gcc-4.8.2/libstdc++-v3/testsuite/20_util/shared_ptr/cons/58839.cc 2013-11-01 16:12:34.403867685 +0000
|
---|
| 6529 | @@ -0,0 +1,33 @@
|
---|
| 6530 | +// { dg-options "-std=gnu++11" }
|
---|
| 6531 | +// { dg-do compile }
|
---|
| 6532 | +
|
---|
| 6533 | +// Copyright (C) 2013 Free Software Foundation, Inc.
|
---|
| 6534 | +//
|
---|
| 6535 | +// This file is part of the GNU ISO C++ Library. This library is free
|
---|
| 6536 | +// software; you can redistribute it and/or modify it under the
|
---|
| 6537 | +// terms of the GNU General Public License as published by the
|
---|
| 6538 | +// Free Software Foundation; either version 3, or (at your option)
|
---|
| 6539 | +// any later version.
|
---|
| 6540 | +
|
---|
| 6541 | +// This library is distributed in the hope that it will be useful,
|
---|
| 6542 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
| 6543 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
---|
| 6544 | +// GNU General Public License for more details.
|
---|
| 6545 | +
|
---|
| 6546 | +// You should have received a copy of the GNU General Public License along
|
---|
| 6547 | +// with this library; see the file COPYING3. If not see
|
---|
| 6548 | +// <http://www.gnu.org/licenses/>.
|
---|
| 6549 | +
|
---|
| 6550 | +#include <memory>
|
---|
| 6551 | +
|
---|
| 6552 | +// libstdc++/58839
|
---|
| 6553 | +
|
---|
| 6554 | +struct D {
|
---|
| 6555 | + void operator()(void*) const noexcept { }
|
---|
| 6556 | +};
|
---|
| 6557 | +
|
---|
| 6558 | +void test01()
|
---|
| 6559 | +{
|
---|
[2e59d11] | 6560 | + std::unique_ptr<void, D> y;
|
---|
[88af5df] | 6561 | + std::shared_ptr<void> x = std::move(y);
|
---|
| 6562 | +}
|
---|
[2e59d11] | 6563 | diff -Naur gcc-4.8.2.orig/libstdc++-v3/testsuite/25_algorithms/nth_element/58800.cc gcc-4.8.2/libstdc++-v3/testsuite/25_algorithms/nth_element/58800.cc
|
---|
| 6564 | --- gcc-4.8.2.orig/libstdc++-v3/testsuite/25_algorithms/nth_element/58800.cc 1970-01-01 00:00:00.000000000 +0000
|
---|
| 6565 | +++ gcc-4.8.2/libstdc++-v3/testsuite/25_algorithms/nth_element/58800.cc 2013-11-01 16:12:34.403867685 +0000
|
---|
| 6566 | @@ -0,0 +1,52 @@
|
---|
| 6567 | +// Copyright (C) 2013 Free Software Foundation, Inc.
|
---|
| 6568 | +//
|
---|
| 6569 | +// This file is part of the GNU ISO C++ Library. This library is free
|
---|
| 6570 | +// software; you can redistribute it and/or modify it under the
|
---|
| 6571 | +// terms of the GNU General Public License as published by the
|
---|
| 6572 | +// Free Software Foundation; either version 3, or (at your option)
|
---|
| 6573 | +// any later version.
|
---|
| 6574 | +
|
---|
| 6575 | +// This library is distributed in the hope that it will be useful,
|
---|
| 6576 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
| 6577 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
---|
| 6578 | +// GNU General Public License for more details.
|
---|
| 6579 | +
|
---|
| 6580 | +// You should have received a copy of the GNU General Public License along
|
---|
| 6581 | +// with this library; see the file COPYING3. If not see
|
---|
| 6582 | +// <http://www.gnu.org/licenses/>.
|
---|
| 6583 | +
|
---|
| 6584 | +// 25.3.2 [lib.alg.nth.element]
|
---|
| 6585 | +
|
---|
| 6586 | +// { dg-options "-std=gnu++11" }
|
---|
| 6587 | +
|
---|
| 6588 | +#include <algorithm>
|
---|
| 6589 | +#include <testsuite_hooks.h>
|
---|
| 6590 | +#include <testsuite_iterators.h>
|
---|
| 6591 | +
|
---|
| 6592 | +using __gnu_test::test_container;
|
---|
| 6593 | +using __gnu_test::random_access_iterator_wrapper;
|
---|
| 6594 | +
|
---|
| 6595 | +typedef test_container<int, random_access_iterator_wrapper> Container;
|
---|
| 6596 | +
|
---|
| 6597 | +void test01()
|
---|
| 6598 | +{
|
---|
| 6599 | + std::vector<int> v = {
|
---|
| 6600 | + 207089,
|
---|
| 6601 | + 202585,
|
---|
| 6602 | + 180067,
|
---|
| 6603 | + 157549,
|
---|
| 6604 | + 211592,
|
---|
| 6605 | + 216096,
|
---|
| 6606 | + 207089
|
---|
| 6607 | + };
|
---|
| 6608 | +
|
---|
| 6609 | + Container con(v.data(), v.data() + 7);
|
---|
| 6610 | +
|
---|
| 6611 | + std::nth_element(con.begin(), con.begin() + 3, con.end());
|
---|
| 6612 | +}
|
---|
| 6613 | +
|
---|
| 6614 | +int main()
|
---|
| 6615 | +{
|
---|
| 6616 | + test01();
|
---|
| 6617 | + return 0;
|
---|
| 6618 | +}
|
---|