From 86309ed3ea896473641c9cdeadf16b02931b8ac8 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Mon, 28 Feb 2011 16:08:05 -0800 Subject: rustc: Write tag variant discriminants into the crate as integer constants --- src/comp/middle/trans.rs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index 189c742c..b2ef0f16 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -4609,12 +4609,26 @@ fn trans_constant(&@crate_ctxt cx, @ast.item it) -> @crate_ctxt { auto n_variants = _vec.len[ast.variant](variants); while (i < n_variants) { auto variant = variants.(i); + + auto discrim_val = C_int(i as int); + + // FIXME: better name. + auto discrim_gvar = llvm.LLVMAddGlobal(cx.llmod, T_int(), + _str.buf("tag_discrim")); + + // FIXME: Eventually we do want to export these, but we need + // to figure out what name they get first! + llvm.LLVMSetInitializer(discrim_gvar, discrim_val); + llvm.LLVMSetGlobalConstant(discrim_gvar, True); + llvm.LLVMSetLinkage(discrim_gvar, lib.llvm.LLVMPrivateLinkage + as llvm.Linkage); + if (_vec.len[ast.variant_arg](variant.args) == 0u) { // Nullary tags become constants. (N-ary tags are treated // as functions and generated later.) auto union_val = C_zero_byte_arr(info.size as uint); - auto val = C_struct(vec(C_int(i as int), union_val)); + auto val = C_struct(vec(discrim_val, union_val)); // FIXME: better name auto gvar = llvm.LLVMAddGlobal(cx.llmod, val_ty(val), -- cgit v1.2.3