2015-02-17 8 views
13

मान लीजिए कि मैं एक सी प्रोग्राम को संकलित करने के लिए GCC का एक आधुनिक संस्करण उपयोग कर रहा हूं। इसके अलावा, इस बात पर विचार करें कि मेरे कार्यक्रम में पुरानी शाखाएं हैं, लेकिन मुझे उन अंतिम शाखाओं में मृत कोड की तरह अंतिम कार्यक्रम में संकलित और उपस्थित होना पसंद है। निम्नलिखित कार्यक्रम पर विचार करें: जाहिर हैक्या जीसीसी को निर्देश दिया जा सकता है कि मृत कोड को खत्म न किया जाए?

int main(int argc, char** argv) { 
    int a = 0; 
    goto skip; 
     a = -1; 
    skip: ; 
    return a; 
} 

, अगर मैं डिफ़ॉल्ट अनुकूलन सेटिंग्स के साथ GCC उपयोग करते हैं, दूसरे काम अंतिम कार्यक्रम के लिए यह कर कभी नहीं होगा, के रूप में संकलक आसानी से बता सकते हैं कि यह कभी नहीं क्रियान्वित किया जाएगा। मान लीजिए कि मैं यह नहीं करना चाहता हूं।

GCC में, झंडे कि मृत कोड (सबसे विशेष रूप -fdce) के साथ तर की एक संख्या देखते हैं, और मैं जब जीसीसी तदनुसार लागू स्पष्ट रूप से निष्क्रिय करने के लिए चुन सकते हैं: जहाँ तक मैं बता सकता हूँ

-fno-dce 
-fno-dse 
-fno-tree-dce 
-fno-tree-dse 

, इसे GCC को दूसरी असाइनमेंट के साथ गड़बड़ न करने का निर्देश देना चाहिए। फिर भी, संबंधित कोड इसे मेरे कार्यक्रम में कभी नहीं लग रहा है।

GCC क्यों मृत कोड को हटाने पर जोर देता है, और क्या दूसरा असाइनमेंट से छुटकारा पाने के लिए जीसीसी को निर्देश देने का कोई तरीका नहीं है?

+0

प्रयोग कर रहे हैं यह शाखाओं में दंड, आदि, जो अन्यथा हो सकता है जब 'उम्मीद' पथ लेने रोकने में मदद करता ? – anatolyg

+2

मुझे 'अस्थिर' के बारे में पता है, लेकिन मैं उत्सुक हूं कि जीसीसी के साथ ऐसा करना संभव है या नहीं। जीसीसी के लिए मैं संस्करण 4.8.3 का उपयोग कर रहा हूं, लेकिन मुझे यह जानने में दिलचस्पी होगी कि कोई समाधान दिया गया है या नहीं! – Caterpillar

+0

मेरी टिप्पणी को रद्द करें। अस्थिरता जीसीसी को असाइनमेंट छोड़ने से नहीं रोकती है। –

उत्तर

8

-fno-* विकल्प मेरे लिए या तो gcc-4.9.2 के साथ काम नहीं करते हैं। कहा, मुझे लगता है निम्नलिखित सभी जीसीसी (4.5+) के लक्ष्यों के लिए पोर्टेबल होना चाहिए:

__asm__ goto (""::::no_skip); 
goto skip; 

no_skip: 
    a = -1; 

skip:; 

मैनुअल से: "। एक एएसएम गोटो बयान हमेशा परोक्ष अस्थिर माना जाता है"

इसके अलावा, जीसीसी -4.8 और ऊपर के साथ, आप संकलक को यह जानने के लिए एक विशेषता जोड़ने पर विचार कर सकते हैं कि यह एक 'असंभव' पथ है।

no_skip: __attribute__ ((cold)); 

यह खड़ा तर्क करने कि आप भी इस्तेमाल कर सकते हैं:

skip: __attribute__ ((hot)); 
कौन सा जीसीसी संस्करण
+0

धन्यवाद। यह सवाल पूछता है कि क्यों मेरा उदाहरण जीसीसी द्वारा मृत कोड नहीं माना जाता है, या कम से कम क्यों दिए गए झंडे में दूसरी असाइनमेंट शामिल नहीं होती है (शायद पुरानी शाखा इतनी स्पष्ट रूप से पहुंच योग्य नहीं है कि इसे पहले के चरण में समाप्त नहीं किया गया है विकल्प)। – Caterpillar

+0

@ कैटरपिलर - मुझे संदेह है कि आप सही हैं, कि पहुंचने योग्य कोड पहले बिंदु पर समाप्त हो गया है। एक और संभावना यह है कि दस्तावेज़ीकरण विकास को ट्रैक नहीं करता है। [आंतरिक] (https://gcc.gnu.org/onlinedocs/gccint/Edges.html#Edges) दस्तावेज़ में कुछ रोचक विवरण हैं। –

संबंधित मुद्दे