[llvm] r260309 - Improve the C API echo test tool to emit basic block is the right order.
Amaury Sechet via llvm-commits
llvm-commits at lists.llvm.org
Tue Feb 9 14:36:41 PST 2016
Author: deadalnix
Date: Tue Feb 9 16:36:41 2016
New Revision: 260309
URL: http://llvm.org/viewvc/llvm-project?rev=260309&view=rev
Log:
Improve the C API echo test tool to emit basic block is the right order.
Summary: As per title. Also add a facility method to get the name of a basic block from the C API.
Reviewers: bogner, chandlerc, echristo, dblaikie, joker.eph, Wallbraker
Subscribers: llvm-commits
Differential Revision: http://reviews.llvm.org/D16912
Modified:
llvm/trunk/include/llvm-c/Core.h
llvm/trunk/lib/IR/Core.cpp
llvm/trunk/test/Bindings/llvm-c/echo.ll
llvm/trunk/tools/llvm-c-test/echo.cpp
Modified: llvm/trunk/include/llvm-c/Core.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm-c/Core.h?rev=260309&r1=260308&r2=260309&view=diff
==============================================================================
--- llvm/trunk/include/llvm-c/Core.h (original)
+++ llvm/trunk/include/llvm-c/Core.h Tue Feb 9 16:36:41 2016
@@ -2106,6 +2106,11 @@ LLVMBool LLVMValueIsBasicBlock(LLVMValue
LLVMBasicBlockRef LLVMValueAsBasicBlock(LLVMValueRef Val);
/**
+ * Obtain the string name of a basic block.
+ */
+const char *LLVMGetBasicBlockName(LLVMBasicBlockRef BB);
+
+/**
* Obtain the function to which a basic block belongs.
*
* @see llvm::BasicBlock::getParent()
Modified: llvm/trunk/lib/IR/Core.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Core.cpp?rev=260309&r1=260308&r2=260309&view=diff
==============================================================================
--- llvm/trunk/lib/IR/Core.cpp (original)
+++ llvm/trunk/lib/IR/Core.cpp Tue Feb 9 16:36:41 2016
@@ -1871,6 +1871,10 @@ LLVMBasicBlockRef LLVMValueAsBasicBlock(
return wrap(unwrap<BasicBlock>(Val));
}
+const char *LLVMGetBasicBlockName(LLVMBasicBlockRef BB) {
+ return unwrap(BB)->getName().data();
+}
+
LLVMValueRef LLVMGetBasicBlockParent(LLVMBasicBlockRef BB) {
return wrap(unwrap(BB)->getParent());
}
Modified: llvm/trunk/test/Bindings/llvm-c/echo.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Bindings/llvm-c/echo.ll?rev=260309&r1=260308&r2=260309&view=diff
==============================================================================
--- llvm/trunk/test/Bindings/llvm-c/echo.ll (original)
+++ llvm/trunk/test/Bindings/llvm-c/echo.ll Tue Feb 9 16:36:41 2016
@@ -42,3 +42,11 @@ define i32 @call() {
%1 = call i32 @iops(i32 23, i32 19)
ret i32 %1
}
+
+define i32 @bborder(i32 %a, i32 %b) {
+ br label %br
+unreachable:
+ unreachable
+br:
+ br label %unreachable
+}
Modified: llvm/trunk/tools/llvm-c-test/echo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-c-test/echo.cpp?rev=260309&r1=260308&r2=260309&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-c-test/echo.cpp (original)
+++ llvm/trunk/tools/llvm-c-test/echo.cpp Tue Feb 9 16:36:41 2016
@@ -17,6 +17,7 @@
#include "llvm-c-test.h"
#include "llvm/ADT/DenseMap.h"
+#include "llvm/Support/ErrorHandling.h"
#include <stdio.h>
#include <stdlib.h>
@@ -51,6 +52,7 @@ struct CAPIDenseMap<T*> {
};
typedef CAPIDenseMap<LLVMValueRef>::Map ValueMap;
+typedef CAPIDenseMap<LLVMBasicBlockRef>::Map BasicBlockMap;
static LLVMTypeRef clone_type(LLVMTypeRef Src, LLVMContextRef Ctx) {
LLVMTypeKind Kind = LLVMGetTypeKind(Src);
@@ -79,9 +81,8 @@ static LLVMTypeRef clone_type(LLVMTypeRe
if (ParamCount > 0) {
Params = (LLVMTypeRef*) malloc(ParamCount * sizeof(LLVMTypeRef));
LLVMGetParamTypes(Src, Params);
- for (unsigned i = 0; i < ParamCount; i++) {
+ for (unsigned i = 0; i < ParamCount; i++)
Params[i] = clone_type(Params[i], Ctx);
- }
}
LLVMTypeRef FunTy = LLVMFunctionType(
@@ -145,257 +146,303 @@ static LLVMModuleRef get_module(LLVMBuil
return LLVMGetGlobalParent(Fn);
}
-// Try to clone everything in the llvm::Value hierarchy.
-static LLVMValueRef clone_value(LLVMValueRef Src, LLVMBuilderRef Builder, ValueMap &VMap) {
- const char *Name = LLVMGetValueName(Src);
+static ValueMap clone_params(LLVMValueRef Src, LLVMValueRef Dst);
- // First, the value may be constant.
- if (LLVMIsAConstant(Src)) {
- LLVMModuleRef M = get_module(Builder);
-
- // Maybe it is a symbol
- if (LLVMIsAGlobalValue(Src)) {
- // Try function
- LLVMValueRef Dst = LLVMGetNamedFunction(M, Name);
- if (Dst != nullptr)
- return Dst;
-
- // Try global variable
- Dst = LLVMGetNamedGlobal(M, Name);
- if (Dst != nullptr)
- return Dst;
+struct FunCloner {
+ LLVMValueRef Fun;
- fprintf(stderr, "Could not find @%s\n", Name);
- exit(-1);
- }
+ ValueMap VMap;
+ BasicBlockMap BBMap;
- // Try literal
- LLVMContextRef Ctx = LLVMGetModuleContext(M);
- return clone_literal(Src, Ctx);
- }
+ FunCloner(LLVMValueRef Src, LLVMValueRef Dst)
+ : Fun(Dst), VMap(clone_params(Src, Dst)) {}
- // Try undef
- if (LLVMIsUndef(Src)) {
- LLVMContextRef Ctx = LLVMGetModuleContext(get_module(Builder));
- LLVMTypeRef Ty = clone_type(LLVMTypeOf(Src), Ctx);
- return LLVMGetUndef(Ty);
- }
+ // Try to clone everything in the llvm::Value hierarchy.
+ LLVMValueRef CloneValue(LLVMValueRef Src, LLVMBuilderRef Builder) {
+ const char *Name = LLVMGetValueName(Src);
+
+ // First, the value may be constant.
+ if (LLVMIsAConstant(Src)) {
+ LLVMModuleRef M = get_module(Builder);
+
+ // Maybe it is a symbol
+ if (LLVMIsAGlobalValue(Src)) {
+ // Try function
+ LLVMValueRef Dst = LLVMGetNamedFunction(M, Name);
+ if (Dst != nullptr)
+ return Dst;
+
+ // Try global variable
+ Dst = LLVMGetNamedGlobal(M, Name);
+ if (Dst != nullptr)
+ return Dst;
- // Check if this is something we already computed.
- {
- auto i = VMap.find(Src);
- if (i != VMap.end())
- return i->second;
- }
+ fprintf(stderr, "Could not find @%s\n", Name);
+ exit(-1);
+ }
- // We tried everything, it must be an instruction
- // that hasn't been generated already.
- LLVMValueRef Dst = nullptr;
-
- LLVMOpcode Op = LLVMGetInstructionOpcode(Src);
- switch(Op) {
- case LLVMRet: {
- int OpCount = LLVMGetNumOperands(Src);
- if (OpCount == 0)
- Dst = LLVMBuildRetVoid(Builder);
- else
- Dst = LLVMBuildRet(Builder, clone_value(LLVMGetOperand(Src, 0),
- Builder, VMap));
- break;
- }
- case LLVMBr:
- case LLVMSwitch:
- case LLVMIndirectBr:
- case LLVMInvoke:
- case LLVMUnreachable:
- break;
- case LLVMAdd: {
- LLVMValueRef LHS = clone_value(LLVMGetOperand(Src, 0), Builder, VMap);
- LLVMValueRef RHS = clone_value(LLVMGetOperand(Src, 1), Builder, VMap);
- Dst = LLVMBuildAdd(Builder, LHS, RHS, Name);
- break;
- }
- case LLVMSub: {
- LLVMValueRef LHS = clone_value(LLVMGetOperand(Src, 0), Builder, VMap);
- LLVMValueRef RHS = clone_value(LLVMGetOperand(Src, 1), Builder, VMap);
- Dst = LLVMBuildSub(Builder, LHS, RHS, Name);
- break;
- }
- case LLVMMul: {
- LLVMValueRef LHS = clone_value(LLVMGetOperand(Src, 0), Builder, VMap);
- LLVMValueRef RHS = clone_value(LLVMGetOperand(Src, 1), Builder, VMap);
- Dst = LLVMBuildMul(Builder, LHS, RHS, Name);
- break;
- }
- case LLVMUDiv: {
- LLVMValueRef LHS = clone_value(LLVMGetOperand(Src, 0), Builder, VMap);
- LLVMValueRef RHS = clone_value(LLVMGetOperand(Src, 1), Builder, VMap);
- Dst = LLVMBuildUDiv(Builder, LHS, RHS, Name);
- break;
- }
- case LLVMSDiv: {
- LLVMValueRef LHS = clone_value(LLVMGetOperand(Src, 0), Builder, VMap);
- LLVMValueRef RHS = clone_value(LLVMGetOperand(Src, 1), Builder, VMap);
- Dst = LLVMBuildSDiv(Builder, LHS, RHS, Name);
- break;
- }
- case LLVMURem: {
- LLVMValueRef LHS = clone_value(LLVMGetOperand(Src, 0), Builder, VMap);
- LLVMValueRef RHS = clone_value(LLVMGetOperand(Src, 1), Builder, VMap);
- Dst = LLVMBuildURem(Builder, LHS, RHS, Name);
- break;
- }
- case LLVMSRem: {
- LLVMValueRef LHS = clone_value(LLVMGetOperand(Src, 0), Builder, VMap);
- LLVMValueRef RHS = clone_value(LLVMGetOperand(Src, 1), Builder, VMap);
- Dst = LLVMBuildSRem(Builder, LHS, RHS, Name);
- break;
- }
- case LLVMShl: {
- LLVMValueRef LHS = clone_value(LLVMGetOperand(Src, 0), Builder, VMap);
- LLVMValueRef RHS = clone_value(LLVMGetOperand(Src, 1), Builder, VMap);
- Dst = LLVMBuildShl(Builder, LHS, RHS, Name);
- break;
- }
- case LLVMLShr: {
- LLVMValueRef LHS = clone_value(LLVMGetOperand(Src, 0), Builder, VMap);
- LLVMValueRef RHS = clone_value(LLVMGetOperand(Src, 1), Builder, VMap);
- Dst = LLVMBuildLShr(Builder, LHS, RHS, Name);
- break;
- }
- case LLVMAShr: {
- LLVMValueRef LHS = clone_value(LLVMGetOperand(Src, 0), Builder, VMap);
- LLVMValueRef RHS = clone_value(LLVMGetOperand(Src, 1), Builder, VMap);
- Dst = LLVMBuildAShr(Builder, LHS, RHS, Name);
- break;
- }
- case LLVMAnd: {
- LLVMValueRef LHS = clone_value(LLVMGetOperand(Src, 0), Builder, VMap);
- LLVMValueRef RHS = clone_value(LLVMGetOperand(Src, 1), Builder, VMap);
- Dst = LLVMBuildAnd(Builder, LHS, RHS, Name);
- break;
- }
- case LLVMOr: {
- LLVMValueRef LHS = clone_value(LLVMGetOperand(Src, 0), Builder, VMap);
- LLVMValueRef RHS = clone_value(LLVMGetOperand(Src, 1), Builder, VMap);
- Dst = LLVMBuildOr(Builder, LHS, RHS, Name);
- break;
- }
- case LLVMXor: {
- LLVMValueRef LHS = clone_value(LLVMGetOperand(Src, 0), Builder, VMap);
- LLVMValueRef RHS = clone_value(LLVMGetOperand(Src, 1), Builder, VMap);
- Dst = LLVMBuildXor(Builder, LHS, RHS, Name);
- break;
- }
- case LLVMAlloca: {
- LLVMTypeRef Ty = LLVMGetElementType(LLVMTypeOf(Src));
- Dst = LLVMBuildAlloca(Builder, Ty, Name);
- break;
+ // Try literal
+ LLVMContextRef Ctx = LLVMGetModuleContext(M);
+ return clone_literal(Src, Ctx);
+ }
+
+ // Try undef
+ if (LLVMIsUndef(Src)) {
+ LLVMContextRef Ctx = LLVMGetModuleContext(get_module(Builder));
+ LLVMTypeRef Ty = clone_type(LLVMTypeOf(Src), Ctx);
+ return LLVMGetUndef(Ty);
+ }
+
+ // Check if this is something we already computed.
+ {
+ auto i = VMap.find(Src);
+ if (i != VMap.end())
+ return i->second;
+ }
+
+ // We tried everything, it must be an instruction
+ // that hasn't been generated already.
+ LLVMValueRef Dst = nullptr;
+
+ LLVMOpcode Op = LLVMGetInstructionOpcode(Src);
+ switch(Op) {
+ case LLVMRet: {
+ int OpCount = LLVMGetNumOperands(Src);
+ if (OpCount == 0)
+ Dst = LLVMBuildRetVoid(Builder);
+ else
+ Dst = LLVMBuildRet(Builder, CloneValue(LLVMGetOperand(Src, 0),
+ Builder));
+ break;
+ }
+ case LLVMBr: {
+ LLVMBasicBlockRef SrcBB = LLVMValueAsBasicBlock(LLVMGetOperand(Src, 0));
+ Dst = LLVMBuildBr(Builder, DeclareBB(SrcBB));
+ break;
+ }
+ case LLVMSwitch:
+ case LLVMIndirectBr:
+ case LLVMInvoke:
+ break;
+ case LLVMUnreachable:
+ Dst = LLVMBuildUnreachable(Builder);
+ break;
+ case LLVMAdd: {
+ LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0), Builder);
+ LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1), Builder);
+ Dst = LLVMBuildAdd(Builder, LHS, RHS, Name);
+ break;
+ }
+ case LLVMSub: {
+ LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0), Builder);
+ LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1), Builder);
+ Dst = LLVMBuildSub(Builder, LHS, RHS, Name);
+ break;
+ }
+ case LLVMMul: {
+ LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0), Builder);
+ LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1), Builder);
+ Dst = LLVMBuildMul(Builder, LHS, RHS, Name);
+ break;
+ }
+ case LLVMUDiv: {
+ LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0), Builder);
+ LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1), Builder);
+ Dst = LLVMBuildUDiv(Builder, LHS, RHS, Name);
+ break;
+ }
+ case LLVMSDiv: {
+ LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0), Builder);
+ LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1), Builder);
+ Dst = LLVMBuildSDiv(Builder, LHS, RHS, Name);
+ break;
+ }
+ case LLVMURem: {
+ LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0), Builder);
+ LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1), Builder);
+ Dst = LLVMBuildURem(Builder, LHS, RHS, Name);
+ break;
+ }
+ case LLVMSRem: {
+ LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0), Builder);
+ LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1), Builder);
+ Dst = LLVMBuildSRem(Builder, LHS, RHS, Name);
+ break;
+ }
+ case LLVMShl: {
+ LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0), Builder);
+ LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1), Builder);
+ Dst = LLVMBuildShl(Builder, LHS, RHS, Name);
+ break;
+ }
+ case LLVMLShr: {
+ LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0), Builder);
+ LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1), Builder);
+ Dst = LLVMBuildLShr(Builder, LHS, RHS, Name);
+ break;
+ }
+ case LLVMAShr: {
+ LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0), Builder);
+ LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1), Builder);
+ Dst = LLVMBuildAShr(Builder, LHS, RHS, Name);
+ break;
+ }
+ case LLVMAnd: {
+ LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0), Builder);
+ LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1), Builder);
+ Dst = LLVMBuildAnd(Builder, LHS, RHS, Name);
+ break;
+ }
+ case LLVMOr: {
+ LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0), Builder);
+ LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1), Builder);
+ Dst = LLVMBuildOr(Builder, LHS, RHS, Name);
+ break;
+ }
+ case LLVMXor: {
+ LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0), Builder);
+ LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1), Builder);
+ Dst = LLVMBuildXor(Builder, LHS, RHS, Name);
+ break;
+ }
+ case LLVMAlloca: {
+ LLVMTypeRef Ty = LLVMGetElementType(LLVMTypeOf(Src));
+ Dst = LLVMBuildAlloca(Builder, Ty, Name);
+ break;
+ }
+ case LLVMCall: {
+ int ArgCount = LLVMGetNumOperands(Src) - 1;
+ SmallVector<LLVMValueRef, 8> Args;
+ for (int i = 0; i < ArgCount; i++)
+ Args.push_back(CloneValue(LLVMGetOperand(Src, i), Builder));
+ LLVMValueRef Fn = CloneValue(LLVMGetOperand(Src, ArgCount), Builder);
+ Dst = LLVMBuildCall(Builder, Fn, Args.data(), ArgCount, Name);
+ break;
+ }
+ default:
+ break;
}
- case LLVMCall: {
- int ArgCount = LLVMGetNumOperands(Src) - 1;
- SmallVector<LLVMValueRef, 8> Args;
- for (int i = 0; i < ArgCount; i++)
- Args.push_back(clone_value(LLVMGetOperand(Src, i), Builder, VMap));
- LLVMValueRef Fn = clone_value(LLVMGetOperand(Src, ArgCount), Builder, VMap);
- Dst = LLVMBuildCall(Builder, Fn, Args.data(), ArgCount, Name);
- break;
+
+ if (Dst == nullptr) {
+ fprintf(stderr, "%d is not a supported opcode\n", Op);
+ exit(-1);
}
- default:
- break;
- }
- if (Dst == nullptr) {
- fprintf(stderr, "%d is not a supported opcode\n", Op);
- exit(-1);
+ return VMap[Src] = Dst;
}
- return VMap[Src] = Dst;
-}
+ LLVMBasicBlockRef DeclareBB(LLVMBasicBlockRef Src) {
+ // Check if this is something we already computed.
+ {
+ auto i = BBMap.find(Src);
+ if (i != BBMap.end()) {
+ return i->second;
+ }
+ }
-static LLVMBasicBlockRef clone_bb(LLVMBasicBlockRef Src, LLVMValueRef Dst, ValueMap &VMap) {
- LLVMBasicBlockRef BB = LLVMAppendBasicBlock(Dst, "");
+ const char *Name = LLVMGetBasicBlockName(Src);
- LLVMValueRef First = LLVMGetFirstInstruction(Src);
- LLVMValueRef Last = LLVMGetLastInstruction(Src);
+ LLVMValueRef V = LLVMBasicBlockAsValue(Src);
+ if (!LLVMValueIsBasicBlock(V) || LLVMValueAsBasicBlock(V) != Src)
+ report_fatal_error("Basic block is not a basic block\n");
- if (First == nullptr) {
- if (Last != nullptr) {
- fprintf(stderr, "Has no first instruction, but last one\n");
- exit(-1);
- }
+ const char *VName = LLVMGetValueName(V);
+ if (Name != VName)
+ report_fatal_error("Basic block name mismatch");
- return BB;
+ LLVMBasicBlockRef BB = LLVMAppendBasicBlock(Fun, Name);
+ return BBMap[Src] = BB;
}
- LLVMContextRef Ctx = LLVMGetModuleContext(LLVMGetGlobalParent(Dst));
- LLVMBuilderRef Builder = LLVMCreateBuilderInContext(Ctx);
- LLVMPositionBuilderAtEnd(Builder, BB);
-
- LLVMValueRef Cur = First;
- LLVMValueRef Next = nullptr;
- while(true) {
- clone_value(Cur, Builder, VMap);
- Next = LLVMGetNextInstruction(Cur);
- if (Next == nullptr) {
- if (Cur != Last) {
- fprintf(stderr, "Final instruction does not match Last\n");
+ LLVMBasicBlockRef CloneBB(LLVMBasicBlockRef Src) {
+ LLVMBasicBlockRef BB = DeclareBB(Src);
+
+ // Make sure ordering is correct.
+ LLVMBasicBlockRef Prev = LLVMGetPreviousBasicBlock(Src);
+ if (Prev)
+ LLVMMoveBasicBlockAfter(BB, DeclareBB(Prev));
+
+ LLVMValueRef First = LLVMGetFirstInstruction(Src);
+ LLVMValueRef Last = LLVMGetLastInstruction(Src);
+
+ if (First == nullptr) {
+ if (Last != nullptr) {
+ fprintf(stderr, "Has no first instruction, but last one\n");
exit(-1);
}
- break;
+ return BB;
}
- LLVMValueRef Prev = LLVMGetPreviousInstruction(Next);
- if (Prev != Cur) {
- fprintf(stderr, "Next.Previous instruction is not Current\n");
- exit(-1);
+ LLVMContextRef Ctx = LLVMGetModuleContext(LLVMGetGlobalParent(Fun));
+ LLVMBuilderRef Builder = LLVMCreateBuilderInContext(Ctx);
+ LLVMPositionBuilderAtEnd(Builder, BB);
+
+ LLVMValueRef Cur = First;
+ LLVMValueRef Next = nullptr;
+ while(true) {
+ CloneValue(Cur, Builder);
+ Next = LLVMGetNextInstruction(Cur);
+ if (Next == nullptr) {
+ if (Cur != Last) {
+ fprintf(stderr, "Final instruction does not match Last\n");
+ exit(-1);
+ }
+
+ break;
+ }
+
+ LLVMValueRef Prev = LLVMGetPreviousInstruction(Next);
+ if (Prev != Cur) {
+ fprintf(stderr, "Next.Previous instruction is not Current\n");
+ exit(-1);
+ }
+
+ Cur = Next;
}
- Cur = Next;
+ LLVMDisposeBuilder(Builder);
+ return BB;
}
- LLVMDisposeBuilder(Builder);
- return BB;
-}
-
-static void clone_bbs(LLVMValueRef Src, LLVMValueRef Dst, ValueMap &VMap) {
- unsigned Count = LLVMCountBasicBlocks(Src);
- if (Count == 0)
- return;
+ void CloneBBs(LLVMValueRef Src) {
+ unsigned Count = LLVMCountBasicBlocks(Src);
+ if (Count == 0)
+ return;
+
+ LLVMBasicBlockRef First = LLVMGetFirstBasicBlock(Src);
+ LLVMBasicBlockRef Last = LLVMGetLastBasicBlock(Src);
+
+ LLVMBasicBlockRef Cur = First;
+ LLVMBasicBlockRef Next = nullptr;
+ while(true) {
+ CloneBB(Cur);
+ Count--;
+ Next = LLVMGetNextBasicBlock(Cur);
+ if (Next == nullptr) {
+ if (Cur != Last) {
+ fprintf(stderr, "Final basic block does not match Last\n");
+ exit(-1);
+ }
- LLVMBasicBlockRef First = LLVMGetFirstBasicBlock(Src);
- LLVMBasicBlockRef Last = LLVMGetLastBasicBlock(Src);
+ break;
+ }
- LLVMBasicBlockRef Cur = First;
- LLVMBasicBlockRef Next = nullptr;
- while(true) {
- clone_bb(Cur, Dst, VMap);
- Count--;
- Next = LLVMGetNextBasicBlock(Cur);
- if (Next == nullptr) {
- if (Cur != Last) {
- fprintf(stderr, "Final basic block does not match Last\n");
+ LLVMBasicBlockRef Prev = LLVMGetPreviousBasicBlock(Next);
+ if (Prev != Cur) {
+ fprintf(stderr, "Next.Previous basic bloc is not Current\n");
exit(-1);
}
- break;
+ Cur = Next;
}
- LLVMBasicBlockRef Prev = LLVMGetPreviousBasicBlock(Next);
- if (Prev != Cur) {
- fprintf(stderr, "Next.Previous basic bloc is not Current\n");
+ if (Count != 0) {
+ fprintf(stderr, "Basic block count does not match iterration\n");
exit(-1);
}
-
- Cur = Next;
- }
-
- if (Count != 0) {
- fprintf(stderr, "Basic block count does not match iterration\n");
- exit(-1);
}
-}
+};
static ValueMap clone_params(LLVMValueRef Src, LLVMValueRef Dst) {
unsigned Count = LLVMCountParams(Src);
@@ -485,9 +532,8 @@ static LLVMValueRef clone_function(LLVMV
LLVMTypeRef FunTy = LLVMGetElementType(DstTy);
Fun = LLVMAddFunction(Dst, Name, FunTy);
-
- ValueMap VMap = clone_params(Src, Fun);
- clone_bbs(Src, Fun, VMap);
+ FunCloner FC(Src, Fun);
+ FC.CloneBBs(Src);
return Fun;
}
More information about the llvm-commits
mailing list