yaxunl added a comment. Thanks for your comments.
It works like this, e.g. $ cat prog.ll declare i32 @foo() define void @use_foo() { %a = call i32 @foo() ret void } $ cat lib_common.ll define linkonce_odr i32 @foo() { ret i32 1; } $ cat lib_opt.ll define linkonce_odr i32 @foo() { ret i32 2; } $ llvm-link prog.ll lib_common.ll -override lib_opt.ll -S ; ModuleID = 'llvm-link' define void @use_foo() { %a = call i32 @foo() ret void } define linkonce_odr i32 @foo() { ret i32 2 } We can put all common functions in lib_common.ll, then only put a subset in lib_opt.ll. Functions in lib_opt.ll will override functions in lib_common.ll. For different GPUs we provide different lib_opt.ll. Each GPU may override different subset of lib_common.ll. We use __attribute__((linkonce_odr_linkage)) by following the precedence of __attribute__((internal_linkage)) which exposes the LLVM internal_linkage to C/C++ programmers. We would like to accept suggestions for a better way to expose the linkonce_odr linkage. Repository: rL LLVM http://reviews.llvm.org/D18095 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits