From 317248f01fc400001ac167a0688946f75c2ccca4 Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Tue, 28 May 2013 12:10:53 -0400 Subject: [PATCH 1/2] expose the ability to set unnamed_addr --- src/librustc/lib/llvm.rs | 14 ++++++++++++++ src/rustllvm/RustWrapper.cpp | 5 +++++ 2 files changed, 19 insertions(+) diff --git a/src/librustc/lib/llvm.rs b/src/librustc/lib/llvm.rs index ac675df3399e5..82319ff9d3876 100644 --- a/src/librustc/lib/llvm.rs +++ b/src/librustc/lib/llvm.rs @@ -1903,6 +1903,10 @@ pub mod llvm { Constraints: *c_char, SideEffects: Bool, AlignStack: Bool, Dialect: c_uint) -> ValueRef; + + #[fast_ffi] + pub unsafe fn LLVMSetUnnamedAddr(Global: ValueRef, value: Bool); + } } @@ -1911,27 +1915,37 @@ pub fn SetInstructionCallConv(Instr: ValueRef, CC: CallConv) { llvm::LLVMSetInstructionCallConv(Instr, CC as c_uint); } } + pub fn SetFunctionCallConv(Fn: ValueRef, CC: CallConv) { unsafe { llvm::LLVMSetFunctionCallConv(Fn, CC as c_uint); } } + pub fn SetLinkage(Global: ValueRef, Link: Linkage) { unsafe { llvm::LLVMSetLinkage(Global, Link as c_uint); } } +pub fn set_unnamed_addr(global: ValueRef, value: bool) { + unsafe { + llvm::LLVMSetUnnamedAddr(global, value as Bool) + } +} + pub fn ConstICmp(Pred: IntPredicate, V1: ValueRef, V2: ValueRef) -> ValueRef { unsafe { llvm::LLVMConstICmp(Pred as c_ushort, V1, V2) } } + pub fn ConstFCmp(Pred: RealPredicate, V1: ValueRef, V2: ValueRef) -> ValueRef { unsafe { llvm::LLVMConstFCmp(Pred as c_ushort, V1, V2) } } + /* Memory-managed object interface to type handles. */ pub struct TypeNames { diff --git a/src/rustllvm/RustWrapper.cpp b/src/rustllvm/RustWrapper.cpp index cff448b6a1a34..f5ae06e32ab0c 100644 --- a/src/rustllvm/RustWrapper.cpp +++ b/src/rustllvm/RustWrapper.cpp @@ -603,3 +603,8 @@ extern "C" LLVMValueRef LLVMInlineAsm(LLVMTypeRef Ty, Constraints, HasSideEffects, IsAlignStack, (InlineAsm::AsmDialect) Dialect)); } + +extern "C" void LLVMSetUnnamedAddr(LLVMValueRef Global, LLVMBool value) { + GlobalValue *GV = unwrap(Global); + GV->setUnnamedAddr(value); +} From 7c3c8ae16de162c574625e0e6c8bedfbd6fdd589 Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Tue, 28 May 2013 13:21:00 -0400 Subject: [PATCH 2/2] mark glue functions with unnamed_addr --- src/librustc/middle/trans/glue.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/librustc/middle/trans/glue.rs b/src/librustc/middle/trans/glue.rs index 2f48eda7edd26..d45a01efca37c 100644 --- a/src/librustc/middle/trans/glue.rs +++ b/src/librustc/middle/trans/glue.rs @@ -717,7 +717,12 @@ pub fn declare_generic_glue(ccx: @CrateContext, t: ty::t, llfnty: TypeRef, note_unique_llvm_symbol(ccx, fn_nm); let llfn = decl_cdecl_fn(ccx.llmod, *fn_nm, llfnty); set_glue_inlining(llfn, t); - return llfn; + + // glue functions aren't visible to user code, so function pointer addresses are never + // semantically relevant - we can inform LLVM and allow it to merge the functions + lib::llvm::set_unnamed_addr(llfn, true); + + llfn } pub fn make_generic_glue_inner(ccx: @CrateContext,