@@ -465,33 +465,38 @@ impl CodegenCx<'b, 'tcx> {
465465 self . declare_intrinsic ( key) . unwrap_or_else ( || bug ! ( "unknown intrinsic '{}'" , key) )
466466 }
467467
468+ fn insert_intrinsic (
469+ & self , name : & ' static str , args : Option < & [ & ' b llvm:: Type ] > , ret : & ' b llvm:: Type
470+ ) -> & ' b llvm:: Value {
471+ let fn_ty = if let Some ( args) = args {
472+ self . type_func ( args, ret)
473+ } else {
474+ self . type_variadic_func ( & [ ] , ret)
475+ } ;
476+ let f = self . declare_cfn ( name, fn_ty) ;
477+ llvm:: SetUnnamedAddr ( f, false ) ;
478+ self . intrinsics . borrow_mut ( ) . insert ( name, f. clone ( ) ) ;
479+ f
480+ }
481+
468482 fn declare_intrinsic (
469483 & self ,
470484 key : & str
471485 ) -> Option < & ' b Value > {
472486 macro_rules! ifn {
473487 ( $name: expr, fn ( ) -> $ret: expr) => (
474488 if key == $name {
475- let f = self . declare_cfn( $name, self . type_func( & [ ] , $ret) ) ;
476- llvm:: SetUnnamedAddr ( f, false ) ;
477- self . intrinsics. borrow_mut( ) . insert( $name, f. clone( ) ) ;
478- return Some ( f) ;
489+ return Some ( self . insert_intrinsic( $name, Some ( & [ ] ) , $ret) ) ;
479490 }
480491 ) ;
481492 ( $name: expr, fn ( ...) -> $ret: expr) => (
482493 if key == $name {
483- let f = self . declare_cfn( $name, self . type_variadic_func( & [ ] , $ret) ) ;
484- llvm:: SetUnnamedAddr ( f, false ) ;
485- self . intrinsics. borrow_mut( ) . insert( $name, f. clone( ) ) ;
486- return Some ( f) ;
494+ return Some ( self . insert_intrinsic( $name, None , $ret) ) ;
487495 }
488496 ) ;
489497 ( $name: expr, fn ( $( $arg: expr) ,* ) -> $ret: expr) => (
490498 if key == $name {
491- let f = self . declare_cfn( $name, self . type_func( & [ $( $arg) ,* ] , $ret) ) ;
492- llvm:: SetUnnamedAddr ( f, false ) ;
493- self . intrinsics. borrow_mut( ) . insert( $name, f. clone( ) ) ;
494- return Some ( f) ;
499+ return Some ( self . insert_intrinsic( $name, Some ( & [ $( $arg) ,* ] ) , $ret) ) ;
495500 }
496501 ) ;
497502 }
0 commit comments