1 //===-- echo.cpp - tool for testing libLLVM and llvm-c API ----------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file implements the --echo command in llvm-c-test.
10 //
11 // This command uses the C API to read a module and output an exact copy of it
12 // as output. It is used to check that the resulting module matches the input
13 // to validate that the C API can read and write modules properly.
14 //
15 //===----------------------------------------------------------------------===//
16
17 #include "llvm-c-test.h"
18 #include "llvm-c/DebugInfo.h"
19 #include "llvm-c/ErrorHandling.h"
20 #include "llvm-c/Target.h"
21 #include "llvm/ADT/DenseMap.h"
22 #include "llvm/ADT/Hashing.h"
23 #include "llvm/ADT/SmallVector.h"
24 #include "llvm/Support/ErrorHandling.h"
25
26 #include <stdio.h>
27 #include <stdlib.h>
28
29 using namespace llvm;
30
31 // Provide DenseMapInfo for C API opaque types.
32 template<typename T>
33 struct CAPIDenseMap {};
34
35 // The default DenseMapInfo require to know about pointer alignment.
36 // Because the C API uses opaque pointer types, their alignment is unknown.
37 // As a result, we need to roll out our own implementation.
38 template<typename T>
39 struct CAPIDenseMap<T*> {
40 struct CAPIDenseMapInfo {
getEmptyKeyCAPIDenseMap::CAPIDenseMapInfo41 static inline T* getEmptyKey() {
42 uintptr_t Val = static_cast<uintptr_t>(-1);
43 return reinterpret_cast<T*>(Val);
44 }
getTombstoneKeyCAPIDenseMap::CAPIDenseMapInfo45 static inline T* getTombstoneKey() {
46 uintptr_t Val = static_cast<uintptr_t>(-2);
47 return reinterpret_cast<T*>(Val);
48 }
getHashValueCAPIDenseMap::CAPIDenseMapInfo49 static unsigned getHashValue(const T *PtrVal) {
50 return hash_value(PtrVal);
51 }
isEqualCAPIDenseMap::CAPIDenseMapInfo52 static bool isEqual(const T *LHS, const T *RHS) { return LHS == RHS; }
53 };
54
55 typedef DenseMap<T*, T*, CAPIDenseMapInfo> Map;
56 };
57
58 typedef CAPIDenseMap<LLVMValueRef>::Map ValueMap;
59 typedef CAPIDenseMap<LLVMBasicBlockRef>::Map BasicBlockMap;
60
61 struct TypeCloner {
62 LLVMModuleRef M;
63 LLVMContextRef Ctx;
64
TypeClonerTypeCloner65 TypeCloner(LLVMModuleRef M): M(M), Ctx(LLVMGetModuleContext(M)) {}
66
CloneTypeCloner67 LLVMTypeRef Clone(LLVMValueRef Src) {
68 return Clone(LLVMTypeOf(Src));
69 }
70
CloneTypeCloner71 LLVMTypeRef Clone(LLVMTypeRef Src) {
72 LLVMTypeKind Kind = LLVMGetTypeKind(Src);
73 switch (Kind) {
74 case LLVMVoidTypeKind:
75 return LLVMVoidTypeInContext(Ctx);
76 case LLVMHalfTypeKind:
77 return LLVMHalfTypeInContext(Ctx);
78 case LLVMBFloatTypeKind:
79 return LLVMHalfTypeInContext(Ctx);
80 case LLVMFloatTypeKind:
81 return LLVMFloatTypeInContext(Ctx);
82 case LLVMDoubleTypeKind:
83 return LLVMDoubleTypeInContext(Ctx);
84 case LLVMX86_FP80TypeKind:
85 return LLVMX86FP80TypeInContext(Ctx);
86 case LLVMFP128TypeKind:
87 return LLVMFP128TypeInContext(Ctx);
88 case LLVMPPC_FP128TypeKind:
89 return LLVMPPCFP128TypeInContext(Ctx);
90 case LLVMLabelTypeKind:
91 return LLVMLabelTypeInContext(Ctx);
92 case LLVMIntegerTypeKind:
93 return LLVMIntTypeInContext(Ctx, LLVMGetIntTypeWidth(Src));
94 case LLVMFunctionTypeKind: {
95 unsigned ParamCount = LLVMCountParamTypes(Src);
96 LLVMTypeRef* Params = nullptr;
97 if (ParamCount > 0) {
98 Params = static_cast<LLVMTypeRef*>(
99 safe_malloc(ParamCount * sizeof(LLVMTypeRef)));
100 LLVMGetParamTypes(Src, Params);
101 for (unsigned i = 0; i < ParamCount; i++)
102 Params[i] = Clone(Params[i]);
103 }
104
105 LLVMTypeRef FunTy = LLVMFunctionType(Clone(LLVMGetReturnType(Src)),
106 Params, ParamCount,
107 LLVMIsFunctionVarArg(Src));
108 if (ParamCount > 0)
109 free(Params);
110 return FunTy;
111 }
112 case LLVMStructTypeKind: {
113 LLVMTypeRef S = nullptr;
114 const char *Name = LLVMGetStructName(Src);
115 if (Name) {
116 S = LLVMGetTypeByName2(Ctx, Name);
117 if (S)
118 return S;
119 S = LLVMStructCreateNamed(Ctx, Name);
120 if (LLVMIsOpaqueStruct(Src))
121 return S;
122 }
123
124 unsigned EltCount = LLVMCountStructElementTypes(Src);
125 SmallVector<LLVMTypeRef, 8> Elts;
126 for (unsigned i = 0; i < EltCount; i++)
127 Elts.push_back(Clone(LLVMStructGetTypeAtIndex(Src, i)));
128 if (Name)
129 LLVMStructSetBody(S, Elts.data(), EltCount, LLVMIsPackedStruct(Src));
130 else
131 S = LLVMStructTypeInContext(Ctx, Elts.data(), EltCount,
132 LLVMIsPackedStruct(Src));
133 return S;
134 }
135 case LLVMArrayTypeKind:
136 return LLVMArrayType(
137 Clone(LLVMGetElementType(Src)),
138 LLVMGetArrayLength(Src)
139 );
140 case LLVMPointerTypeKind:
141 if (LLVMPointerTypeIsOpaque(Src))
142 return LLVMPointerTypeInContext(Ctx, LLVMGetPointerAddressSpace(Src));
143 else
144 return LLVMPointerType(Clone(LLVMGetElementType(Src)),
145 LLVMGetPointerAddressSpace(Src));
146 case LLVMVectorTypeKind:
147 return LLVMVectorType(
148 Clone(LLVMGetElementType(Src)),
149 LLVMGetVectorSize(Src)
150 );
151 case LLVMScalableVectorTypeKind:
152 return LLVMScalableVectorType(Clone(LLVMGetElementType(Src)),
153 LLVMGetVectorSize(Src));
154 case LLVMMetadataTypeKind:
155 return LLVMMetadataTypeInContext(Ctx);
156 case LLVMX86_AMXTypeKind:
157 return LLVMX86AMXTypeInContext(Ctx);
158 case LLVMX86_MMXTypeKind:
159 return LLVMX86MMXTypeInContext(Ctx);
160 case LLVMTokenTypeKind:
161 return LLVMTokenTypeInContext(Ctx);
162 }
163
164 fprintf(stderr, "%d is not a supported typekind\n", Kind);
165 exit(-1);
166 }
167 };
168
clone_params(LLVMValueRef Src,LLVMValueRef Dst)169 static ValueMap clone_params(LLVMValueRef Src, LLVMValueRef Dst) {
170 unsigned Count = LLVMCountParams(Src);
171 if (Count != LLVMCountParams(Dst))
172 report_fatal_error("Parameter count mismatch");
173
174 ValueMap VMap;
175 if (Count == 0)
176 return VMap;
177
178 LLVMValueRef SrcFirst = LLVMGetFirstParam(Src);
179 LLVMValueRef DstFirst = LLVMGetFirstParam(Dst);
180 LLVMValueRef SrcLast = LLVMGetLastParam(Src);
181 LLVMValueRef DstLast = LLVMGetLastParam(Dst);
182
183 LLVMValueRef SrcCur = SrcFirst;
184 LLVMValueRef DstCur = DstFirst;
185 LLVMValueRef SrcNext = nullptr;
186 LLVMValueRef DstNext = nullptr;
187 while (true) {
188 size_t NameLen;
189 const char *Name = LLVMGetValueName2(SrcCur, &NameLen);
190 LLVMSetValueName2(DstCur, Name, NameLen);
191
192 VMap[SrcCur] = DstCur;
193
194 Count--;
195 SrcNext = LLVMGetNextParam(SrcCur);
196 DstNext = LLVMGetNextParam(DstCur);
197 if (SrcNext == nullptr && DstNext == nullptr) {
198 if (SrcCur != SrcLast)
199 report_fatal_error("SrcLast param does not match End");
200 if (DstCur != DstLast)
201 report_fatal_error("DstLast param does not match End");
202 break;
203 }
204
205 if (SrcNext == nullptr)
206 report_fatal_error("SrcNext was unexpectedly null");
207 if (DstNext == nullptr)
208 report_fatal_error("DstNext was unexpectedly null");
209
210 LLVMValueRef SrcPrev = LLVMGetPreviousParam(SrcNext);
211 if (SrcPrev != SrcCur)
212 report_fatal_error("SrcNext.Previous param is not Current");
213
214 LLVMValueRef DstPrev = LLVMGetPreviousParam(DstNext);
215 if (DstPrev != DstCur)
216 report_fatal_error("DstNext.Previous param is not Current");
217
218 SrcCur = SrcNext;
219 DstCur = DstNext;
220 }
221
222 if (Count != 0)
223 report_fatal_error("Parameter count does not match iteration");
224
225 return VMap;
226 }
227
check_value_kind(LLVMValueRef V,LLVMValueKind K)228 static void check_value_kind(LLVMValueRef V, LLVMValueKind K) {
229 if (LLVMGetValueKind(V) != K)
230 report_fatal_error("LLVMGetValueKind returned incorrect type");
231 }
232
233 static LLVMValueRef clone_constant_impl(LLVMValueRef Cst, LLVMModuleRef M);
234
clone_constant(LLVMValueRef Cst,LLVMModuleRef M)235 static LLVMValueRef clone_constant(LLVMValueRef Cst, LLVMModuleRef M) {
236 LLVMValueRef Ret = clone_constant_impl(Cst, M);
237 check_value_kind(Ret, LLVMGetValueKind(Cst));
238 return Ret;
239 }
240
clone_constant_impl(LLVMValueRef Cst,LLVMModuleRef M)241 static LLVMValueRef clone_constant_impl(LLVMValueRef Cst, LLVMModuleRef M) {
242 if (!LLVMIsAConstant(Cst))
243 report_fatal_error("Expected a constant");
244
245 // Maybe it is a symbol
246 if (LLVMIsAGlobalValue(Cst)) {
247 size_t NameLen;
248 const char *Name = LLVMGetValueName2(Cst, &NameLen);
249
250 // Try function
251 if (LLVMIsAFunction(Cst)) {
252 check_value_kind(Cst, LLVMFunctionValueKind);
253
254 LLVMValueRef Dst = nullptr;
255 // Try an intrinsic
256 unsigned ID = LLVMGetIntrinsicID(Cst);
257 if (ID > 0 && !LLVMIntrinsicIsOverloaded(ID)) {
258 Dst = LLVMGetIntrinsicDeclaration(M, ID, nullptr, 0);
259 } else {
260 // Try a normal function
261 Dst = LLVMGetNamedFunction(M, Name);
262 }
263
264 if (Dst)
265 return Dst;
266 report_fatal_error("Could not find function");
267 }
268
269 // Try global variable
270 if (LLVMIsAGlobalVariable(Cst)) {
271 check_value_kind(Cst, LLVMGlobalVariableValueKind);
272 LLVMValueRef Dst = LLVMGetNamedGlobal(M, Name);
273 if (Dst)
274 return Dst;
275 report_fatal_error("Could not find variable");
276 }
277
278 // Try global alias
279 if (LLVMIsAGlobalAlias(Cst)) {
280 check_value_kind(Cst, LLVMGlobalAliasValueKind);
281 LLVMValueRef Dst = LLVMGetNamedGlobalAlias(M, Name, NameLen);
282 if (Dst)
283 return Dst;
284 report_fatal_error("Could not find alias");
285 }
286
287 fprintf(stderr, "Could not find @%s\n", Name);
288 exit(-1);
289 }
290
291 // Try integer literal
292 if (LLVMIsAConstantInt(Cst)) {
293 check_value_kind(Cst, LLVMConstantIntValueKind);
294 return LLVMConstInt(TypeCloner(M).Clone(Cst),
295 LLVMConstIntGetZExtValue(Cst), false);
296 }
297
298 // Try zeroinitializer
299 if (LLVMIsAConstantAggregateZero(Cst)) {
300 check_value_kind(Cst, LLVMConstantAggregateZeroValueKind);
301 return LLVMConstNull(TypeCloner(M).Clone(Cst));
302 }
303
304 // Try constant array or constant data array
305 if (LLVMIsAConstantArray(Cst) || LLVMIsAConstantDataArray(Cst)) {
306 check_value_kind(Cst, LLVMIsAConstantArray(Cst)
307 ? LLVMConstantArrayValueKind
308 : LLVMConstantDataArrayValueKind);
309 LLVMTypeRef Ty = TypeCloner(M).Clone(Cst);
310 unsigned EltCount = LLVMGetArrayLength(Ty);
311 SmallVector<LLVMValueRef, 8> Elts;
312 for (unsigned i = 0; i < EltCount; i++)
313 Elts.push_back(clone_constant(LLVMGetAggregateElement(Cst, i), M));
314 return LLVMConstArray(LLVMGetElementType(Ty), Elts.data(), EltCount);
315 }
316
317 // Try constant struct
318 if (LLVMIsAConstantStruct(Cst)) {
319 check_value_kind(Cst, LLVMConstantStructValueKind);
320 LLVMTypeRef Ty = TypeCloner(M).Clone(Cst);
321 unsigned EltCount = LLVMCountStructElementTypes(Ty);
322 SmallVector<LLVMValueRef, 8> Elts;
323 for (unsigned i = 0; i < EltCount; i++)
324 Elts.push_back(clone_constant(LLVMGetOperand(Cst, i), M));
325 if (LLVMGetStructName(Ty))
326 return LLVMConstNamedStruct(Ty, Elts.data(), EltCount);
327 return LLVMConstStructInContext(LLVMGetModuleContext(M), Elts.data(),
328 EltCount, LLVMIsPackedStruct(Ty));
329 }
330
331 // Try ConstantPointerNull
332 if (LLVMIsAConstantPointerNull(Cst)) {
333 check_value_kind(Cst, LLVMConstantPointerNullValueKind);
334 LLVMTypeRef Ty = TypeCloner(M).Clone(Cst);
335 return LLVMConstNull(Ty);
336 }
337
338 // Try undef
339 if (LLVMIsUndef(Cst)) {
340 check_value_kind(Cst, LLVMUndefValueValueKind);
341 return LLVMGetUndef(TypeCloner(M).Clone(Cst));
342 }
343
344 // Try poison
345 if (LLVMIsPoison(Cst)) {
346 check_value_kind(Cst, LLVMPoisonValueValueKind);
347 return LLVMGetPoison(TypeCloner(M).Clone(Cst));
348 }
349
350 // Try null
351 if (LLVMIsNull(Cst)) {
352 check_value_kind(Cst, LLVMConstantTokenNoneValueKind);
353 LLVMTypeRef Ty = TypeCloner(M).Clone(Cst);
354 return LLVMConstNull(Ty);
355 }
356
357 // Try float literal
358 if (LLVMIsAConstantFP(Cst)) {
359 check_value_kind(Cst, LLVMConstantFPValueKind);
360 report_fatal_error("ConstantFP is not supported");
361 }
362
363 // Try ConstantVector or ConstantDataVector
364 if (LLVMIsAConstantVector(Cst) || LLVMIsAConstantDataVector(Cst)) {
365 check_value_kind(Cst, LLVMIsAConstantVector(Cst)
366 ? LLVMConstantVectorValueKind
367 : LLVMConstantDataVectorValueKind);
368 LLVMTypeRef Ty = TypeCloner(M).Clone(Cst);
369 unsigned EltCount = LLVMGetVectorSize(Ty);
370 SmallVector<LLVMValueRef, 8> Elts;
371 for (unsigned i = 0; i < EltCount; i++)
372 Elts.push_back(clone_constant(LLVMGetAggregateElement(Cst, i), M));
373 return LLVMConstVector(Elts.data(), EltCount);
374 }
375
376 // At this point, if it's not a constant expression, it's a kind of constant
377 // which is not supported
378 if (!LLVMIsAConstantExpr(Cst))
379 report_fatal_error("Unsupported constant kind");
380
381 // At this point, it must be a constant expression
382 check_value_kind(Cst, LLVMConstantExprValueKind);
383
384 LLVMOpcode Op = LLVMGetConstOpcode(Cst);
385 switch(Op) {
386 case LLVMBitCast:
387 return LLVMConstBitCast(clone_constant(LLVMGetOperand(Cst, 0), M),
388 TypeCloner(M).Clone(Cst));
389 case LLVMGetElementPtr: {
390 LLVMTypeRef ElemTy =
391 TypeCloner(M).Clone(LLVMGetGEPSourceElementType(Cst));
392 LLVMValueRef Ptr = clone_constant(LLVMGetOperand(Cst, 0), M);
393 int NumIdx = LLVMGetNumIndices(Cst);
394 SmallVector<LLVMValueRef, 8> Idx;
395 for (int i = 1; i <= NumIdx; i++)
396 Idx.push_back(clone_constant(LLVMGetOperand(Cst, i), M));
397 if (LLVMIsInBounds(Cst))
398 return LLVMConstInBoundsGEP2(ElemTy, Ptr, Idx.data(), NumIdx);
399 else
400 return LLVMConstGEP2(ElemTy, Ptr, Idx.data(), NumIdx);
401 }
402 default:
403 fprintf(stderr, "%d is not a supported opcode for constant expressions\n",
404 Op);
405 exit(-1);
406 }
407 }
408
409 struct FunCloner {
410 LLVMValueRef Fun;
411 LLVMModuleRef M;
412
413 ValueMap VMap;
414 BasicBlockMap BBMap;
415
FunClonerFunCloner416 FunCloner(LLVMValueRef Src, LLVMValueRef Dst): Fun(Dst),
417 M(LLVMGetGlobalParent(Fun)), VMap(clone_params(Src, Dst)) {}
418
CloneTypeFunCloner419 LLVMTypeRef CloneType(LLVMTypeRef Src) {
420 return TypeCloner(M).Clone(Src);
421 }
422
CloneTypeFunCloner423 LLVMTypeRef CloneType(LLVMValueRef Src) {
424 return TypeCloner(M).Clone(Src);
425 }
426
427 // Try to clone everything in the llvm::Value hierarchy.
CloneValueFunCloner428 LLVMValueRef CloneValue(LLVMValueRef Src) {
429 // First, the value may be constant.
430 if (LLVMIsAConstant(Src))
431 return clone_constant(Src, M);
432
433 // Function argument should always be in the map already.
434 auto i = VMap.find(Src);
435 if (i != VMap.end())
436 return i->second;
437
438 if (!LLVMIsAInstruction(Src))
439 report_fatal_error("Expected an instruction");
440
441 auto Ctx = LLVMGetModuleContext(M);
442 auto Builder = LLVMCreateBuilderInContext(Ctx);
443 auto BB = DeclareBB(LLVMGetInstructionParent(Src));
444 LLVMPositionBuilderAtEnd(Builder, BB);
445 auto Dst = CloneInstruction(Src, Builder);
446 LLVMDisposeBuilder(Builder);
447 return Dst;
448 }
449
CloneAttrsFunCloner450 void CloneAttrs(LLVMValueRef Src, LLVMValueRef Dst) {
451 auto Ctx = LLVMGetModuleContext(M);
452 int ArgCount = LLVMGetNumArgOperands(Src);
453 for (int i = LLVMAttributeReturnIndex; i <= ArgCount; i++) {
454 for (unsigned k = 0, e = LLVMGetLastEnumAttributeKind(); k < e; ++k) {
455 if (auto SrcA = LLVMGetCallSiteEnumAttribute(Src, i, k)) {
456 auto Val = LLVMGetEnumAttributeValue(SrcA);
457 auto A = LLVMCreateEnumAttribute(Ctx, k, Val);
458 LLVMAddCallSiteAttribute(Dst, i, A);
459 }
460 }
461 }
462 }
463
CloneInstructionFunCloner464 LLVMValueRef CloneInstruction(LLVMValueRef Src, LLVMBuilderRef Builder) {
465 check_value_kind(Src, LLVMInstructionValueKind);
466 if (!LLVMIsAInstruction(Src))
467 report_fatal_error("Expected an instruction");
468
469 size_t NameLen;
470 const char *Name = LLVMGetValueName2(Src, &NameLen);
471
472 // Check if this is something we already computed.
473 {
474 auto i = VMap.find(Src);
475 if (i != VMap.end()) {
476 // If we have a hit, it means we already generated the instruction
477 // as a dependency to something else. We need to make sure
478 // it is ordered properly.
479 auto I = i->second;
480 LLVMInstructionRemoveFromParent(I);
481 LLVMInsertIntoBuilderWithName(Builder, I, Name);
482 return I;
483 }
484 }
485
486 // We tried everything, it must be an instruction
487 // that hasn't been generated already.
488 LLVMValueRef Dst = nullptr;
489
490 LLVMOpcode Op = LLVMGetInstructionOpcode(Src);
491 switch(Op) {
492 case LLVMRet: {
493 int OpCount = LLVMGetNumOperands(Src);
494 if (OpCount == 0)
495 Dst = LLVMBuildRetVoid(Builder);
496 else
497 Dst = LLVMBuildRet(Builder, CloneValue(LLVMGetOperand(Src, 0)));
498 break;
499 }
500 case LLVMBr: {
501 if (!LLVMIsConditional(Src)) {
502 LLVMValueRef SrcOp = LLVMGetOperand(Src, 0);
503 LLVMBasicBlockRef SrcBB = LLVMValueAsBasicBlock(SrcOp);
504 Dst = LLVMBuildBr(Builder, DeclareBB(SrcBB));
505 break;
506 }
507
508 LLVMValueRef Cond = LLVMGetCondition(Src);
509 LLVMValueRef Else = LLVMGetOperand(Src, 1);
510 LLVMBasicBlockRef ElseBB = DeclareBB(LLVMValueAsBasicBlock(Else));
511 LLVMValueRef Then = LLVMGetOperand(Src, 2);
512 LLVMBasicBlockRef ThenBB = DeclareBB(LLVMValueAsBasicBlock(Then));
513 Dst = LLVMBuildCondBr(Builder, CloneValue(Cond), ThenBB, ElseBB);
514 break;
515 }
516 case LLVMSwitch:
517 case LLVMIndirectBr:
518 break;
519 case LLVMInvoke: {
520 SmallVector<LLVMValueRef, 8> Args;
521 int ArgCount = LLVMGetNumArgOperands(Src);
522 for (int i = 0; i < ArgCount; i++)
523 Args.push_back(CloneValue(LLVMGetOperand(Src, i)));
524 LLVMTypeRef FnTy = CloneType(LLVMGetCalledFunctionType(Src));
525 LLVMValueRef Fn = CloneValue(LLVMGetCalledValue(Src));
526 LLVMBasicBlockRef Then = DeclareBB(LLVMGetNormalDest(Src));
527 LLVMBasicBlockRef Unwind = DeclareBB(LLVMGetUnwindDest(Src));
528 Dst = LLVMBuildInvoke2(Builder, FnTy, Fn, Args.data(), ArgCount,
529 Then, Unwind, Name);
530 CloneAttrs(Src, Dst);
531 break;
532 }
533 case LLVMUnreachable:
534 Dst = LLVMBuildUnreachable(Builder);
535 break;
536 case LLVMAdd: {
537 LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0));
538 LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1));
539 Dst = LLVMBuildAdd(Builder, LHS, RHS, Name);
540 break;
541 }
542 case LLVMSub: {
543 LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0));
544 LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1));
545 Dst = LLVMBuildSub(Builder, LHS, RHS, Name);
546 break;
547 }
548 case LLVMMul: {
549 LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0));
550 LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1));
551 Dst = LLVMBuildMul(Builder, LHS, RHS, Name);
552 break;
553 }
554 case LLVMUDiv: {
555 LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0));
556 LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1));
557 Dst = LLVMBuildUDiv(Builder, LHS, RHS, Name);
558 break;
559 }
560 case LLVMSDiv: {
561 LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0));
562 LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1));
563 Dst = LLVMBuildSDiv(Builder, LHS, RHS, Name);
564 break;
565 }
566 case LLVMURem: {
567 LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0));
568 LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1));
569 Dst = LLVMBuildURem(Builder, LHS, RHS, Name);
570 break;
571 }
572 case LLVMSRem: {
573 LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0));
574 LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1));
575 Dst = LLVMBuildSRem(Builder, LHS, RHS, Name);
576 break;
577 }
578 case LLVMShl: {
579 LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0));
580 LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1));
581 Dst = LLVMBuildShl(Builder, LHS, RHS, Name);
582 break;
583 }
584 case LLVMLShr: {
585 LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0));
586 LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1));
587 Dst = LLVMBuildLShr(Builder, LHS, RHS, Name);
588 break;
589 }
590 case LLVMAShr: {
591 LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0));
592 LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1));
593 Dst = LLVMBuildAShr(Builder, LHS, RHS, Name);
594 break;
595 }
596 case LLVMAnd: {
597 LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0));
598 LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1));
599 Dst = LLVMBuildAnd(Builder, LHS, RHS, Name);
600 break;
601 }
602 case LLVMOr: {
603 LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0));
604 LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1));
605 Dst = LLVMBuildOr(Builder, LHS, RHS, Name);
606 break;
607 }
608 case LLVMXor: {
609 LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0));
610 LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1));
611 Dst = LLVMBuildXor(Builder, LHS, RHS, Name);
612 break;
613 }
614 case LLVMAlloca: {
615 LLVMTypeRef Ty = CloneType(LLVMGetAllocatedType(Src));
616 Dst = LLVMBuildAlloca(Builder, Ty, Name);
617 LLVMSetAlignment(Dst, LLVMGetAlignment(Src));
618 break;
619 }
620 case LLVMLoad: {
621 LLVMValueRef Ptr = CloneValue(LLVMGetOperand(Src, 0));
622 Dst = LLVMBuildLoad2(Builder, CloneType(Src), Ptr, Name);
623 LLVMSetAlignment(Dst, LLVMGetAlignment(Src));
624 LLVMSetOrdering(Dst, LLVMGetOrdering(Src));
625 LLVMSetVolatile(Dst, LLVMGetVolatile(Src));
626 break;
627 }
628 case LLVMStore: {
629 LLVMValueRef Val = CloneValue(LLVMGetOperand(Src, 0));
630 LLVMValueRef Ptr = CloneValue(LLVMGetOperand(Src, 1));
631 Dst = LLVMBuildStore(Builder, Val, Ptr);
632 LLVMSetAlignment(Dst, LLVMGetAlignment(Src));
633 LLVMSetOrdering(Dst, LLVMGetOrdering(Src));
634 LLVMSetVolatile(Dst, LLVMGetVolatile(Src));
635 break;
636 }
637 case LLVMGetElementPtr: {
638 LLVMTypeRef ElemTy = CloneType(LLVMGetGEPSourceElementType(Src));
639 LLVMValueRef Ptr = CloneValue(LLVMGetOperand(Src, 0));
640 SmallVector<LLVMValueRef, 8> Idx;
641 int NumIdx = LLVMGetNumIndices(Src);
642 for (int i = 1; i <= NumIdx; i++)
643 Idx.push_back(CloneValue(LLVMGetOperand(Src, i)));
644 if (LLVMIsInBounds(Src))
645 Dst = LLVMBuildInBoundsGEP2(Builder, ElemTy, Ptr, Idx.data(), NumIdx,
646 Name);
647 else
648 Dst = LLVMBuildGEP2(Builder, ElemTy, Ptr, Idx.data(), NumIdx, Name);
649 break;
650 }
651 case LLVMAtomicRMW: {
652 LLVMValueRef Ptr = CloneValue(LLVMGetOperand(Src, 0));
653 LLVMValueRef Val = CloneValue(LLVMGetOperand(Src, 1));
654 LLVMAtomicRMWBinOp BinOp = LLVMGetAtomicRMWBinOp(Src);
655 LLVMAtomicOrdering Ord = LLVMGetOrdering(Src);
656 LLVMBool SingleThread = LLVMIsAtomicSingleThread(Src);
657 Dst = LLVMBuildAtomicRMW(Builder, BinOp, Ptr, Val, Ord, SingleThread);
658 LLVMSetAlignment(Dst, LLVMGetAlignment(Src));
659 LLVMSetVolatile(Dst, LLVMGetVolatile(Src));
660 LLVMSetValueName2(Dst, Name, NameLen);
661 break;
662 }
663 case LLVMAtomicCmpXchg: {
664 LLVMValueRef Ptr = CloneValue(LLVMGetOperand(Src, 0));
665 LLVMValueRef Cmp = CloneValue(LLVMGetOperand(Src, 1));
666 LLVMValueRef New = CloneValue(LLVMGetOperand(Src, 2));
667 LLVMAtomicOrdering Succ = LLVMGetCmpXchgSuccessOrdering(Src);
668 LLVMAtomicOrdering Fail = LLVMGetCmpXchgFailureOrdering(Src);
669 LLVMBool SingleThread = LLVMIsAtomicSingleThread(Src);
670
671 Dst = LLVMBuildAtomicCmpXchg(Builder, Ptr, Cmp, New, Succ, Fail,
672 SingleThread);
673 LLVMSetAlignment(Dst, LLVMGetAlignment(Src));
674 LLVMSetVolatile(Dst, LLVMGetVolatile(Src));
675 LLVMSetWeak(Dst, LLVMGetWeak(Src));
676 LLVMSetValueName2(Dst, Name, NameLen);
677 break;
678 }
679 case LLVMBitCast: {
680 LLVMValueRef V = CloneValue(LLVMGetOperand(Src, 0));
681 Dst = LLVMBuildBitCast(Builder, V, CloneType(Src), Name);
682 break;
683 }
684 case LLVMICmp: {
685 LLVMIntPredicate Pred = LLVMGetICmpPredicate(Src);
686 LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0));
687 LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1));
688 Dst = LLVMBuildICmp(Builder, Pred, LHS, RHS, Name);
689 break;
690 }
691 case LLVMPHI: {
692 // We need to aggressively set things here because of loops.
693 VMap[Src] = Dst = LLVMBuildPhi(Builder, CloneType(Src), Name);
694
695 SmallVector<LLVMValueRef, 8> Values;
696 SmallVector<LLVMBasicBlockRef, 8> Blocks;
697
698 unsigned IncomingCount = LLVMCountIncoming(Src);
699 for (unsigned i = 0; i < IncomingCount; ++i) {
700 Blocks.push_back(DeclareBB(LLVMGetIncomingBlock(Src, i)));
701 Values.push_back(CloneValue(LLVMGetIncomingValue(Src, i)));
702 }
703
704 LLVMAddIncoming(Dst, Values.data(), Blocks.data(), IncomingCount);
705 return Dst;
706 }
707 case LLVMCall: {
708 SmallVector<LLVMValueRef, 8> Args;
709 int ArgCount = LLVMGetNumArgOperands(Src);
710 for (int i = 0; i < ArgCount; i++)
711 Args.push_back(CloneValue(LLVMGetOperand(Src, i)));
712 LLVMTypeRef FnTy = CloneType(LLVMGetCalledFunctionType(Src));
713 LLVMValueRef Fn = CloneValue(LLVMGetCalledValue(Src));
714 Dst = LLVMBuildCall2(Builder, FnTy, Fn, Args.data(), ArgCount, Name);
715 LLVMSetTailCall(Dst, LLVMIsTailCall(Src));
716 CloneAttrs(Src, Dst);
717 break;
718 }
719 case LLVMResume: {
720 Dst = LLVMBuildResume(Builder, CloneValue(LLVMGetOperand(Src, 0)));
721 break;
722 }
723 case LLVMLandingPad: {
724 // The landing pad API is a bit screwed up for historical reasons.
725 Dst = LLVMBuildLandingPad(Builder, CloneType(Src), nullptr, 0, Name);
726 unsigned NumClauses = LLVMGetNumClauses(Src);
727 for (unsigned i = 0; i < NumClauses; ++i)
728 LLVMAddClause(Dst, CloneValue(LLVMGetClause(Src, i)));
729 LLVMSetCleanup(Dst, LLVMIsCleanup(Src));
730 break;
731 }
732 case LLVMCleanupRet: {
733 LLVMValueRef CatchPad = CloneValue(LLVMGetOperand(Src, 0));
734 LLVMBasicBlockRef Unwind = nullptr;
735 if (LLVMBasicBlockRef UDest = LLVMGetUnwindDest(Src))
736 Unwind = DeclareBB(UDest);
737 Dst = LLVMBuildCleanupRet(Builder, CatchPad, Unwind);
738 break;
739 }
740 case LLVMCatchRet: {
741 LLVMValueRef CatchPad = CloneValue(LLVMGetOperand(Src, 0));
742 LLVMBasicBlockRef SuccBB = DeclareBB(LLVMGetSuccessor(Src, 0));
743 Dst = LLVMBuildCatchRet(Builder, CatchPad, SuccBB);
744 break;
745 }
746 case LLVMCatchPad: {
747 LLVMValueRef ParentPad = CloneValue(LLVMGetParentCatchSwitch(Src));
748 SmallVector<LLVMValueRef, 8> Args;
749 int ArgCount = LLVMGetNumArgOperands(Src);
750 for (int i = 0; i < ArgCount; i++)
751 Args.push_back(CloneValue(LLVMGetOperand(Src, i)));
752 Dst = LLVMBuildCatchPad(Builder, ParentPad,
753 Args.data(), ArgCount, Name);
754 break;
755 }
756 case LLVMCleanupPad: {
757 LLVMValueRef ParentPad = CloneValue(LLVMGetOperand(Src, 0));
758 SmallVector<LLVMValueRef, 8> Args;
759 int ArgCount = LLVMGetNumArgOperands(Src);
760 for (int i = 0; i < ArgCount; i++)
761 Args.push_back(CloneValue(LLVMGetArgOperand(Src, i)));
762 Dst = LLVMBuildCleanupPad(Builder, ParentPad,
763 Args.data(), ArgCount, Name);
764 break;
765 }
766 case LLVMCatchSwitch: {
767 LLVMValueRef ParentPad = CloneValue(LLVMGetOperand(Src, 0));
768 LLVMBasicBlockRef UnwindBB = nullptr;
769 if (LLVMBasicBlockRef UDest = LLVMGetUnwindDest(Src)) {
770 UnwindBB = DeclareBB(UDest);
771 }
772 unsigned NumHandlers = LLVMGetNumHandlers(Src);
773 Dst = LLVMBuildCatchSwitch(Builder, ParentPad, UnwindBB, NumHandlers, Name);
774 if (NumHandlers > 0) {
775 LLVMBasicBlockRef *Handlers = static_cast<LLVMBasicBlockRef*>(
776 safe_malloc(NumHandlers * sizeof(LLVMBasicBlockRef)));
777 LLVMGetHandlers(Src, Handlers);
778 for (unsigned i = 0; i < NumHandlers; i++)
779 LLVMAddHandler(Dst, DeclareBB(Handlers[i]));
780 free(Handlers);
781 }
782 break;
783 }
784 case LLVMExtractValue: {
785 LLVMValueRef Agg = CloneValue(LLVMGetOperand(Src, 0));
786 if (LLVMGetNumIndices(Src) > 1)
787 report_fatal_error("ExtractValue: Expected only one index");
788 else if (LLVMGetNumIndices(Src) < 1)
789 report_fatal_error("ExtractValue: Expected an index");
790 auto I = LLVMGetIndices(Src)[0];
791 Dst = LLVMBuildExtractValue(Builder, Agg, I, Name);
792 break;
793 }
794 case LLVMInsertValue: {
795 LLVMValueRef Agg = CloneValue(LLVMGetOperand(Src, 0));
796 LLVMValueRef V = CloneValue(LLVMGetOperand(Src, 1));
797 if (LLVMGetNumIndices(Src) > 1)
798 report_fatal_error("InsertValue: Expected only one index");
799 else if (LLVMGetNumIndices(Src) < 1)
800 report_fatal_error("InsertValue: Expected an index");
801 auto I = LLVMGetIndices(Src)[0];
802 Dst = LLVMBuildInsertValue(Builder, Agg, V, I, Name);
803 break;
804 }
805 case LLVMExtractElement: {
806 LLVMValueRef Agg = CloneValue(LLVMGetOperand(Src, 0));
807 LLVMValueRef Index = CloneValue(LLVMGetOperand(Src, 1));
808 Dst = LLVMBuildExtractElement(Builder, Agg, Index, Name);
809 break;
810 }
811 case LLVMInsertElement: {
812 LLVMValueRef Agg = CloneValue(LLVMGetOperand(Src, 0));
813 LLVMValueRef V = CloneValue(LLVMGetOperand(Src, 1));
814 LLVMValueRef Index = CloneValue(LLVMGetOperand(Src, 2));
815 Dst = LLVMBuildInsertElement(Builder, Agg, V, Index, Name);
816 break;
817 }
818 case LLVMShuffleVector: {
819 LLVMValueRef Agg0 = CloneValue(LLVMGetOperand(Src, 0));
820 LLVMValueRef Agg1 = CloneValue(LLVMGetOperand(Src, 1));
821 SmallVector<LLVMValueRef, 8> MaskElts;
822 unsigned NumMaskElts = LLVMGetNumMaskElements(Src);
823 for (unsigned i = 0; i < NumMaskElts; i++) {
824 int Val = LLVMGetMaskValue(Src, i);
825 if (Val == LLVMGetUndefMaskElem()) {
826 MaskElts.push_back(LLVMGetUndef(LLVMInt64Type()));
827 } else {
828 MaskElts.push_back(LLVMConstInt(LLVMInt64Type(), Val, true));
829 }
830 }
831 LLVMValueRef Mask = LLVMConstVector(MaskElts.data(), NumMaskElts);
832 Dst = LLVMBuildShuffleVector(Builder, Agg0, Agg1, Mask, Name);
833 break;
834 }
835 case LLVMFreeze: {
836 LLVMValueRef Arg = CloneValue(LLVMGetOperand(Src, 0));
837 Dst = LLVMBuildFreeze(Builder, Arg, Name);
838 break;
839 }
840 default:
841 break;
842 }
843
844 if (Dst == nullptr) {
845 fprintf(stderr, "%d is not a supported opcode\n", Op);
846 exit(-1);
847 }
848
849 auto Ctx = LLVMGetModuleContext(M);
850 size_t NumMetadataEntries;
851 auto *AllMetadata =
852 LLVMInstructionGetAllMetadataOtherThanDebugLoc(Src,
853 &NumMetadataEntries);
854 for (unsigned i = 0; i < NumMetadataEntries; ++i) {
855 unsigned Kind = LLVMValueMetadataEntriesGetKind(AllMetadata, i);
856 LLVMMetadataRef MD = LLVMValueMetadataEntriesGetMetadata(AllMetadata, i);
857 LLVMSetMetadata(Dst, Kind, LLVMMetadataAsValue(Ctx, MD));
858 }
859 LLVMDisposeValueMetadataEntries(AllMetadata);
860 LLVMAddMetadataToInst(Builder, Dst);
861
862 check_value_kind(Dst, LLVMInstructionValueKind);
863 return VMap[Src] = Dst;
864 }
865
DeclareBBFunCloner866 LLVMBasicBlockRef DeclareBB(LLVMBasicBlockRef Src) {
867 // Check if this is something we already computed.
868 {
869 auto i = BBMap.find(Src);
870 if (i != BBMap.end()) {
871 return i->second;
872 }
873 }
874
875 LLVMValueRef V = LLVMBasicBlockAsValue(Src);
876 if (!LLVMValueIsBasicBlock(V) || LLVMValueAsBasicBlock(V) != Src)
877 report_fatal_error("Basic block is not a basic block");
878
879 const char *Name = LLVMGetBasicBlockName(Src);
880 size_t NameLen;
881 const char *VName = LLVMGetValueName2(V, &NameLen);
882 if (Name != VName)
883 report_fatal_error("Basic block name mismatch");
884
885 LLVMBasicBlockRef BB = LLVMAppendBasicBlock(Fun, Name);
886 return BBMap[Src] = BB;
887 }
888
CloneBBFunCloner889 LLVMBasicBlockRef CloneBB(LLVMBasicBlockRef Src) {
890 LLVMBasicBlockRef BB = DeclareBB(Src);
891
892 // Make sure ordering is correct.
893 LLVMBasicBlockRef Prev = LLVMGetPreviousBasicBlock(Src);
894 if (Prev)
895 LLVMMoveBasicBlockAfter(BB, DeclareBB(Prev));
896
897 LLVMValueRef First = LLVMGetFirstInstruction(Src);
898 LLVMValueRef Last = LLVMGetLastInstruction(Src);
899
900 if (First == nullptr) {
901 if (Last != nullptr)
902 report_fatal_error("Has no first instruction, but last one");
903 return BB;
904 }
905
906 auto Ctx = LLVMGetModuleContext(M);
907 LLVMBuilderRef Builder = LLVMCreateBuilderInContext(Ctx);
908 LLVMPositionBuilderAtEnd(Builder, BB);
909
910 LLVMValueRef Cur = First;
911 LLVMValueRef Next = nullptr;
912 while(true) {
913 CloneInstruction(Cur, Builder);
914 Next = LLVMGetNextInstruction(Cur);
915 if (Next == nullptr) {
916 if (Cur != Last)
917 report_fatal_error("Final instruction does not match Last");
918 break;
919 }
920
921 LLVMValueRef Prev = LLVMGetPreviousInstruction(Next);
922 if (Prev != Cur)
923 report_fatal_error("Next.Previous instruction is not Current");
924
925 Cur = Next;
926 }
927
928 LLVMDisposeBuilder(Builder);
929 return BB;
930 }
931
CloneBBsFunCloner932 void CloneBBs(LLVMValueRef Src) {
933 unsigned Count = LLVMCountBasicBlocks(Src);
934 if (Count == 0)
935 return;
936
937 LLVMBasicBlockRef First = LLVMGetFirstBasicBlock(Src);
938 LLVMBasicBlockRef Last = LLVMGetLastBasicBlock(Src);
939
940 LLVMBasicBlockRef Cur = First;
941 LLVMBasicBlockRef Next = nullptr;
942 while(true) {
943 CloneBB(Cur);
944 Count--;
945 Next = LLVMGetNextBasicBlock(Cur);
946 if (Next == nullptr) {
947 if (Cur != Last)
948 report_fatal_error("Final basic block does not match Last");
949 break;
950 }
951
952 LLVMBasicBlockRef Prev = LLVMGetPreviousBasicBlock(Next);
953 if (Prev != Cur)
954 report_fatal_error("Next.Previous basic bloc is not Current");
955
956 Cur = Next;
957 }
958
959 if (Count != 0)
960 report_fatal_error("Basic block count does not match iterration");
961 }
962 };
963
declare_symbols(LLVMModuleRef Src,LLVMModuleRef M)964 static void declare_symbols(LLVMModuleRef Src, LLVMModuleRef M) {
965 auto Ctx = LLVMGetModuleContext(M);
966
967 LLVMValueRef Begin = LLVMGetFirstGlobal(Src);
968 LLVMValueRef End = LLVMGetLastGlobal(Src);
969
970 LLVMValueRef Cur = Begin;
971 LLVMValueRef Next = nullptr;
972 if (!Begin) {
973 if (End != nullptr)
974 report_fatal_error("Range has an end but no beginning");
975 goto FunDecl;
976 }
977
978 while (true) {
979 size_t NameLen;
980 const char *Name = LLVMGetValueName2(Cur, &NameLen);
981 if (LLVMGetNamedGlobal(M, Name))
982 report_fatal_error("GlobalVariable already cloned");
983 LLVMAddGlobal(M, TypeCloner(M).Clone(LLVMGlobalGetValueType(Cur)), Name);
984
985 Next = LLVMGetNextGlobal(Cur);
986 if (Next == nullptr) {
987 if (Cur != End)
988 report_fatal_error("");
989 break;
990 }
991
992 LLVMValueRef Prev = LLVMGetPreviousGlobal(Next);
993 if (Prev != Cur)
994 report_fatal_error("Next.Previous global is not Current");
995
996 Cur = Next;
997 }
998
999 FunDecl:
1000 Begin = LLVMGetFirstFunction(Src);
1001 End = LLVMGetLastFunction(Src);
1002 if (!Begin) {
1003 if (End != nullptr)
1004 report_fatal_error("Range has an end but no beginning");
1005 goto AliasDecl;
1006 }
1007
1008 Cur = Begin;
1009 Next = nullptr;
1010 while (true) {
1011 size_t NameLen;
1012 const char *Name = LLVMGetValueName2(Cur, &NameLen);
1013 if (LLVMGetNamedFunction(M, Name))
1014 report_fatal_error("Function already cloned");
1015 LLVMTypeRef Ty = TypeCloner(M).Clone(LLVMGlobalGetValueType(Cur));
1016
1017 auto F = LLVMAddFunction(M, Name, Ty);
1018
1019 // Copy attributes
1020 for (int i = LLVMAttributeFunctionIndex, c = LLVMCountParams(F);
1021 i <= c; ++i) {
1022 for (unsigned k = 0, e = LLVMGetLastEnumAttributeKind(); k < e; ++k) {
1023 if (auto SrcA = LLVMGetEnumAttributeAtIndex(Cur, i, k)) {
1024 auto Val = LLVMGetEnumAttributeValue(SrcA);
1025 auto DstA = LLVMCreateEnumAttribute(Ctx, k, Val);
1026 LLVMAddAttributeAtIndex(F, i, DstA);
1027 }
1028 }
1029 }
1030
1031 Next = LLVMGetNextFunction(Cur);
1032 if (Next == nullptr) {
1033 if (Cur != End)
1034 report_fatal_error("Last function does not match End");
1035 break;
1036 }
1037
1038 LLVMValueRef Prev = LLVMGetPreviousFunction(Next);
1039 if (Prev != Cur)
1040 report_fatal_error("Next.Previous function is not Current");
1041
1042 Cur = Next;
1043 }
1044
1045 AliasDecl:
1046 Begin = LLVMGetFirstGlobalAlias(Src);
1047 End = LLVMGetLastGlobalAlias(Src);
1048 if (!Begin) {
1049 if (End != nullptr)
1050 report_fatal_error("Range has an end but no beginning");
1051 goto GlobalIFuncDecl;
1052 }
1053
1054 Cur = Begin;
1055 Next = nullptr;
1056 while (true) {
1057 size_t NameLen;
1058 const char *Name = LLVMGetValueName2(Cur, &NameLen);
1059 if (LLVMGetNamedGlobalAlias(M, Name, NameLen))
1060 report_fatal_error("Global alias already cloned");
1061 LLVMTypeRef PtrType = TypeCloner(M).Clone(Cur);
1062 LLVMTypeRef ValType = TypeCloner(M).Clone(LLVMGlobalGetValueType(Cur));
1063 unsigned AddrSpace = LLVMGetPointerAddressSpace(PtrType);
1064 // FIXME: Allow NULL aliasee.
1065 LLVMAddAlias2(M, ValType, AddrSpace, LLVMGetUndef(PtrType), Name);
1066
1067 Next = LLVMGetNextGlobalAlias(Cur);
1068 if (Next == nullptr) {
1069 if (Cur != End)
1070 report_fatal_error("");
1071 break;
1072 }
1073
1074 LLVMValueRef Prev = LLVMGetPreviousGlobalAlias(Next);
1075 if (Prev != Cur)
1076 report_fatal_error("Next.Previous global is not Current");
1077
1078 Cur = Next;
1079 }
1080
1081 GlobalIFuncDecl:
1082 Begin = LLVMGetFirstGlobalIFunc(Src);
1083 End = LLVMGetLastGlobalIFunc(Src);
1084 if (!Begin) {
1085 if (End != nullptr)
1086 report_fatal_error("Range has an end but no beginning");
1087 goto NamedMDDecl;
1088 }
1089
1090 Cur = Begin;
1091 Next = nullptr;
1092 while (true) {
1093 size_t NameLen;
1094 const char *Name = LLVMGetValueName2(Cur, &NameLen);
1095 if (LLVMGetNamedGlobalIFunc(M, Name, NameLen))
1096 report_fatal_error("Global ifunc already cloned");
1097 LLVMTypeRef CurType = TypeCloner(M).Clone(LLVMGlobalGetValueType(Cur));
1098 // FIXME: Allow NULL resolver.
1099 LLVMAddGlobalIFunc(M, Name, NameLen,
1100 CurType, /*addressSpace*/ 0, LLVMGetUndef(CurType));
1101
1102 Next = LLVMGetNextGlobalIFunc(Cur);
1103 if (Next == nullptr) {
1104 if (Cur != End)
1105 report_fatal_error("");
1106 break;
1107 }
1108
1109 LLVMValueRef Prev = LLVMGetPreviousGlobalIFunc(Next);
1110 if (Prev != Cur)
1111 report_fatal_error("Next.Previous global is not Current");
1112
1113 Cur = Next;
1114 }
1115
1116 NamedMDDecl:
1117 LLVMNamedMDNodeRef BeginMD = LLVMGetFirstNamedMetadata(Src);
1118 LLVMNamedMDNodeRef EndMD = LLVMGetLastNamedMetadata(Src);
1119 if (!BeginMD) {
1120 if (EndMD != nullptr)
1121 report_fatal_error("Range has an end but no beginning");
1122 return;
1123 }
1124
1125 LLVMNamedMDNodeRef CurMD = BeginMD;
1126 LLVMNamedMDNodeRef NextMD = nullptr;
1127 while (true) {
1128 size_t NameLen;
1129 const char *Name = LLVMGetNamedMetadataName(CurMD, &NameLen);
1130 if (LLVMGetNamedMetadata(M, Name, NameLen))
1131 report_fatal_error("Named Metadata Node already cloned");
1132 LLVMGetOrInsertNamedMetadata(M, Name, NameLen);
1133
1134 NextMD = LLVMGetNextNamedMetadata(CurMD);
1135 if (NextMD == nullptr) {
1136 if (CurMD != EndMD)
1137 report_fatal_error("");
1138 break;
1139 }
1140
1141 LLVMNamedMDNodeRef PrevMD = LLVMGetPreviousNamedMetadata(NextMD);
1142 if (PrevMD != CurMD)
1143 report_fatal_error("Next.Previous global is not Current");
1144
1145 CurMD = NextMD;
1146 }
1147 }
1148
clone_symbols(LLVMModuleRef Src,LLVMModuleRef M)1149 static void clone_symbols(LLVMModuleRef Src, LLVMModuleRef M) {
1150 LLVMValueRef Begin = LLVMGetFirstGlobal(Src);
1151 LLVMValueRef End = LLVMGetLastGlobal(Src);
1152
1153 LLVMValueRef Cur = Begin;
1154 LLVMValueRef Next = nullptr;
1155 if (!Begin) {
1156 if (End != nullptr)
1157 report_fatal_error("Range has an end but no beginning");
1158 goto FunClone;
1159 }
1160
1161 while (true) {
1162 size_t NameLen;
1163 const char *Name = LLVMGetValueName2(Cur, &NameLen);
1164 LLVMValueRef G = LLVMGetNamedGlobal(M, Name);
1165 if (!G)
1166 report_fatal_error("GlobalVariable must have been declared already");
1167
1168 if (auto I = LLVMGetInitializer(Cur))
1169 LLVMSetInitializer(G, clone_constant(I, M));
1170
1171 size_t NumMetadataEntries;
1172 auto *AllMetadata = LLVMGlobalCopyAllMetadata(Cur, &NumMetadataEntries);
1173 for (unsigned i = 0; i < NumMetadataEntries; ++i) {
1174 unsigned Kind = LLVMValueMetadataEntriesGetKind(AllMetadata, i);
1175 LLVMMetadataRef MD = LLVMValueMetadataEntriesGetMetadata(AllMetadata, i);
1176 LLVMGlobalSetMetadata(G, Kind, MD);
1177 }
1178 LLVMDisposeValueMetadataEntries(AllMetadata);
1179
1180 LLVMSetGlobalConstant(G, LLVMIsGlobalConstant(Cur));
1181 LLVMSetThreadLocal(G, LLVMIsThreadLocal(Cur));
1182 LLVMSetExternallyInitialized(G, LLVMIsExternallyInitialized(Cur));
1183 LLVMSetLinkage(G, LLVMGetLinkage(Cur));
1184 LLVMSetSection(G, LLVMGetSection(Cur));
1185 LLVMSetVisibility(G, LLVMGetVisibility(Cur));
1186 LLVMSetUnnamedAddress(G, LLVMGetUnnamedAddress(Cur));
1187 LLVMSetAlignment(G, LLVMGetAlignment(Cur));
1188
1189 Next = LLVMGetNextGlobal(Cur);
1190 if (Next == nullptr) {
1191 if (Cur != End)
1192 report_fatal_error("");
1193 break;
1194 }
1195
1196 LLVMValueRef Prev = LLVMGetPreviousGlobal(Next);
1197 if (Prev != Cur)
1198 report_fatal_error("Next.Previous global is not Current");
1199
1200 Cur = Next;
1201 }
1202
1203 FunClone:
1204 Begin = LLVMGetFirstFunction(Src);
1205 End = LLVMGetLastFunction(Src);
1206 if (!Begin) {
1207 if (End != nullptr)
1208 report_fatal_error("Range has an end but no beginning");
1209 goto AliasClone;
1210 }
1211
1212 Cur = Begin;
1213 Next = nullptr;
1214 while (true) {
1215 size_t NameLen;
1216 const char *Name = LLVMGetValueName2(Cur, &NameLen);
1217 LLVMValueRef Fun = LLVMGetNamedFunction(M, Name);
1218 if (!Fun)
1219 report_fatal_error("Function must have been declared already");
1220
1221 if (LLVMHasPersonalityFn(Cur)) {
1222 size_t FNameLen;
1223 const char *FName = LLVMGetValueName2(LLVMGetPersonalityFn(Cur),
1224 &FNameLen);
1225 LLVMValueRef P = LLVMGetNamedFunction(M, FName);
1226 if (!P)
1227 report_fatal_error("Could not find personality function");
1228 LLVMSetPersonalityFn(Fun, P);
1229 }
1230
1231 size_t NumMetadataEntries;
1232 auto *AllMetadata = LLVMGlobalCopyAllMetadata(Cur, &NumMetadataEntries);
1233 for (unsigned i = 0; i < NumMetadataEntries; ++i) {
1234 unsigned Kind = LLVMValueMetadataEntriesGetKind(AllMetadata, i);
1235 LLVMMetadataRef MD = LLVMValueMetadataEntriesGetMetadata(AllMetadata, i);
1236 LLVMGlobalSetMetadata(Fun, Kind, MD);
1237 }
1238 LLVMDisposeValueMetadataEntries(AllMetadata);
1239
1240 FunCloner FC(Cur, Fun);
1241 FC.CloneBBs(Cur);
1242
1243 Next = LLVMGetNextFunction(Cur);
1244 if (Next == nullptr) {
1245 if (Cur != End)
1246 report_fatal_error("Last function does not match End");
1247 break;
1248 }
1249
1250 LLVMValueRef Prev = LLVMGetPreviousFunction(Next);
1251 if (Prev != Cur)
1252 report_fatal_error("Next.Previous function is not Current");
1253
1254 Cur = Next;
1255 }
1256
1257 AliasClone:
1258 Begin = LLVMGetFirstGlobalAlias(Src);
1259 End = LLVMGetLastGlobalAlias(Src);
1260 if (!Begin) {
1261 if (End != nullptr)
1262 report_fatal_error("Range has an end but no beginning");
1263 goto GlobalIFuncClone;
1264 }
1265
1266 Cur = Begin;
1267 Next = nullptr;
1268 while (true) {
1269 size_t NameLen;
1270 const char *Name = LLVMGetValueName2(Cur, &NameLen);
1271 LLVMValueRef Alias = LLVMGetNamedGlobalAlias(M, Name, NameLen);
1272 if (!Alias)
1273 report_fatal_error("Global alias must have been declared already");
1274
1275 if (LLVMValueRef Aliasee = LLVMAliasGetAliasee(Cur)) {
1276 LLVMAliasSetAliasee(Alias, clone_constant(Aliasee, M));
1277 }
1278
1279 LLVMSetLinkage(Alias, LLVMGetLinkage(Cur));
1280 LLVMSetUnnamedAddress(Alias, LLVMGetUnnamedAddress(Cur));
1281
1282 Next = LLVMGetNextGlobalAlias(Cur);
1283 if (Next == nullptr) {
1284 if (Cur != End)
1285 report_fatal_error("Last global alias does not match End");
1286 break;
1287 }
1288
1289 LLVMValueRef Prev = LLVMGetPreviousGlobalAlias(Next);
1290 if (Prev != Cur)
1291 report_fatal_error("Next.Previous global alias is not Current");
1292
1293 Cur = Next;
1294 }
1295
1296 GlobalIFuncClone:
1297 Begin = LLVMGetFirstGlobalIFunc(Src);
1298 End = LLVMGetLastGlobalIFunc(Src);
1299 if (!Begin) {
1300 if (End != nullptr)
1301 report_fatal_error("Range has an end but no beginning");
1302 goto NamedMDClone;
1303 }
1304
1305 Cur = Begin;
1306 Next = nullptr;
1307 while (true) {
1308 size_t NameLen;
1309 const char *Name = LLVMGetValueName2(Cur, &NameLen);
1310 LLVMValueRef IFunc = LLVMGetNamedGlobalIFunc(M, Name, NameLen);
1311 if (!IFunc)
1312 report_fatal_error("Global ifunc must have been declared already");
1313
1314 if (LLVMValueRef Resolver = LLVMGetGlobalIFuncResolver(Cur)) {
1315 LLVMSetGlobalIFuncResolver(IFunc, clone_constant(Resolver, M));
1316 }
1317
1318 LLVMSetLinkage(IFunc, LLVMGetLinkage(Cur));
1319 LLVMSetUnnamedAddress(IFunc, LLVMGetUnnamedAddress(Cur));
1320
1321 Next = LLVMGetNextGlobalIFunc(Cur);
1322 if (Next == nullptr) {
1323 if (Cur != End)
1324 report_fatal_error("Last global alias does not match End");
1325 break;
1326 }
1327
1328 LLVMValueRef Prev = LLVMGetPreviousGlobalIFunc(Next);
1329 if (Prev != Cur)
1330 report_fatal_error("Next.Previous global alias is not Current");
1331
1332 Cur = Next;
1333 }
1334
1335 NamedMDClone:
1336 LLVMNamedMDNodeRef BeginMD = LLVMGetFirstNamedMetadata(Src);
1337 LLVMNamedMDNodeRef EndMD = LLVMGetLastNamedMetadata(Src);
1338 if (!BeginMD) {
1339 if (EndMD != nullptr)
1340 report_fatal_error("Range has an end but no beginning");
1341 return;
1342 }
1343
1344 LLVMNamedMDNodeRef CurMD = BeginMD;
1345 LLVMNamedMDNodeRef NextMD = nullptr;
1346 while (true) {
1347 size_t NameLen;
1348 const char *Name = LLVMGetNamedMetadataName(CurMD, &NameLen);
1349 LLVMNamedMDNodeRef NamedMD = LLVMGetNamedMetadata(M, Name, NameLen);
1350 if (!NamedMD)
1351 report_fatal_error("Named MD Node must have been declared already");
1352
1353 unsigned OperandCount = LLVMGetNamedMetadataNumOperands(Src, Name);
1354 LLVMValueRef *OperandBuf = static_cast<LLVMValueRef *>(
1355 safe_malloc(OperandCount * sizeof(LLVMValueRef)));
1356 LLVMGetNamedMetadataOperands(Src, Name, OperandBuf);
1357 for (unsigned i = 0, e = OperandCount; i != e; ++i) {
1358 LLVMAddNamedMetadataOperand(M, Name, OperandBuf[i]);
1359 }
1360 free(OperandBuf);
1361
1362 NextMD = LLVMGetNextNamedMetadata(CurMD);
1363 if (NextMD == nullptr) {
1364 if (CurMD != EndMD)
1365 report_fatal_error("Last Named MD Node does not match End");
1366 break;
1367 }
1368
1369 LLVMNamedMDNodeRef PrevMD = LLVMGetPreviousNamedMetadata(NextMD);
1370 if (PrevMD != CurMD)
1371 report_fatal_error("Next.Previous Named MD Node is not Current");
1372
1373 CurMD = NextMD;
1374 }
1375 }
1376
llvm_echo(bool OpaquePointers)1377 int llvm_echo(bool OpaquePointers) {
1378 LLVMEnablePrettyStackTrace();
1379
1380 LLVMModuleRef Src = llvm_load_module(false, true);
1381 size_t SourceFileLen;
1382 const char *SourceFileName = LLVMGetSourceFileName(Src, &SourceFileLen);
1383 size_t ModuleIdentLen;
1384 const char *ModuleName = LLVMGetModuleIdentifier(Src, &ModuleIdentLen);
1385 LLVMContextRef Ctx = LLVMContextCreate();
1386 if (!OpaquePointers)
1387 LLVMContextSetOpaquePointers(Ctx, false);
1388 LLVMModuleRef M = LLVMModuleCreateWithNameInContext(ModuleName, Ctx);
1389
1390 LLVMSetSourceFileName(M, SourceFileName, SourceFileLen);
1391 LLVMSetModuleIdentifier(M, ModuleName, ModuleIdentLen);
1392
1393 LLVMSetTarget(M, LLVMGetTarget(Src));
1394 LLVMSetModuleDataLayout(M, LLVMGetModuleDataLayout(Src));
1395 if (strcmp(LLVMGetDataLayoutStr(M), LLVMGetDataLayoutStr(Src)))
1396 report_fatal_error("Inconsistent DataLayout string representation");
1397
1398 size_t ModuleInlineAsmLen;
1399 const char *ModuleAsm = LLVMGetModuleInlineAsm(Src, &ModuleInlineAsmLen);
1400 LLVMSetModuleInlineAsm2(M, ModuleAsm, ModuleInlineAsmLen);
1401
1402 declare_symbols(Src, M);
1403 clone_symbols(Src, M);
1404 char *Str = LLVMPrintModuleToString(M);
1405 fputs(Str, stdout);
1406
1407 LLVMDisposeMessage(Str);
1408 LLVMDisposeModule(Src);
1409 LLVMDisposeModule(M);
1410 LLVMContextDispose(Ctx);
1411
1412 return 0;
1413 }
1414