Sorry, I was being an idiot and was trying to link the wrong file type. Sigh. Now I have a problem where I merge two modules each containing the same struct, one opaque and one defined, and it's not merging the two consistently. I have two, let's say %"StructA" = type opaque %"StructB" = type opaque in one module, and in the other: %"StructA" = type { i8 } %"StructB" = type { [0 x i8] } and when I link the two modules, only one is correctly defined: %"StructA" = { i8 } %"StructB" = type opaque %"StructB.0" = { [0 x i8] } I know it's not technically 'on-topic' for this thread, but just in case you had any ideas as to why this is happening. Cheers/ Duncan Sands wrote:> > Hi Fraser, > > it can, for example by generating human readable IR rather than bitcode. > Why don't you look in the file and see what's in there? > > Ciao, Duncan. > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev > >-- View this message in context: http://old.nabble.com/Invalid-bitcode-signature-tp33259763p33277355.html Sent from the LLVM - Dev mailing list archive at Nabble.com.
On Feb 7, 2012, at 1:29 AM, Fraser Cormack wrote:> > Sorry, I was being an idiot and was trying to link the wrong file type. Sigh. > > Now I have a problem where I merge two modules each containing the same > struct, one opaque and one defined, and it's not merging the two > consistently. I have two, let's say > > %"StructA" = type opaque > %"StructB" = type opaque > > in one module, and in the other: > > %"StructA" = type { i8 } > %"StructB" = type { [0 x i8] } > > and when I link the two modules, only one is correctly defined: > > %"StructA" = { i8 } > %"StructB" = type opaque > %"StructB.0" = { [0 x i8] } > > I know it's not technically 'on-topic' for this thread, but just in case you > had any ideas as to why this is happening.Are you using mainline or LLVM 3.0? The behavior in this area has changed since 3.0 was released (and it should now do what you want). -Chris> > Cheers/ > > > Duncan Sands wrote: >> >> Hi Fraser, >> >> it can, for example by generating human readable IR rather than bitcode. >> Why don't you look in the file and see what's in there? >> >> Ciao, Duncan. >> _______________________________________________ >> LLVM Developers mailing list >> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >> >> > > -- > View this message in context: http://old.nabble.com/Invalid-bitcode-signature-tp33259763p33277355.html > Sent from the LLVM - Dev mailing list archive at Nabble.com. > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
Ah, updating to LLVM 3.0 has worked, thanks! Once again, this is sorta off topic (I don't want to unnecessarily start a new thread), but I've noticed that my program segmentation faults when I try and use a GEP on a struct that is opaque in a module, but will be resolved when linked to another module later, like this: if (reg_pt_st->isOpaque()) std::cout << "opaque" << std::endl; ConstantInt* index = ConstantInt::get(mod->getContext(), APInt(32, StringRef("0"), 10)); std::vector<llvm::Value*> indices; indices.push_back(index); indices.push_back(index); Value* gep_ptr = builder->CreateGEP(reg, indices); Here, 'reg' is a pointer to a struct, and so 'reg_pt_st' is the cast from 'reg' to pointer to struct. Is this possible? What am I supposed to do here? Would using a different LLVMContext (for instance the one that defines the struct) solve it? That just came to me now. Cheers, Fraser Chris Lattner-2 wrote:> > > On Feb 7, 2012, at 1:29 AM, Fraser Cormack wrote: > >> >> Sorry, I was being an idiot and was trying to link the wrong file type. >> Sigh. >> >> Now I have a problem where I merge two modules each containing the same >> struct, one opaque and one defined, and it's not merging the two >> consistently. I have two, let's say >> >> %"StructA" = type opaque >> %"StructB" = type opaque >> >> in one module, and in the other: >> >> %"StructA" = type { i8 } >> %"StructB" = type { [0 x i8] } >> >> and when I link the two modules, only one is correctly defined: >> >> %"StructA" = { i8 } >> %"StructB" = type opaque >> %"StructB.0" = { [0 x i8] } >> >> I know it's not technically 'on-topic' for this thread, but just in case >> you >> had any ideas as to why this is happening. > > Are you using mainline or LLVM 3.0? The behavior in this area has changed > since 3.0 was released (and it should now do what you want). > > -Chris > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev > >-- View this message in context: http://old.nabble.com/Invalid-bitcode-signature-tp33259763p33307774.html Sent from the LLVM - Dev mailing list archive at Nabble.com.
Oh, and upgrading hasn't actually fully worked, I'm still getting cases where it's not merging the two structs from each module properly. This, coupled with my issue of segfaulting when accessing a struct field that I know will exist once modules are linked, is causing me a bit of a headache. How do other people get around this? Thanks, Fraser Chris Lattner-2 wrote:> > > Are you using mainline or LLVM 3.0? The behavior in this area has changed > since 3.0 was released (and it should now do what you want). > > -Chris > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev > >-- View this message in context: http://old.nabble.com/Invalid-bitcode-signature-tp33259763p33309832.html Sent from the LLVM - Dev mailing list archive at Nabble.com.