@@ -149,7 +149,82 @@ struct TypeCloner {
149
149
}
150
150
};
151
151
152
- static ValueMap clone_params (LLVMValueRef Src, LLVMValueRef Dst);
152
+ static ValueMap clone_params (LLVMValueRef Src, LLVMValueRef Dst) {
153
+ unsigned Count = LLVMCountParams (Src);
154
+ if (Count != LLVMCountParams (Dst)) {
155
+ fprintf (stderr, " Parameter count mismatch\n " );
156
+ exit (-1 );
157
+ }
158
+
159
+ ValueMap VMap;
160
+ if (Count == 0 )
161
+ return VMap;
162
+
163
+ LLVMValueRef SrcFirst = LLVMGetFirstParam (Src);
164
+ LLVMValueRef DstFirst = LLVMGetFirstParam (Dst);
165
+ LLVMValueRef SrcLast = LLVMGetLastParam (Src);
166
+ LLVMValueRef DstLast = LLVMGetLastParam (Dst);
167
+
168
+ LLVMValueRef SrcCur = SrcFirst;
169
+ LLVMValueRef DstCur = DstFirst;
170
+ LLVMValueRef SrcNext = nullptr ;
171
+ LLVMValueRef DstNext = nullptr ;
172
+ while (true ) {
173
+ const char *Name = LLVMGetValueName (SrcCur);
174
+ LLVMSetValueName (DstCur, Name);
175
+
176
+ VMap[SrcCur] = DstCur;
177
+
178
+ Count--;
179
+ SrcNext = LLVMGetNextParam (SrcCur);
180
+ DstNext = LLVMGetNextParam (DstCur);
181
+ if (SrcNext == nullptr && DstNext == nullptr ) {
182
+ if (SrcCur != SrcLast) {
183
+ fprintf (stderr, " SrcLast param does not match End\n " );
184
+ exit (-1 );
185
+ }
186
+
187
+ if (DstCur != DstLast) {
188
+ fprintf (stderr, " DstLast param does not match End\n " );
189
+ exit (-1 );
190
+ }
191
+
192
+ break ;
193
+ }
194
+
195
+ if (SrcNext == nullptr ) {
196
+ fprintf (stderr, " SrcNext was unexpectedly null\n " );
197
+ exit (-1 );
198
+ }
199
+
200
+ if (DstNext == nullptr ) {
201
+ fprintf (stderr, " DstNext was unexpectedly null\n " );
202
+ exit (-1 );
203
+ }
204
+
205
+ LLVMValueRef SrcPrev = LLVMGetPreviousParam (SrcNext);
206
+ if (SrcPrev != SrcCur) {
207
+ fprintf (stderr, " SrcNext.Previous param is not Current\n " );
208
+ exit (-1 );
209
+ }
210
+
211
+ LLVMValueRef DstPrev = LLVMGetPreviousParam (DstNext);
212
+ if (DstPrev != DstCur) {
213
+ fprintf (stderr, " DstNext.Previous param is not Current\n " );
214
+ exit (-1 );
215
+ }
216
+
217
+ SrcCur = SrcNext;
218
+ DstCur = DstNext;
219
+ }
220
+
221
+ if (Count != 0 ) {
222
+ fprintf (stderr, " Parameter count does not match iteration\n " );
223
+ exit (-1 );
224
+ }
225
+
226
+ return VMap;
227
+ }
153
228
154
229
struct FunCloner {
155
230
LLVMValueRef Fun;
@@ -535,83 +610,6 @@ struct FunCloner {
535
610
}
536
611
};
537
612
538
- static ValueMap clone_params (LLVMValueRef Src, LLVMValueRef Dst) {
539
- unsigned Count = LLVMCountParams (Src);
540
- if (Count != LLVMCountParams (Dst)) {
541
- fprintf (stderr, " Parameter count mismatch\n " );
542
- exit (-1 );
543
- }
544
-
545
- ValueMap VMap;
546
- if (Count == 0 )
547
- return VMap;
548
-
549
- LLVMValueRef SrcFirst = LLVMGetFirstParam (Src);
550
- LLVMValueRef DstFirst = LLVMGetFirstParam (Dst);
551
- LLVMValueRef SrcLast = LLVMGetLastParam (Src);
552
- LLVMValueRef DstLast = LLVMGetLastParam (Dst);
553
-
554
- LLVMValueRef SrcCur = SrcFirst;
555
- LLVMValueRef DstCur = DstFirst;
556
- LLVMValueRef SrcNext = nullptr ;
557
- LLVMValueRef DstNext = nullptr ;
558
- while (true ) {
559
- const char *Name = LLVMGetValueName (SrcCur);
560
- LLVMSetValueName (DstCur, Name);
561
-
562
- VMap[SrcCur] = DstCur;
563
-
564
- Count--;
565
- SrcNext = LLVMGetNextParam (SrcCur);
566
- DstNext = LLVMGetNextParam (DstCur);
567
- if (SrcNext == nullptr && DstNext == nullptr ) {
568
- if (SrcCur != SrcLast) {
569
- fprintf (stderr, " SrcLast param does not match End\n " );
570
- exit (-1 );
571
- }
572
-
573
- if (DstCur != DstLast) {
574
- fprintf (stderr, " DstLast param does not match End\n " );
575
- exit (-1 );
576
- }
577
-
578
- break ;
579
- }
580
-
581
- if (SrcNext == nullptr ) {
582
- fprintf (stderr, " SrcNext was unexpectedly null\n " );
583
- exit (-1 );
584
- }
585
-
586
- if (DstNext == nullptr ) {
587
- fprintf (stderr, " DstNext was unexpectedly null\n " );
588
- exit (-1 );
589
- }
590
-
591
- LLVMValueRef SrcPrev = LLVMGetPreviousParam (SrcNext);
592
- if (SrcPrev != SrcCur) {
593
- fprintf (stderr, " SrcNext.Previous param is not Current\n " );
594
- exit (-1 );
595
- }
596
-
597
- LLVMValueRef DstPrev = LLVMGetPreviousParam (DstNext);
598
- if (DstPrev != DstCur) {
599
- fprintf (stderr, " DstNext.Previous param is not Current\n " );
600
- exit (-1 );
601
- }
602
-
603
- SrcCur = SrcNext;
604
- DstCur = DstNext;
605
- }
606
-
607
- if (Count != 0 ) {
608
- fprintf (stderr, " Parameter count does not match iteration\n " );
609
- exit (-1 );
610
- }
611
-
612
- return VMap;
613
- }
614
-
615
613
static LLVMValueRef clone_function (LLVMValueRef Src, LLVMModuleRef M) {
616
614
const char *Name = LLVMGetValueName (Src);
617
615
LLVMValueRef Fun = LLVMGetNamedFunction (M, Name);
0 commit comments