fix(armv7): split record_header_indices loop to work around rustc/LLVM bug
rustc issue: https://github.com/rust-lang/rust/issues/55105 Steps to reproduce: ``` rustup target add armv7-linux-androideabi RUSTFLAGS="-Ctarget-feature=+neon" cargo build --target armv7-linux-androideabi --release ``` Output without this change: ``` Compiling hyper v0.12.11 (/home/simon/projects/servo-deps/hyper) LLVM ERROR: ran out of registers during register allocation error: Could not compile `hyper`. ```
This commit is contained in:
		
				
					committed by
					
						 Sean McArthur
						Sean McArthur
					
				
			
			
				
	
			
			
			
						parent
						
							66a857d801
						
					
				
				
					commit
					30a4f2376a
				
			| @@ -920,13 +920,41 @@ struct HeaderIndices { | ||||
|  | ||||
| fn record_header_indices(bytes: &[u8], headers: &[httparse::Header], indices: &mut [HeaderIndices]) { | ||||
|     let bytes_ptr = bytes.as_ptr() as usize; | ||||
|     for (header, indices) in headers.iter().zip(indices.iter_mut()) { | ||||
|         let name_start = header.name.as_ptr() as usize - bytes_ptr; | ||||
|         let name_end = name_start + header.name.len(); | ||||
|         indices.name = (name_start, name_end); | ||||
|         let value_start = header.value.as_ptr() as usize - bytes_ptr; | ||||
|         let value_end = value_start + header.value.len(); | ||||
|         indices.value = (value_start, value_end); | ||||
|  | ||||
|     // FIXME: This should be a single plain `for` loop. | ||||
|     // Splitting it is a work-around for https://github.com/rust-lang/rust/issues/55105 | ||||
|     macro_rules! split_loops_if { | ||||
|         ( | ||||
|             cfg($($cfg: tt)+) | ||||
|             for $i: pat in ($iter: expr) { | ||||
|                 $body1: block | ||||
|                 $body2: block | ||||
|             } | ||||
|         ) => { | ||||
|             for $i in $iter { | ||||
|                 $body1 | ||||
|                 #[cfg(not($($cfg)+))] $body2 | ||||
|             } | ||||
|             #[cfg($($cfg)+)] | ||||
|             for $i in $iter { | ||||
|                 $body2 | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     split_loops_if! { | ||||
|         cfg(all(target_arch = "arm", target_feature = "v7", target_feature = "neon")) | ||||
|         for (header, indices) in (headers.iter().zip(indices.iter_mut())) { | ||||
|             { | ||||
|                 let name_start = header.name.as_ptr() as usize - bytes_ptr; | ||||
|                 let name_end = name_start + header.name.len(); | ||||
|                 indices.name = (name_start, name_end); | ||||
|             } | ||||
|             { | ||||
|                 let value_start = header.value.as_ptr() as usize - bytes_ptr; | ||||
|                 let value_end = value_start + header.value.len(); | ||||
|                 indices.value = (value_start, value_end); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user