@@ -35,7 +35,8 @@ pub struct TargetDataLayout {
35
35
pub aggregate_align : Align ,
36
36
37
37
/// Alignments for vector types.
38
- pub vector_align : Vec < ( Size , Align ) >
38
+ pub vector_align : Vec < ( Size , Align ) > ,
39
+ pub instruction_address_space : u32 ,
39
40
}
40
41
41
42
impl Default for TargetDataLayout {
@@ -57,13 +58,22 @@ impl Default for TargetDataLayout {
57
58
vector_align : vec ! [
58
59
( Size :: from_bits( 64 ) , Align :: from_bits( 64 , 64 ) . unwrap( ) ) ,
59
60
( Size :: from_bits( 128 ) , Align :: from_bits( 128 , 128 ) . unwrap( ) )
60
- ]
61
+ ] ,
62
+ instruction_address_space : 0 ,
61
63
}
62
64
}
63
65
}
64
66
65
67
impl TargetDataLayout {
66
68
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
+
67
77
// Parse a bit count from a string.
68
78
let parse_bits = |s : & str , kind : & str , cause : & str | {
69
79
s. parse :: < u64 > ( ) . map_err ( |err| {
@@ -96,6 +106,9 @@ impl TargetDataLayout {
96
106
match spec. split ( ':' ) . collect :: < Vec < _ > > ( ) [ ..] {
97
107
[ "e" ] => dl. endian = Endian :: Little ,
98
108
[ "E" ] => dl. endian = Endian :: Big ,
109
+ [ p] if p. starts_with ( "P" ) => {
110
+ dl. instruction_address_space = parse_address_space ( & p[ 1 ..] , "P" ) ?
111
+ }
99
112
[ "a" , ref a..] => dl. aggregate_align = align ( a, "a" ) ?,
100
113
[ "f32" , ref a..] => dl. f32_align = align ( a, "f32" ) ?,
101
114
[ "f64" , ref a..] => dl. f64_align = align ( a, "f64" ) ?,
0 commit comments