मुझे भाषा निर्माण और कंपाइलर निर्माण में रूचि है, और यहां उदाहरण के माध्यम से काम कर रहे हैं: http://gnuu.org/2009/09/18/writing-your-own-toy-compiler/। लेखक एलएलवीएम 2.6 का उपयोग कर रहा था, और एलएलवीएम 2.7 के लिए कुछ बदलाव करने के बाद, मुझे संकलित करने के लिए सभी कोड जनरेशन कोड मिला। जब संकलक परीक्षण कोड खिला,एलएलवीएम कोड पीढ़ी seg गलती का कारण बनता है?
int do_math(int a) {
int x = a * 5 + 3
}
do_math(10)
कार्यक्रम ठीक से काम करता है जब तक यह कोड को चलाने के लिए कोशिश करता है, जिस पर यह segfaults इशारा करते हैं। मैं अपने सिस्टम पर एलएलडीबी बनाने की प्रक्रिया में हूं, लेकिन इस बीच, इस एलएलवीएम एएसएम में कोई भी स्पष्ट सीजी गलती देखता है?
; ModuleID = 'main'
define internal void @main() {
entry:
%0 = call i64 @do_math(i64 10) ; <i64> [#uses=0]
ret void
}
define internal i64 @do_math(i64) {
entry:
%a = alloca i64 ; <i64*> [#uses=1]
%x = alloca i64 ; <i64*> [#uses=1]
%1 = add i64 5, 3 ; <i64> [#uses=1]
%2 = load i64* %a ; <i64> [#uses=1]
%3 = mul i64 %2, %1 ; <i64> [#uses=1]
store i64 %3, i64* %x
ret void
}
उत्पादन सिर्फ है:
Segmentation fault
मेरे मेहराब ओएस एक्स x86_64 है।
धन्यवाद।
कोड बिल्कुल 'सी कोड' नहीं है, यह एक सी जैसी भाषा है, जो मैंने ट्यूटोरियल में बनाया है। मैं समझता हूं कि 'do_math' फ़ंक्शन int को वापस नहीं करता है जैसा कि यह कहता है कि इसे करना चाहिए। एएसएम एक एएसटी और कुछ कोड जनरेशन कोड से उत्पन्न होता है, इसलिए मैं देखूंगा कि क्या मैं यह पता लगा सकता हूं कि यह अनियंत्रित डेटा का उपयोग क्यों कर रहा है। –