@@ -35,7 +35,8 @@ pub struct TargetDataLayout {
3535 pub aggregate_align : Align ,
3636
3737 /// Alignments for vector types.
38- pub vector_align : Vec < ( Size , Align ) >
38+ pub vector_align : Vec < ( Size , Align ) > ,
39+ pub instruction_address_space : u32 ,
3940}
4041
4142impl Default for TargetDataLayout {
@@ -57,13 +58,22 @@ impl Default for TargetDataLayout {
5758 vector_align : vec ! [
5859 ( Size :: from_bits( 64 ) , Align :: from_bits( 64 , 64 ) . unwrap( ) ) ,
5960 ( Size :: from_bits( 128 ) , Align :: from_bits( 128 , 128 ) . unwrap( ) )
60- ]
61+ ] ,
62+ instruction_address_space : 0 ,
6163 }
6264 }
6365}
6466
6567impl TargetDataLayout {
6668 pub fn parse ( target : & Target ) -> Result < TargetDataLayout , String > {
69+ // Parse an address space index from a string.
70+ let parse_address_space = |s : & str , cause : & str | {
71+ s. parse :: < u32 > ( ) . map_err ( |err| {
72+ format ! ( "invalid address space `{}` for `{}` in \" data-layout\" : {}" ,
73+ s, cause, err)
74+ } )
75+ } ;
76+
6777 // Parse a bit count from a string.
6878 let parse_bits = |s : & str , kind : & str , cause : & str | {
6979 s. parse :: < u64 > ( ) . map_err ( |err| {
@@ -96,6 +106,9 @@ impl TargetDataLayout {
96106 match spec. split ( ':' ) . collect :: < Vec < _ > > ( ) [ ..] {
97107 [ "e" ] => dl. endian = Endian :: Little ,
98108 [ "E" ] => dl. endian = Endian :: Big ,
109+ [ p] if p. starts_with ( "P" ) => {
110+ dl. instruction_address_space = parse_address_space ( & p[ 1 ..] , "P" ) ?
111+ }
99112 [ "a" , ref a..] => dl. aggregate_align = align ( a, "a" ) ?,
100113 [ "f32" , ref a..] => dl. f32_align = align ( a, "f32" ) ?,
101114 [ "f64" , ref a..] => dl. f64_align = align ( a, "f64" ) ?,
0 commit comments