From 8826fdfe37a7cbf901ddced1d7e2b4320e117461 Mon Sep 17 00:00:00 2001 From: Keegan McAllister Date: Sun, 28 Sep 2014 09:25:48 -0700 Subject: [PATCH] Keep ExpnId abstract by providing conversions --- mk/crates.mk | 2 +- src/librustc/back/write.rs | 2 +- src/librustc/middle/trans/asm.rs | 2 +- src/libsyntax/ast.rs | 4 ++-- src/libsyntax/codemap.rs | 16 ++++++++++++++-- src/libsyntax/ext/asm.rs | 2 +- src/libsyntax/lib.rs | 1 + 7 files changed, 21 insertions(+), 8 deletions(-) diff --git a/mk/crates.mk b/mk/crates.mk index ed3fce775f31..9f01ff23c7fc 100644 --- a/mk/crates.mk +++ b/mk/crates.mk @@ -71,7 +71,7 @@ DEPS_graphviz := std DEPS_green := std native:context_switch DEPS_rustuv := std native:uv native:uv_support DEPS_native := std -DEPS_syntax := std term serialize log fmt_macros debug arena +DEPS_syntax := std term serialize log fmt_macros debug arena libc DEPS_rustc := syntax flate arena serialize getopts rbml \ time log graphviz debug rustc_llvm rustc_back DEPS_rustc_llvm := native:rustllvm libc std diff --git a/src/librustc/back/write.rs b/src/librustc/back/write.rs index 8e703d954f30..7b4d1780ccd6 100644 --- a/src/librustc/back/write.rs +++ b/src/librustc/back/write.rs @@ -345,7 +345,7 @@ unsafe extern "C" fn inline_asm_handler(diag: SMDiagnosticRef, match cgcx.lto_ctxt { Some((sess, _)) => { - sess.codemap().with_expn_info(ExpnId(cookie as u32), |info| match info { + sess.codemap().with_expn_info(ExpnId::from_llvm_cookie(cookie), |info| match info { Some(ei) => sess.span_err(ei.call_site, msg.as_slice()), None => sess.err(msg.as_slice()), }); diff --git a/src/librustc/middle/trans/asm.rs b/src/librustc/middle/trans/asm.rs index b4c10c78db87..c51e24202624 100644 --- a/src/librustc/middle/trans/asm.rs +++ b/src/librustc/middle/trans/asm.rs @@ -149,7 +149,7 @@ pub fn trans_inline_asm<'blk, 'tcx>(bcx: Block<'blk, 'tcx>, ia: &ast::InlineAsm) let kind = llvm::LLVMGetMDKindIDInContext(bcx.ccx().llcx(), key.as_ptr() as *const c_char, key.len() as c_uint); - let val: llvm::ValueRef = C_i32(bcx.ccx(), ia.expn_id as i32); + let val: llvm::ValueRef = C_i32(bcx.ccx(), ia.expn_id.to_llvm_cookie()); llvm::LLVMSetMetadata(r, kind, llvm::LLVMMDNodeInContext(bcx.ccx().llcx(), &val, 1)); diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs index 43d6b9b9e905..0fee3ff32185 100644 --- a/src/libsyntax/ast.rs +++ b/src/libsyntax/ast.rs @@ -10,7 +10,7 @@ // The Rust abstract syntax tree. -use codemap::{Span, Spanned, DUMMY_SP}; +use codemap::{Span, Spanned, DUMMY_SP, ExpnId}; use abi::Abi; use ast_util; use owned_slice::OwnedSlice; @@ -984,7 +984,7 @@ pub struct InlineAsm { pub volatile: bool, pub alignstack: bool, pub dialect: AsmDialect, - pub expn_id: u32, + pub expn_id: ExpnId, } /// represents an argument in a function header diff --git a/src/libsyntax/codemap.rs b/src/libsyntax/codemap.rs index d44de7862a33..e9b2556c53e2 100644 --- a/src/libsyntax/codemap.rs +++ b/src/libsyntax/codemap.rs @@ -26,6 +26,7 @@ source code snippets, etc. use serialize::{Encodable, Decodable, Encoder, Decoder}; use std::cell::RefCell; use std::rc::Rc; +use libc::c_uint; pub trait Pos { fn from_uint(n: uint) -> Self; @@ -223,11 +224,22 @@ pub struct ExpnInfo { pub callee: NameAndSpan } -#[deriving(PartialEq, Eq, Clone, Show, Hash)] -pub struct ExpnId(pub u32); +#[deriving(PartialEq, Eq, Clone, Show, Hash, Encodable, Decodable)] +pub struct ExpnId(u32); pub static NO_EXPANSION: ExpnId = ExpnId(-1); +impl ExpnId { + pub fn from_llvm_cookie(cookie: c_uint) -> ExpnId { + ExpnId(cookie as u32) + } + + pub fn to_llvm_cookie(self) -> i32 { + let ExpnId(cookie) = self; + cookie as i32 + } +} + pub type FileName = String; pub struct FileLines { diff --git a/src/libsyntax/ext/asm.rs b/src/libsyntax/ext/asm.rs index f82fe4b13a21..702be0c0eeed 100644 --- a/src/libsyntax/ext/asm.rs +++ b/src/libsyntax/ext/asm.rs @@ -199,7 +199,7 @@ pub fn expand_asm<'cx>(cx: &'cx mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) } } - let codemap::ExpnId(expn_id) = cx.codemap().record_expansion(codemap::ExpnInfo { + let expn_id = cx.codemap().record_expansion(codemap::ExpnInfo { call_site: sp, callee: codemap::NameAndSpan { name: "asm".to_string(), diff --git a/src/libsyntax/lib.rs b/src/libsyntax/lib.rs index 7a504d22c1e9..a42715441465 100644 --- a/src/libsyntax/lib.rs +++ b/src/libsyntax/lib.rs @@ -33,6 +33,7 @@ extern crate debug; #[phase(plugin, link)] extern crate log; extern crate serialize; extern crate term; +extern crate libc; pub mod util { pub mod interner;