2011-06-20 15 views
6

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

typedef struct _test_struct { 
    int x; 
    int y; 
} test_struct; 

id testLLVMStructFuncCall(test_struct x) { 
    NSLog(@"%d %d",x.x,x.y); 
    return N(x.x + x.y); 
} 

-(void) testLLVMStructFuncCall { 
    CGKModule* myMod = [CGKModule moduleWithName:@"llvm_structfunccall_test"]; 
    CGKType* testStructType = [CGKType structTypeWithElementTypes:[NSArray arrayWithObjects:[CGKType intTypeWith32Bits],[CGKType intTypeWith32Bits],nil]]; 
    CGKFunction* lfunc = [CGKFunction functionWithName:@"testLLVMStructFuncCall" types:[NSArray arrayWithObjects:[CGKType idType],testStructType,nil] intoModule:myMod]; 
    CGKFunction* rfunc = [CGKBuilder createStandaloneCallForFunction:lfunc withArguments:[NSArray 
                          arrayWithObjects: 
                         [CGKConstant getStructOfType:testStructType 
                             withValues:[NSArray arrayWithObjects:[CGKConstant getIntConstant:N(10) bits:32], 
                                [CGKConstant getIntConstant:N(25) bits:32],nil]],nil] 
                 inModule:myMod]; 
    [myMod dump]; 
    id var = [[CGKRunner runnerForModule:myMod] runCGKFunction:rfunc]; 
    assertThat(var,is(equalTo(N(35)))); 
} 

मुद्दा है मैं परीक्षण से निम्नलिखित उत्पादन में देखा जाता है:

Test Case '-[SVFunctionTests testLLVMStructFuncCall]' started. 
; ModuleID = 'llvm_structfunccall_test' 

%0 = type { i32, i32 } 

declare i64* @testLLVMStructFuncCall(%0) 

define i64* @0() { 
entry: 
    %0 = call i64* @testLLVMStructFuncCall(%0 { i32 10, i32 25 }) 
    ret i64* %0 
} 
2011-06-20 21:25:54.821 otest-x86_64[3369:707] 10 0 
/Users/mtindal/Projects/Silver/Tests/SVFunctionTests.m:576: error: -[SVFunctionTests testLLVMStructFuncCall] : Expected <35>, but was <10> 
Test Case '-[SVFunctionTests testLLVMStructFuncCall]' failed (0.016 seconds). 

मॉड्यूल डंप पता चलता है कि संरचना तर्क के रूप में उम्मीद पारित कर दिया है, हालांकि, सी समारोह केवल प्राप्त करता है एक्स फ़ील्ड 10 पर सेट है, और वाई फ़ील्ड खाली छोड़ दिया गया है। मैं पूरी तरह से अनजान हूं कि यह कैसे हो रहा है और मैं इसे ठीक करने के लिए क्या कर सकता हूं। किसी भी मदद के लिए अग्रिम धन्यवाद जो आप मुझे दे सकते हैं।

+0

<35> और <10> एक प्रकार पहले से परिभाषित है, जो अपने मॉड्यूल पर मौजूदा किया जाना चाहिए करने के लिए संदर्भित करता है, मॉड्यूल सामग्री डंपिंग कोशिश करते हैं और अपने प्रश्न – lurscher

उत्तर

9

आप प्लेटफ़ॉर्म एबीआई खो रहे हैं। मुझे लगता है कि आप x86-64 पर हैं, तो आपकी संरचना (एबीआई के अनुसार) पूरी तरह से एक ही रजिस्टर में पारित की जानी चाहिए। हालांकि आप {10, 25} को दो अलग-अलग 32-बिट मानों के रूप में पास कर रहे हैं। यह देखते हुए कि 32-बिट ऑपरेशंस शून्य शून्य विस्तार करते हैं, यह स्पष्ट है कि आपके पास दूसरे मान के रूप में 0 क्यों है।

सटीक होने के लिए: सी कोड पहले तर्क रजिस्टर के शीर्ष 32 बिट्स में 25 प्राप्त करने की अपेक्षा करता है, लेकिन आप दूसरे तर्क रजिस्टर के निम्न 32 बिट्स में मान पास कर रहे हैं।

+1

@Michael में चिपकाएं: LLVM एएसएम के लिए अपने सी कोड संकलित करें। आप देखेंगे कि फ़ंक्शन तर्क में 'test_struct' को i64 में कैसे बदला जाता है और यह कैसे लिखा जाता है। आपको वही करना होगा। –

+0

आपको बहुत धन्यवाद, यह आवश्यक जानकारी है। –

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