2016-03-10 5 views
11

के साथ एलटीओ मैं एक सीएमके परियोजना पर एलएलवीएम के साथ लिंक टाइम ऑप्टिमाइज़ेशन लागू करने की कोशिश कर रहा हूं, जो साझा लाइब्रेरी बनाता है। मेरा सवाल इस जैसा है:एलएलवीओ और सीएमके

Switching between GCC and Clang/LLVM using CMake

हालांकि, उत्तर अब लागू नहीं होते हैं, क्योंकि llvm-ld नए संस्करणों में मौजूद नहीं है।

संकलित बाइट कोड को:

clang++ -c FirstClass.cpp -O3 -flto -o FirstClass.bc 
clang++ -c SecondClass.cpp -O3 -flto -o SecondClass.bc 

लिंक बाइट कोड:

llvm-link FirstClass.bc SecondClass.bc -o unoptimized.bc 

कमांड लाइन पर, मैं LTO (यह मानते हुए केवल 2 .cpp फ़ाइलें हैं) प्राप्त करने के लिए निम्नलिखित कमांड चलाने बाइट कोड अनुकूलित करें:

opt -O3 unoptimized.bc -o optimized.bc 

साझा ऑब्जेक्ट में बाइट कोड कनवर्ट करें:

clang++ -shared optimized.bc -o libTest.so 

क्या कोई मुझे बता सकता है कि सीएमके अतिरिक्त कदम कैसे चला सकता है?

+2

यह [ 'add_custom_command'] के लिए एक नौकरी हो सकता है (https://cmake.org/cmake/help/v3 .0/कमांड/add_custom_command.html) सेमेक की ... कुछ जोड़ने जैसे 'add_custom_command (OUTPUT libTest.so COMMAND clang ++ -shared optimized.bc -o libTest.so MAIN_DEPENDENCY optimized.bc)' http://stackoverflow.com/ देखें प्रश्न/13470499/cmake-एड-कस्टम आदेश-साथ-निर्भरता-से-एक अलग-निर्देशिका – francis

उत्तर

6

बजना का उपयोग करें और LTO clang कमांड लाइन के लिए -flto ध्वज का उपयोग कर रहा है दोनों संकलन और लिंक समय में सक्षम करने के लिए सही तरीका।

इसके अलावा, आपको एक लिंकर के साथ एक मंच पर काम करने की आवश्यकता होगी जो या तो सीधे एलटीओ (ऐप्पल के प्लेटफार्मों का समर्थन करता है) या उसके पास एलएलवीएम लिंकर प्लगइन (गोल्ड लिंकर का उपयोग कर लिनक्स है, लेकिन मुझे लगता है कि कुछ ने इसे प्राप्त किया है लिंकर प्लगइन का समर्थन करने के लिए बीएफडी लिंकर भी)। यदि आप लिंकर प्लगइन का उपयोग कर रहे हैं, तो आपको यह सुनिश्चित करना होगा कि एलएलवीएम के इंस्टॉल ने प्लगइन बनाया और इंस्टॉल किया हो। यदि ऐसा होता है, तो साझा ऑब्जेक्ट्स के लिए भी -flto से लिंक करते समय क्लैंग प्लगइन का उपयोग करने के लिए आवश्यक लिंकर कमांड लाइन विकल्प स्वचालित रूप से जोड़ देगा।

इसके अलावा, एलएलवीएम प्रोजेक्ट एक नए लिंकर (एलएलडी) पर काम कर रहा है जो एलटीओ को सभी प्लेटफार्मों पर बॉक्स के बाहर समर्थन देगा, लेकिन यह अभी भी शुरुआती दिनों में है। वर्तमान में मैं विंडोज और लिनक्स पर अपने एलटीओ समर्थन का परीक्षण करने वाले लोगों के बारे में जानता हूं, और ऐसा लगता है कि यह अच्छी तरह से काम कर रहा है लेकिन अभी भी कई विशेषताओं को याद करता है।

1

को सक्षम करने से (पतली) CMake 3.9 पर LTO और नए सरल होना चाहिए:

include(CheckIPOSupported) 
check_ipo_supported() 
set_target_properties(myProject PROPERTIES INTERPROCEDURAL_OPTIMIZATION TRUE) 

के बजाय set_target_properties परियोजना प्रति, set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) की एक एकल वैश्विक सेटिंग किया जा सकता है।

आदेश recompiles में तेजी लाने के लिए, LTO के लिए एक कैश सेट किया जा सकता:

function(append value) 
    foreach(variable ${ARGN}) 
     set(${variable} "${${variable}} ${value}" PARENT_SCOPE) 
    endforeach(variable) 
endfunction() 

append("-fuse-ld=gold -Wl,--no-threads,--plugin-opt,cache-dir=${PROJECT_BINARY_DIR}/lto.cache" CMAKE_EXE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS) 

यह बलों gold लिंकर के रूप में, क्रम में सही कमांड लाइन विकल्पों का उपयोग करने में। इसे /usr/lib/LLVMgold.so से /usr/lib/llvm-4.0/lib/LLVMgold.so के सिम्लिंक की आवश्यकता हो सकती है।

2

check_ipo_supported() मेरे लिए परिणामस्वरूप "Policy CMP0069 सेट नहीं है" सीएमके 3.9.1 पर त्रुटि।

इसकी सहायता के अनुसार, 3.8 तक सीएमके केवल इंटेल कंपाइलर के एलटीओ का समर्थन करता है। यह मेरे लिए एक्सकोड 9 के क्लैंग पर भी काम नहीं करता था।

अंत में क्या काम किया,: add_executable() जरूरतों की तरह cmake_policy(SET CMP0069 NEW) के बाद होने की

cmake_policy(SET CMP0069 NEW) 
include(CheckIPOSupported) 
check_ipo_supported() 

add_executable(Foobar SOURCES) 
set_target_properties(Foobar PROPERTIES INTERPROCEDURAL_OPTIMIZATION TRUE) 

लग रहा है।

LTO कैश

target_link_libraries(Foobar "-Wl,-cache_path_lto,${PROJECT_BINARY_DIR}/lto.cache") कोई नुकसान नहीं किया था।

अपना कमांड लाइन विकल्प depending on your linker चुनें।

अधिक क्रूर विकल्प

@ ChandlerCarruth के जवाब के अनुसार

:

if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") 
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -flto") 
    target_link_libraries(Foobar -flto) 
endif()