I have three modules: ----------------------------------------------------------------- s1.ll: %0 = type <{ i32, i32 }> define void @s1(%0* byval %myStruct) nounwind { return: ret void } ----------------------------------------------------------------- s2.ll: %0 = type <{ i32, i32 }> define void @s2(%0* byval %myStruct) nounwind { return: ret void } ----------------------------------------------------------------- s3.ll: %0 = type <{ i32, i32 }> declare void @s1(%0* byval) nounwind readonly declare void @s2(%0* byval) nounwind readonly define void @s3(%0* byval %myStruct) nounwind { call void @s1(%0* %myStruct) nounwind call void @s2(%0* %myStruct) nounwind ret void } ----------------------------------------------------------------- If they are linked in one order: $ llvm-link -o s.bc s1.ll s2.ll s3.ll The linked IR is: %0 = type <{ i32, i32 }> %1 = type <{ i32, i32 }> define void @s1(%0* byval %myStruct) nounwind { return: ret void } define void @s2(%1* byval %myStruct) nounwind { return: ret void } define void @s3(%0* byval %myStruct) nounwind { call void @s1(%0* %myStruct) nounwind call void bitcast (void (%1*)* @s2 to void (%0*)*)(%0* %myStruct) nounwind ret void } ----------------------------------------------------------------- If they are linked in a different order: $ llvm-link -o s.bc s3.ll s1.ll s2.ll The linked IR is: %0 = type <{ i32, i32 }> define void @s3(%0* byval %myStruct) nounwind { call void @s1(%0* %myStruct) nounwind call void @s2(%0* %myStruct) nounwind ret void } define void @s1(%0* byval %myStruct) nounwind { return: ret void } define void @s2(%0* byval %myStruct) nounwind { return: ret void } Shouldn't the second linked IR be generated regardless of the order the modules are linked in? Thanks, Xiaoyi
Hi Xiaoyi, this looks like a bug to me - please file a bug report. Ciao, Duncan. On 01/11/12 04:35, Guo, Xiaoyi wrote:> I have three modules: > ----------------------------------------------------------------- > s1.ll: > > %0 = type <{ i32, i32 }> > > define void @s1(%0* byval %myStruct) nounwind { > return: > ret void > } > ----------------------------------------------------------------- > s2.ll: > > %0 = type <{ i32, i32 }> > > define void @s2(%0* byval %myStruct) nounwind { > return: > ret void > } > ----------------------------------------------------------------- > s3.ll: > %0 = type <{ i32, i32 }> > > declare void @s1(%0* byval) nounwind readonly > declare void @s2(%0* byval) nounwind readonly > > define void @s3(%0* byval %myStruct) nounwind { > call void @s1(%0* %myStruct) nounwind > call void @s2(%0* %myStruct) nounwind > ret void > } > ----------------------------------------------------------------- > If they are linked in one order: > $ llvm-link -o s.bc s1.ll s2.ll s3.ll > The linked IR is: > > %0 = type <{ i32, i32 }> > %1 = type <{ i32, i32 }> > > define void @s1(%0* byval %myStruct) nounwind { > return: > ret void > } > > define void @s2(%1* byval %myStruct) nounwind { > return: > ret void > } > > define void @s3(%0* byval %myStruct) nounwind { > call void @s1(%0* %myStruct) nounwind > call void bitcast (void (%1*)* @s2 to void (%0*)*)(%0* %myStruct) nounwind > ret void > } > > ----------------------------------------------------------------- > If they are linked in a different order: > $ llvm-link -o s.bc s3.ll s1.ll s2.ll > The linked IR is: > > %0 = type <{ i32, i32 }> > > define void @s3(%0* byval %myStruct) nounwind { > call void @s1(%0* %myStruct) nounwind > call void @s2(%0* %myStruct) nounwind > ret void > } > > define void @s1(%0* byval %myStruct) nounwind { > return: > ret void > } > > define void @s2(%0* byval %myStruct) nounwind { > return: > ret void > } > > Shouldn't the second linked IR be generated regardless of the order the modules are linked in? > > Thanks, > Xiaoyi > > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >
Bug 14235 has been submitted. Xiaoyi -----Original Message----- From: llvmdev-bounces at cs.uiuc.edu [mailto:llvmdev-bounces at cs.uiuc.edu] On Behalf Of Duncan Sands Sent: Thursday, November 01, 2012 12:11 AM To: llvmdev at cs.uiuc.edu Subject: Re: [LLVMdev] llvm linking issue Hi Xiaoyi, this looks like a bug to me - please file a bug report. Ciao, Duncan. On 01/11/12 04:35, Guo, Xiaoyi wrote:> I have three modules: > ----------------------------------------------------------------- > s1.ll: > > %0 = type <{ i32, i32 }> > > define void @s1(%0* byval %myStruct) nounwind { > return: > ret void > } > ----------------------------------------------------------------- > s2.ll: > > %0 = type <{ i32, i32 }> > > define void @s2(%0* byval %myStruct) nounwind { > return: > ret void > } > ----------------------------------------------------------------- > s3.ll: > %0 = type <{ i32, i32 }> > > declare void @s1(%0* byval) nounwind readonly declare void @s2(%0* > byval) nounwind readonly > > define void @s3(%0* byval %myStruct) nounwind { > call void @s1(%0* %myStruct) nounwind > call void @s2(%0* %myStruct) nounwind > ret void > } > ----------------------------------------------------------------- > If they are linked in one order: > $ llvm-link -o s.bc s1.ll s2.ll s3.ll > The linked IR is: > > %0 = type <{ i32, i32 }> > %1 = type <{ i32, i32 }> > > define void @s1(%0* byval %myStruct) nounwind { > return: > ret void > } > > define void @s2(%1* byval %myStruct) nounwind { > return: > ret void > } > > define void @s3(%0* byval %myStruct) nounwind { > call void @s1(%0* %myStruct) nounwind > call void bitcast (void (%1*)* @s2 to void (%0*)*)(%0* %myStruct) nounwind > ret void > } > > ----------------------------------------------------------------- > If they are linked in a different order: > $ llvm-link -o s.bc s3.ll s1.ll s2.ll > The linked IR is: > > %0 = type <{ i32, i32 }> > > define void @s3(%0* byval %myStruct) nounwind { > call void @s1(%0* %myStruct) nounwind > call void @s2(%0* %myStruct) nounwind > ret void > } > > define void @s1(%0* byval %myStruct) nounwind { > return: > ret void > } > > define void @s2(%0* byval %myStruct) nounwind { > return: > ret void > } > > Shouldn't the second linked IR be generated regardless of the order the modules are linked in? > > Thanks, > Xiaoyi > > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >_______________________________________________ LLVM Developers mailing list LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev