Index: llvm/trunk/cmake/config-ix.cmake =================================================================== --- llvm/trunk/cmake/config-ix.cmake +++ llvm/trunk/cmake/config-ix.cmake @@ -532,6 +532,10 @@ "PATH to binutils/include containing plugin-api.h for gold plugin.") endif() +if(APPLE) + find_program(LD64_EXECUTABLE NAMES ld DOC "The ld64 linker") +endif() + include(FindOCaml) include(AddOCaml) if(WIN32) Index: llvm/trunk/test/CMakeLists.txt =================================================================== --- llvm/trunk/test/CMakeLists.txt +++ llvm/trunk/test/CMakeLists.txt @@ -70,6 +70,10 @@ set(LLVM_TEST_DEPENDS ${LLVM_TEST_DEPENDS} llvm-go) endif() +if(APPLE) + set(LLVM_TEST_DEPENDS ${LLVM_TEST_DEPENDS} LTO) +endif() + if(TARGET ocaml_llvm) set(LLVM_TEST_DEPENDS ${LLVM_TEST_DEPENDS} ocaml_llvm Index: llvm/trunk/test/Makefile =================================================================== --- llvm/trunk/test/Makefile +++ llvm/trunk/test/Makefile @@ -129,6 +129,7 @@ @$(ECHOPATH) s=@EXEEXT@=$(EXEEXT)=g >> lit.tmp @$(ECHOPATH) s=@PYTHON_EXECUTABLE@=$(PYTHON)=g >> lit.tmp @$(ECHOPATH) s=@GOLD_EXECUTABLE@=ld=g >> lit.tmp + @$(ECHOPATH) s=@LD64_EXECUTABLE@=ld=g >> lit.tmp @$(ECHOPATH) s=@OCAMLFIND@=$(OCAMLFIND)=g >> lit.tmp @$(ECHOPATH) s!@OCAMLFLAGS@!$(addprefix -cclib ,$(LDFLAGS))!g >> lit.tmp @$(ECHOPATH) s=@HAVE_OCAMLOPT@=$(HAVE_OCAMLOPT)=g >> lit.tmp Index: llvm/trunk/test/lit.cfg =================================================================== --- llvm/trunk/test/lit.cfg +++ llvm/trunk/test/lit.cfg @@ -188,6 +188,7 @@ # Add site-specific substitutions. config.substitutions.append( ('%gold', config.gold_executable) ) +config.substitutions.append( ('%ld64', config.ld64_executable) ) config.substitutions.append( ('%go', config.go_executable) ) config.substitutions.append( ('%llvmshlibdir', config.llvm_shlib_dir) ) config.substitutions.append( ('%shlibext', config.llvm_shlib_ext) ) @@ -369,6 +370,22 @@ if have_ld_plugin_support(): config.available_features.add('ld_plugin') +def have_ld64_plugin_support(): + if config.ld64_executable == '': + return False + + ld_cmd = subprocess.Popen([config.ld64_executable, '-v'], stderr = subprocess.PIPE) + ld_out = ld_cmd.stderr.read().decode() + ld_cmd.wait() + + if 'ld64' not in ld_out or 'LTO' not in ld_out: + return False + + return True + +if have_ld64_plugin_support(): + config.available_features.add('ld64_plugin') + # Ask llvm-config about assertion mode. try: llvm_config_cmd = subprocess.Popen( Index: llvm/trunk/test/lit.site.cfg.in =================================================================== --- llvm/trunk/test/lit.site.cfg.in +++ llvm/trunk/test/lit.site.cfg.in @@ -14,6 +14,7 @@ config.lit_tools_dir = "@LLVM_LIT_TOOLS_DIR@" config.python_executable = "@PYTHON_EXECUTABLE@" config.gold_executable = "@GOLD_EXECUTABLE@" +config.ld64_executable = "@LD64_EXECUTABLE@" config.ocamlfind_executable = "@OCAMLFIND@" config.have_ocamlopt = "@HAVE_OCAMLOPT@" config.have_ocaml_ounit = "@HAVE_OCAML_OUNIT@" Index: llvm/trunk/test/tools/lto/lit.local.cfg =================================================================== --- llvm/trunk/test/tools/lto/lit.local.cfg +++ llvm/trunk/test/tools/lto/lit.local.cfg @@ -0,0 +1,2 @@ +if not 'ld64_plugin' in config.available_features: + config.unsupported = True Index: llvm/trunk/test/tools/lto/opt-level.ll =================================================================== --- llvm/trunk/test/tools/lto/opt-level.ll +++ llvm/trunk/test/tools/lto/opt-level.ll @@ -0,0 +1,20 @@ +; RUN: llvm-as %s -o %t.o +; RUN: env DYLD_LIBRARY_PATH=%llvmshlibdir %ld64 -arch x86_64 -dylib -mllvm -O0 -o %t.dylib %t.o +; RUN: llvm-nm -no-llvm-bc %t.dylib | FileCheck --check-prefix=CHECK-O0 %s +; RUN: env DYLD_LIBRARY_PATH=%llvmshlibdir %ld64 -arch x86_64 -dylib -mllvm -O2 -o %t.dylib %t.o +; RUN: llvm-nm -no-llvm-bc %t.dylib | FileCheck --check-prefix=CHECK-O2 %s + +target triple = "x86_64-apple-macosx10.8.0" + +; CHECK-O0: t _f1 +; CHECK-O2-NOT: _f1 +define internal void @f1() { + ret void +} + +; CHECK-O0: T _f2 +; CHECK-O2: T _f2 +define void @f2() { + call void @f1() + ret void +}