[LLVMdev] C struct as function argument

Michael Tindal babyplatypus at me.com
Mon Jun 20 22:52:07 PDT 2011


Thank you for your reply, and that makes a lot of sense.  Changing the y value to double makes the code I had work just fine.  The problem is that the code I showed was more of just a test to make sure things work.  This is code that will used in code that is used to generate a bridge between my language and C.  Is there a relatively simple way to tell the JIT or whoever which ABI we're using, so that, for example, LLVM would generate the necessary bit casts to ensure it worked, or will I have to hard code these special cases?  For reference, this is the code I use to generate the function declarations:

-(id) initWithName:(NSString *)name types:(NSArray *)types intoModule:(CGKModule *)module {
   if((self = [super init])) {
       __strong std::vector<const Type*>* _types = new std::vector<const Type*>();
       CGKType* rettype = [types objectAtIndex:0];
       NSMutableArray* __types = [NSMutableArray arrayWithArray:[types subarrayWithRange:NSMakeRange(1,[types count] - 1)]];
       for(NSUInteger i = 0; i < [__types count]; i++) {
           _types->push_back([(CGKType*)[__types objectAtIndex:i] type]);
       }
       FunctionType* _ftype = FunctionType::get(rettype.type, *_types, false);
       self.function = Function::Create(_ftype, Function::ExternalLinkage, [name UTF8String], module.module);
   }
   return self;
}

On Jun 20, 2011, at 10:39 PM, Anton Korobeynikov wrote:

> Hello Michael,
> 
>> The module dump suggests everything is right, i can see in the function call the struct with the values 10 and 25, but the function is only received the 10 for the x field, nothing for the y field.  Am I missing something?
> You're missing the Platform ABI. I assume you're on x86-64, then your
> struct (according to the ABI) should be passed in a single 64 bit
> register as a whole. However you're passing {10, 25} as two separate
> 32-bit values. Given that 32-bit operations do implicit zero extension
> it's clear why you have 0 as the second value.
> 
> To be precise: the C code expects to receive 25 in the top 32 bits of
> the first argument register, but you're passing the value in the low
> 32 bits of the second argument register.
> 
> -- 
> With best regards, Anton Korobeynikov
> Faculty of Mathematics and Mechanics, Saint Petersburg State University




More information about the llvm-dev mailing list