mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			compiler: avoid crash on erroneous type
If there is an error constructing the backend type, the GCC backend
    will report that the size is 1.  That will then cause construction of
    the ptrmask to crash.  Avoid that case by just generating an empty
    ptrmask.
    
    Noticed while compiling a broken package.  The policy I've been
    following is to not commit a test case for a compiler crash on invalid
    code, so no test case.
    
    Reviewed-on: https://go-review.googlesource.com/45775
From-SVN: r249208
			
			
This commit is contained in:
		
							parent
							
								
									3466430f38
								
							
						
					
					
						commit
						b901cf9dd9
					
				|  | @ -1,4 +1,4 @@ | ||||||
| 372e75503c1dc9a38d9978aa6b67631283d5d6dd | 6449e2832eef94eacf89c88fa16bede637f729ba | ||||||
| 
 | 
 | ||||||
| The first line of this file holds the git revision number of the last | The first line of this file holds the git revision number of the last | ||||||
| merge done from the gofrontend repository. | merge done from the gofrontend repository. | ||||||
|  |  | ||||||
|  | @ -2570,16 +2570,16 @@ Type::make_gc_symbol_var(Gogo* gogo) | ||||||
| bool | bool | ||||||
| Type::needs_gcprog(Gogo* gogo, int64_t* ptrsize, int64_t* ptrdata) | Type::needs_gcprog(Gogo* gogo, int64_t* ptrsize, int64_t* ptrdata) | ||||||
| { | { | ||||||
|  |   Type* voidptr = Type::make_pointer_type(Type::make_void_type()); | ||||||
|  |   if (!voidptr->backend_type_size(gogo, ptrsize)) | ||||||
|  |     go_unreachable(); | ||||||
|  | 
 | ||||||
|   if (!this->backend_type_ptrdata(gogo, ptrdata)) |   if (!this->backend_type_ptrdata(gogo, ptrdata)) | ||||||
|     { |     { | ||||||
|       go_assert(saw_errors()); |       go_assert(saw_errors()); | ||||||
|       return false; |       return false; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|   Type* voidptr = Type::make_pointer_type(Type::make_void_type()); |  | ||||||
|   if (!voidptr->backend_type_size(gogo, ptrsize)) |  | ||||||
|     go_unreachable(); |  | ||||||
| 
 |  | ||||||
|   return *ptrdata / *ptrsize > max_ptrmask_bytes; |   return *ptrdata / *ptrsize > max_ptrmask_bytes; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -2795,7 +2795,13 @@ Bvariable* | ||||||
| Type::gc_ptrmask_var(Gogo* gogo, int64_t ptrsize, int64_t ptrdata) | Type::gc_ptrmask_var(Gogo* gogo, int64_t ptrsize, int64_t ptrdata) | ||||||
| { | { | ||||||
|   Ptrmask ptrmask(ptrdata / ptrsize); |   Ptrmask ptrmask(ptrdata / ptrsize); | ||||||
|  |   if (ptrdata >= ptrsize) | ||||||
|     ptrmask.set_from(gogo, this, ptrsize, 0); |     ptrmask.set_from(gogo, this, ptrsize, 0); | ||||||
|  |   else | ||||||
|  |     { | ||||||
|  |       // This can happen in error cases.  Just build an empty gcbits.
 | ||||||
|  |       go_assert(saw_errors()); | ||||||
|  |     } | ||||||
|   std::string sym_name = "runtime.gcbits." + ptrmask.symname(); |   std::string sym_name = "runtime.gcbits." + ptrmask.symname(); | ||||||
|   Bvariable* bvnull = NULL; |   Bvariable* bvnull = NULL; | ||||||
|   std::pair<GC_gcbits_vars::iterator, bool> ins = |   std::pair<GC_gcbits_vars::iterator, bool> ins = | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Ian Lance Taylor
						Ian Lance Taylor