2016-11-17 12 views
6

मैंने एक संरचना लौटने वाले 2 सी कार्यों की तुलना की। हम जानते हैं कि एबीआई स्तर पर बड़े ढांचे को पहले फंक्शन तर्क के रूप में पॉइंटर द्वारा पारित किया जा रहा है।वास्तव में क्या मतलब है?

struct S { 
    int words[8]; 
}; 

struct S fsret() { 
    struct S s; 
    s.words[0] = 1; 
    return s; 
} 

void fout(struct S* s) { 
    s->words[0] = 1; 
} 

इन कार्यों के लिए मैंने x86_64 लिनक्स और विंडोज के लिए असेंबली की जांच की। fsret को void @fsret(%struct.S* sret %s) के रूप में घोषित किया गया है।

इन दो प्रकारों की तुलना में, कैली पक्ष पर कोई अंतर नहीं है। हालांकि, कार्यों के अंदर fsret अतिरिक्त रूप से आरएक्स रजिस्टर में अपना पहला तर्क (संरचना के लिए सूचक) की प्रतिलिपि बनाता है। क्यूं कर?

+0

क्या आप 'करते हैं अगर (fsret() शब्द [0] == 10।) {Do_something(); } '? कंपाइलर को उस मामले में वापसी मूल्य की आवश्यकता होती है (सुनिश्चित नहीं है, केवल एक विचार) –

उत्तर

4

कारण this समीक्षा diff में निहित है:

if (Subtarget->is64Bit() || Subtarget->isTargetKnownWindowsMSVC()) { 
    for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) { 
    // The x86-64 ABIs require that for returning structs by value we copy 
    // the sret argument into %rax/%eax (depending on ABI) for the return. 
    // Win32 requires us to put the sret argument to %eax as well. 
    // Save the argument into a virtual register so that we can access it 
    // from the return points. 

तो कॉल प्राप्त करने वाला स्मृति फोन करने वाले द्वारा आपूर्ति को भरने के लिए है और सूचक है कि यह रूप में अच्छी तरह पारित किया गया था वापस जाएँ।

यह x86_64 r252 सिस्टम वी ABI दस्तावेज़

मूल्यों के रिटर्निंग द्वारा की पुष्टि की है मूल्यों के लौटने निम्नलिखित एल्गोरिथ्म के अनुसार किया जाता है:

  1. वर्गीकृत वर्गीकरण के साथ वापसी प्रकार कलन विधि।
  2. प्रकार वर्ग स्मृति नहीं हैं (ndMarco: IE बड़ा सामान), तो फोन करने वाले वापसी मूल्य के लिए स्थान प्रदान करता है और% RDI में इस भंडारण के पते से गुजरता है जैसे कि यह कार्य करने के लिए पहले तर्क थे । असल में, यह पता एक "छुपा" पहला तर्क बन जाता है। इस संग्रहण को इस तर्क के मुकाबले अन्य नामों के माध्यम से कैली को दिखाई देने वाले किसी भी डेटा को ओवरलैप नहीं करना चाहिए। वापसी पर% रैक्स में उस पते को शामिल किया जाएगा जो कॉलर द्वारा% आरडीआई में पारित किया गया है।
+1

महान उत्तर! क्या आप जानते हैं कि अन्य लक्ष्यों के लिए समान आवश्यकताएं हैं या नहीं? –

+0

@ PawełBylica [o32 और eabi] (http://www.brunocardoso.cc/blog/?p=27), कई एबीआई दस्तावेज बदले हैं –

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