@@ -125,46 +125,26 @@ static LLVMTypeRef clone_type(LLVMTypeRef Src, LLVMContextRef Ctx) {
125
125
exit (-1 );
126
126
}
127
127
128
- static LLVMValueRef clone_literal (LLVMValueRef Src, LLVMContextRef Ctx) {
129
- LLVMTypeRef Ty = clone_type (LLVMTypeOf (Src), Ctx);
130
-
131
- LLVMTypeKind Kind = LLVMGetTypeKind (Ty);
132
- switch (Kind) {
133
- case LLVMIntegerTypeKind:
134
- return LLVMConstInt (Ty, LLVMConstIntGetZExtValue (Src), false );
135
- default :
136
- break ;
137
- }
138
-
139
- fprintf (stderr, " %d is not a supported constant typekind\n " , Kind);
140
- exit (-1 );
141
- }
142
-
143
- static LLVMModuleRef get_module (LLVMBuilderRef Builder) {
144
- LLVMBasicBlockRef BB = LLVMGetInsertBlock (Builder);
145
- LLVMValueRef Fn = LLVMGetBasicBlockParent (BB);
146
- return LLVMGetGlobalParent (Fn);
147
- }
148
-
149
128
static ValueMap clone_params (LLVMValueRef Src, LLVMValueRef Dst);
150
129
151
130
struct FunCloner {
152
131
LLVMValueRef Fun;
132
+ LLVMModuleRef M;
133
+ LLVMContextRef Ctx;
153
134
154
135
ValueMap VMap;
155
136
BasicBlockMap BBMap;
156
137
157
138
FunCloner (LLVMValueRef Src, LLVMValueRef Dst)
158
- : Fun(Dst), VMap(clone_params(Src, Dst)) {}
139
+ : Fun(Dst), M(LLVMGetGlobalParent(Fun)), Ctx(LLVMGetModuleContext(M)),
140
+ VMap (clone_params(Src, Dst)) {}
159
141
160
142
// Try to clone everything in the llvm::Value hierarchy.
161
- LLVMValueRef CloneValue (LLVMValueRef Src, LLVMBuilderRef Builder ) {
143
+ LLVMValueRef CloneValue (LLVMValueRef Src) {
162
144
const char *Name = LLVMGetValueName (Src);
163
145
164
146
// First, the value may be constant.
165
147
if (LLVMIsAConstant (Src)) {
166
- LLVMModuleRef M = get_module (Builder);
167
-
168
148
// Maybe it is a symbol
169
149
if (LLVMIsAGlobalValue (Src)) {
170
150
// Try function
@@ -182,17 +162,44 @@ struct FunCloner {
182
162
}
183
163
184
164
// Try literal
185
- LLVMContextRef Ctx = LLVMGetModuleContext (M);
186
- return clone_literal (Src, Ctx);
165
+ if (LLVMIsAConstantInt (Src)) {
166
+ LLVMTypeRef Ty = clone_type (LLVMTypeOf (Src), Ctx);
167
+ return LLVMConstInt (Ty, LLVMConstIntGetZExtValue (Src), false );
168
+ }
169
+
170
+ // Try undef
171
+ if (LLVMIsUndef (Src))
172
+ return LLVMGetUndef (clone_type (LLVMTypeOf (Src), Ctx));
173
+
174
+ // This kind of constant is not supported.
175
+ report_fatal_error (" Unsupported contant type" );
176
+ }
177
+
178
+ // Function argument should always be in the map already.
179
+ if (LLVMIsAArgument (Src)) {
180
+ auto i = VMap.find (Src);
181
+ if (i != VMap.end ())
182
+ return i->second ;
187
183
}
188
184
189
- // Try undef
190
- if (LLVMIsUndef (Src)) {
191
- LLVMContextRef Ctx = LLVMGetModuleContext (get_module (Builder));
192
- LLVMTypeRef Ty = clone_type (LLVMTypeOf (Src), Ctx);
193
- return LLVMGetUndef (Ty);
185
+ if (LLVMIsAInstruction (Src)) {
186
+ auto Builder = LLVMCreateBuilderInContext (Ctx);
187
+ auto BB = DeclareBB (LLVMGetInstructionParent (Src));
188
+ LLVMPositionBuilderAtEnd (Builder, BB);
189
+ auto Dst = CloneInstruction (Src, Builder);
190
+ LLVMDisposeBuilder (Builder);
191
+ return Dst;
194
192
}
195
193
194
+ fprintf (stderr, " Could not determine the type of %s\n " , Name);
195
+ exit (-1 );
196
+ }
197
+
198
+ LLVMValueRef CloneInstruction (LLVMValueRef Src, LLVMBuilderRef Builder) {
199
+ const char *Name = LLVMGetValueName (Src);
200
+ if (!LLVMIsAInstruction (Src))
201
+ report_fatal_error (" Expected an instruction" );
202
+
196
203
// Check if this is something we already computed.
197
204
{
198
205
auto i = VMap.find (Src);
@@ -211,8 +218,7 @@ struct FunCloner {
211
218
if (OpCount == 0 )
212
219
Dst = LLVMBuildRetVoid (Builder);
213
220
else
214
- Dst = LLVMBuildRet (Builder, CloneValue (LLVMGetOperand (Src, 0 ),
215
- Builder));
221
+ Dst = LLVMBuildRet (Builder, CloneValue (LLVMGetOperand (Src, 0 )));
216
222
break ;
217
223
}
218
224
case LLVMBr: {
@@ -239,102 +245,101 @@ struct FunCloner {
239
245
Dst = LLVMBuildUnreachable (Builder);
240
246
break ;
241
247
case LLVMAdd: {
242
- LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ), Builder );
243
- LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ), Builder );
248
+ LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ));
249
+ LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ));
244
250
Dst = LLVMBuildAdd (Builder, LHS, RHS, Name);
245
251
break ;
246
252
}
247
253
case LLVMSub: {
248
- LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ), Builder );
249
- LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ), Builder );
254
+ LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ));
255
+ LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ));
250
256
Dst = LLVMBuildSub (Builder, LHS, RHS, Name);
251
257
break ;
252
258
}
253
259
case LLVMMul: {
254
- LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ), Builder );
255
- LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ), Builder );
260
+ LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ));
261
+ LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ));
256
262
Dst = LLVMBuildMul (Builder, LHS, RHS, Name);
257
263
break ;
258
264
}
259
265
case LLVMUDiv: {
260
- LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ), Builder );
261
- LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ), Builder );
266
+ LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ));
267
+ LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ));
262
268
Dst = LLVMBuildUDiv (Builder, LHS, RHS, Name);
263
269
break ;
264
270
}
265
271
case LLVMSDiv: {
266
- LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ), Builder );
267
- LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ), Builder );
272
+ LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ));
273
+ LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ));
268
274
Dst = LLVMBuildSDiv (Builder, LHS, RHS, Name);
269
275
break ;
270
276
}
271
277
case LLVMURem: {
272
- LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ), Builder );
273
- LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ), Builder );
278
+ LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ));
279
+ LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ));
274
280
Dst = LLVMBuildURem (Builder, LHS, RHS, Name);
275
281
break ;
276
282
}
277
283
case LLVMSRem: {
278
- LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ), Builder );
279
- LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ), Builder );
284
+ LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ));
285
+ LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ));
280
286
Dst = LLVMBuildSRem (Builder, LHS, RHS, Name);
281
287
break ;
282
288
}
283
289
case LLVMShl: {
284
- LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ), Builder );
285
- LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ), Builder );
290
+ LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ));
291
+ LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ));
286
292
Dst = LLVMBuildShl (Builder, LHS, RHS, Name);
287
293
break ;
288
294
}
289
295
case LLVMLShr: {
290
- LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ), Builder );
291
- LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ), Builder );
296
+ LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ));
297
+ LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ));
292
298
Dst = LLVMBuildLShr (Builder, LHS, RHS, Name);
293
299
break ;
294
300
}
295
301
case LLVMAShr: {
296
- LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ), Builder );
297
- LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ), Builder );
302
+ LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ));
303
+ LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ));
298
304
Dst = LLVMBuildAShr (Builder, LHS, RHS, Name);
299
305
break ;
300
306
}
301
307
case LLVMAnd: {
302
- LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ), Builder );
303
- LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ), Builder );
308
+ LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ));
309
+ LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ));
304
310
Dst = LLVMBuildAnd (Builder, LHS, RHS, Name);
305
311
break ;
306
312
}
307
313
case LLVMOr: {
308
- LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ), Builder );
309
- LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ), Builder );
314
+ LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ));
315
+ LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ));
310
316
Dst = LLVMBuildOr (Builder, LHS, RHS, Name);
311
317
break ;
312
318
}
313
319
case LLVMXor: {
314
- LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ), Builder );
315
- LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ), Builder );
320
+ LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ));
321
+ LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ));
316
322
Dst = LLVMBuildXor (Builder, LHS, RHS, Name);
317
323
break ;
318
324
}
319
325
case LLVMAlloca: {
320
- LLVMContextRef Ctx = LLVMGetModuleContext (get_module (Builder));
321
326
LLVMTypeRef Ty = clone_type (LLVMGetAllocatedType (Src), Ctx);
322
327
Dst = LLVMBuildAlloca (Builder, Ty, Name);
323
328
break ;
324
329
}
325
330
case LLVMICmp: {
326
331
LLVMIntPredicate Pred = LLVMGetICmpPredicate (Src);
327
- LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ), Builder );
328
- LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ), Builder );
332
+ LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ));
333
+ LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ));
329
334
Dst = LLVMBuildICmp (Builder, Pred, LHS, RHS, Name);
330
335
break ;
331
336
}
332
337
case LLVMCall: {
333
- int ArgCount = LLVMGetNumOperands (Src) - 1 ;
334
338
SmallVector<LLVMValueRef, 8 > Args;
339
+ int ArgCount = LLVMGetNumOperands (Src) - 1 ;
335
340
for (int i = 0 ; i < ArgCount; i++)
336
- Args.push_back (CloneValue (LLVMGetOperand (Src, i), Builder ));
337
- LLVMValueRef Fn = CloneValue (LLVMGetOperand (Src, ArgCount), Builder );
341
+ Args.push_back (CloneValue (LLVMGetOperand (Src, i)));
342
+ LLVMValueRef Fn = CloneValue (LLVMGetOperand (Src, ArgCount));
338
343
Dst = LLVMBuildCall (Builder, Fn, Args.data (), ArgCount, Name);
339
344
break ;
340
345
}
@@ -363,7 +368,7 @@ struct FunCloner {
363
368
364
369
LLVMValueRef V = LLVMBasicBlockAsValue (Src);
365
370
if (!LLVMValueIsBasicBlock (V) || LLVMValueAsBasicBlock (V) != Src)
366
- report_fatal_error (" Basic block is not a basic block\n " );
371
+ report_fatal_error (" Basic block is not a basic block" );
367
372
368
373
const char *VName = LLVMGetValueName (V);
369
374
if (Name != VName)
@@ -393,14 +398,13 @@ struct FunCloner {
393
398
return BB;
394
399
}
395
400
396
- LLVMContextRef Ctx = LLVMGetModuleContext (LLVMGetGlobalParent (Fun));
397
401
LLVMBuilderRef Builder = LLVMCreateBuilderInContext (Ctx);
398
402
LLVMPositionBuilderAtEnd (Builder, BB);
399
403
400
404
LLVMValueRef Cur = First;
401
405
LLVMValueRef Next = nullptr ;
402
406
while (true ) {
403
- CloneValue (Cur, Builder);
407
+ CloneInstruction (Cur, Builder);
404
408
Next = LLVMGetNextInstruction (Cur);
405
409
if (Next == nullptr ) {
406
410
if (Cur != Last) {
@@ -540,17 +544,17 @@ static ValueMap clone_params(LLVMValueRef Src, LLVMValueRef Dst) {
540
544
return VMap;
541
545
}
542
546
543
- static LLVMValueRef clone_function (LLVMValueRef Src, LLVMModuleRef Dst ) {
547
+ static LLVMValueRef clone_function (LLVMValueRef Src, LLVMModuleRef M ) {
544
548
const char *Name = LLVMGetValueName (Src);
545
- LLVMValueRef Fun = LLVMGetNamedFunction (Dst , Name);
549
+ LLVMValueRef Fun = LLVMGetNamedFunction (M , Name);
546
550
if (Fun != nullptr )
547
551
return Fun;
548
552
549
553
LLVMTypeRef SrcTy = LLVMTypeOf (Src);
550
- LLVMTypeRef DstTy = clone_type (SrcTy, LLVMGetModuleContext (Dst ));
554
+ LLVMTypeRef DstTy = clone_type (SrcTy, LLVMGetModuleContext (M ));
551
555
LLVMTypeRef FunTy = LLVMGetElementType (DstTy);
552
556
553
- Fun = LLVMAddFunction (Dst , Name, FunTy);
557
+ Fun = LLVMAddFunction (M , Name, FunTy);
554
558
FunCloner FC (Src, Fun);
555
559
FC.CloneBBs (Src);
556
560
0 commit comments