2015-03-03 7 views
5

समस्या यह है कि एक सी समारोह के अंदर मेरे पास एक इनलाइन असेंबली है। कुछ की तरहइनलाइन असेंबली के लिए निरंतर पूल बनाने का सही तरीका क्या है?

ldr r7, =0xdeadbeef 
    svc 0 

तो एक शाब्दिक पूल स्पष्ट रूप से (यदि यह मामला है) नहीं बनाया गया था, कोडांतरक अनुवाद इकाई के अंत में एक बनाता है। आमतौर पर यह ठीक है, लेकिन अगर अनुवाद इकाई वास्तव में बड़ी हो जाती है, तो यह काम नहीं करती है, क्योंकि शाब्दिक पूल एलडीआर निर्देश से बहुत दूर है।

तो, मुझे आश्चर्य है कि समस्या को संभालने का सबसे अच्छा तरीका क्या है। सबसे स्पष्ट रास्ता इनलाइन विधानसभा के अंदर स्वयं एक शाब्दिक पूल बनाने के लिए है:

ldr r7, =0xdeadbeef 
    svc 0 
    b 1f 
    .ltorg 
1: 

या

ldr r7, 1f 
    svc 0 
    b 2f 
1: 
    .word 0xdeadbeef 
2: 

दुर्भाग्य से, यह अनावश्यक शाखा अनुदेश की वजह से एक से इनकी कोड होता है। मैं उम्मीद नहीं करता कि असेंबलर फ़ंक्शन के अंदर निरंतर पूल के लिए उचित स्थान ढूंढने के लिए पर्याप्त चालाक हो। मैं क्या करना चाहता हूं फ़ंक्शन के अंत में एक निरंतर पूल बनाएं। समारोह के अंत में एक शाब्दिक पूल बनाने के लिए संकलक (gcc) को बताने का कोई तरीका है?

पीएस मैं लगातार पूल के बजाय movw/movt जोड़ी का उपयोग कर समाप्त हुआ। हालांकि, सबसे पहले, movw/movt समाधान शाब्दिक पूल की तुलना में थोड़ा कम पोर्टेबल है और दूसरी बात है, मुझे आश्चर्य है कि इनलाइन असेंबली दोनों निरंतर और कुशलता से निरंतर पूल का उपयोग करना संभव है या नहीं।


अद्यतन:तो, क्या सबसे अच्छा तरीका है समस्या को संभालने के लिए है?

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

हालांकि, वास्तव में सर्वोत्तम तरीका इनलाइन असेंबली में रजिस्टरों में स्थिरांक लोड करने से बचने के लिए है। संकलक को ऐसा करने देना बेहतर है। मेरे मामले में मैं अंत में

register int var asm("r7") = 0xdeadbeef; 
asm volatile("svc 0\n" :: "r" (var)); 
+0

संभवतः बाधाओं का उपयोग करना सही तरीका है लेकिन यह जादू की तरह है। https://gcc.gnu.org/onlinedocs/gcc/Simple-Constraints.html https://gcc.gnu.org/onlinedocs/gcc/Machine-Constraints.html – auselen

उत्तर

3

करने के लिए एक कोड समान लिखा आप -ffunction-sections उपयोग कर सकते हैं और प्रति query on -ffunction-section के रूप में, एक ld --gc-sections का उपयोग अप्रयुक्त कोड हटाने के लिए।

फ़ाइल को विभाजित करने की स्पष्टता है।

एक समाधान जो काम करना चाहिए naked फ़ंक्शन का उपयोग unused एनोटेशन के साथ करना है क्योंकि इसे कभी नहीं कहा जाता है। यहां एक एकल .ltorg रखें और दोनों कार्यों को एक विशेष अनुभाग में भी रखें; उदाहरण के लिए .text.ltorg_kludge।लिंकर स्क्रिप्ट को .text* का उपयोग करना चाहिए और समान उप-वर्गों में कार्य एक साथ रखा गया है। कुछ तरीकों से यह फ़ाइल को विभाजित करने जैसा है क्योंकि संकलक static फ़ंक्शंस को इनलाइन करने का प्रयास करेगा।

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


एक तरफ: movw/movt कैश प्रभाव के कारण और अधिक कुशल है। यह एआरएमवी 6 और थंब 2 कोड के साथ भी काम करता है। मुझे पोर्टेबिलिटी को एक बड़े सौदे के रूप में नहीं दिखता है (क्योंकि इनलाइन असेंबलर गैर पोर्टेबल है और आप शायद पोर्टेबिलिटी पर प्रदर्शन पसंद करते हैं), लेकिन सवाल ARMv4/5 उपयोगकर्ताओं के लिए प्रासंगिक है।


मैं gcc machine constraints से आर बाधा के उपयोग की जांच,

आर
      निरंतर पूल

हालांकि में एक आइटम, एक sample with gcc-4.8 एक देता है त्रुटि असंभव बाधा। वैकल्पिक अक्षरों जैसे सी भी एक ही त्रुटि संदेश देते हैं। source contraints.md का निरीक्षण इंगित करता है कि आर बाधा केवल एक प्रलेखन सुविधा है। दुर्भाग्यपूर्ण, क्योंकि यह इस मुद्दे को हल करने के लिए बनाया गया उद्देश्य लगता है।

संकलक को मूल्य लोड करना संभव है, लेकिन यह शायद inline असेंबलर के आधार पर उप-इष्टतम हो सकता है। उदाहरण के लिए,

asm(" add %0, %0, %1\n" : "+r" (0xdeadbeef) : "r" (0xbaddeed0)); 
+0

आपके महान उत्तर के लिए धन्यवाद! मुझे अनुभागों के साथ झुकाव के बारे में आपका विचार पसंद है! "आर" बाधा के लिए के रूप में, वर्तमान में बाधाओं में टिप्पणी। एमडी का कहना है, "हम पर एआरएम राज्य में एस और आर के लिए बाधा पत्र रखते थे, लेकिन इन सभी के सभी उपयोग हटा दिए गए हैं"। – Nikolai

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

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