* gnu/packages/patches/gcc-10-tree-sra-union-handling.patch: New file. * gnu/local.mk (dist_patch_DATA): Adjust accordingly. * gnu/packages/gcc.scm (gcc-10, gcc-11)[source](patches): Add it. * gnu/packages/rust.scm (rust-bootstrap)[native-inputs]: Remove GCC-9.
		
			
				
	
	
		
			33 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			33 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| Fix a regression in GCC 10/11/12 where some union structures
 | |
| could get miscompiled when optimizations are enabled:
 | |
| 
 | |
|   https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105860
 | |
| 
 | |
| Taken from upstream:
 | |
| 
 | |
|   https://gcc.gnu.org/g:16afe2e2862f3dd93c711d7f8d436dee23c6c34d
 | |
| 
 | |
| diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
 | |
| index 09d951a261b..420329f63f6 100644
 | |
| --- a/gcc/tree-sra.c
 | |
| +++ b/gcc/tree-sra.c
 | |
| @@ -1647,7 +1647,18 @@ build_ref_for_offset (location_t loc, tree base, poly_int64 offset,
 | |
|  static tree
 | |
|  build_reconstructed_reference (location_t, tree base, struct access *model)
 | |
|  {
 | |
| -  tree expr = model->expr, prev_expr = NULL;
 | |
| +  tree expr = model->expr;
 | |
| +  /* We have to make sure to start just below the outermost union.  */
 | |
| +  tree start_expr = expr;
 | |
| +  while (handled_component_p (expr))
 | |
| +    {
 | |
| +      if (TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) == UNION_TYPE)
 | |
| +	start_expr = expr;
 | |
| +      expr = TREE_OPERAND (expr, 0);
 | |
| +    }
 | |
| +
 | |
| +  expr = start_expr;
 | |
| +  tree prev_expr = NULL_TREE;
 | |
|    while (!types_compatible_p (TREE_TYPE (expr), TREE_TYPE (base)))
 | |
|      {
 | |
|        if (!handled_component_p (expr))
 |