Skip to content

Commit d485152

Browse files
committed
---
yaml --- r: 23748 b: refs/heads/master c: 81695d8 h: refs/heads/master v: v3
1 parent dab6b76 commit d485152

File tree

5 files changed

+51
-7
lines changed

5 files changed

+51
-7
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: 31af60b257983da1a77336ee033406350eb14ee9
2+
refs/heads/master: 81695d85dc9a56392c13db918008d00a7de3c54f
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: cd6f24f9d14ac90d167386a56e7a6ac1f0318195
55
refs/heads/try: ffbe0e0e00374358b789b0037bcb3a577cd218be

trunk/src/rustc/metadata/encoder.rs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ export encode_metadata;
2727
export encoded_ty;
2828
export reachable;
2929
export encode_inlined_item;
30+
export metadata_encoding_version;
3031

3132
// used by astencode:
3233
export def_to_str;
@@ -1084,6 +1085,13 @@ fn encode_hash(ebml_w: ebml::Writer, hash: ~str) {
10841085
ebml_w.end_tag();
10851086
}
10861087

1088+
// NB: Increment this as you change the metadata encoding version.
1089+
const metadata_encoding_version : &[u8] = &[0x72, //'r' as u8,
1090+
0x75, //'u' as u8,
1091+
0x73, //'s' as u8,
1092+
0x74, //'t' as u8,
1093+
0, 0, 0, 1 ];
1094+
10871095
fn encode_metadata(parms: encode_parms, crate: @crate) -> ~[u8] {
10881096
let buf = io::mem_buffer();
10891097
let stats =
@@ -1163,7 +1171,18 @@ fn encode_metadata(parms: encode_parms, crate: @crate) -> ~[u8] {
11631171
// Pad this, since something (LLVM, presumably) is cutting off the
11641172
// remaining % 4 bytes.
11651173
buf_w.write(&[0u8, 0u8, 0u8, 0u8]);
1166-
flate::deflate_buf(io::mem_buffer_buf(buf))
1174+
1175+
// FIXME #3396: weird bug here, for reasons unclear this emits random
1176+
// looking bytes (mostly 0x1) if we use the version byte-array constant
1177+
// above; so we use a string constant inline instead.
1178+
//
1179+
// Should be:
1180+
//
1181+
// vec::from_slice(metadata_encoding_version) +
1182+
1183+
(do str::as_bytes(~"rust\x00\x00\x00\x01") |bytes| {
1184+
vec::slice(bytes, 0, 8)
1185+
}) + flate::deflate_buf(io::mem_buffer_buf(buf))
11671186
}
11681187

11691188
// Get the encoded string for a type

trunk/src/rustc/metadata/loader.rs

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -185,11 +185,30 @@ fn get_metadata_section(os: os,
185185
if name == meta_section_name(os) {
186186
let cbuf = llvm::LLVMGetSectionContents(si.llsi);
187187
let csz = llvm::LLVMGetSectionSize(si.llsi) as uint;
188+
let mut found = None;
188189
unsafe {
189190
let cvbuf: *u8 = unsafe::reinterpret_cast(&cbuf);
190-
let v = vec::unsafe::from_buf(cvbuf, csz);
191-
let inflated = flate::inflate_buf(v);
192-
return Some(@inflated);
191+
let vlen = vec::len(encoder::metadata_encoding_version);
192+
debug!("checking %u bytes of metadata-version stamp",
193+
vlen);
194+
let minsz = uint::min(vlen, csz);
195+
let mut version_ok = false;
196+
do vec::unsafe::form_slice(cvbuf, minsz) |buf0| {
197+
version_ok = (buf0 ==
198+
encoder::metadata_encoding_version);
199+
}
200+
if !version_ok { return None; }
201+
202+
let cvbuf1 = ptr::offset(cvbuf, vlen);
203+
debug!("inflating %u bytes of compressed metadata",
204+
csz - vlen);
205+
do vec::unsafe::form_slice(cvbuf1, csz-vlen) |buf| {
206+
let inflated = flate::inflate_buf(buf);
207+
found = move Some(@(move inflated));
208+
}
209+
if found != None {
210+
return found;
211+
}
193212
}
194213
}
195214
llvm::LLVMMoveToNextSection(si.llsi);

trunk/src/rustc/middle/trans/common.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -970,13 +970,19 @@ fn C_array(ty: TypeRef, elts: ~[ValueRef]) -> ValueRef unsafe {
970970
}
971971
972972
fn C_bytes(bytes: ~[u8]) -> ValueRef unsafe {
973+
return llvm::LLVMConstString(
974+
unsafe::reinterpret_cast(&vec::unsafe::to_ptr(bytes)),
975+
bytes.len() as c_uint, True);
976+
}
977+
978+
fn C_bytes_plus_null(bytes: ~[u8]) -> ValueRef unsafe {
973979
return llvm::LLVMConstString(
974980
unsafe::reinterpret_cast(&vec::unsafe::to_ptr(bytes)),
975981
bytes.len() as c_uint, False);
976982
}
977983
978984
fn C_shape(ccx: @crate_ctxt, bytes: ~[u8]) -> ValueRef {
979-
let llshape = C_bytes(bytes);
985+
let llshape = C_bytes_plus_null(bytes);
980986
let llglobal = str::as_c_str(fmt!("shape%u", ccx.names(~"shape")), |buf| {
981987
llvm::LLVMAddGlobal(ccx.llmod, val_ty(llshape), buf)
982988
});
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
// error-pattern: unresolved import
1+
// error-pattern: unresolved name
22

33
fn main() { let foo = thing::len(~[]); }

0 commit comments

Comments
 (0)