From: Amaury Sechet Date: Tue, 16 Feb 2016 07:08:49 +0000 (+0000) Subject: Generate functions in 2 steps in the C API echo test. NFC X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f64e834f63fdf1a4a4f316dcef73a7acd14c4e38;p=platform%2Fupstream%2Fllvm.git Generate functions in 2 steps in the C API echo test. NFC llvm-svn: 260939 --- diff --git a/llvm/tools/llvm-c-test/echo.cpp b/llvm/tools/llvm-c-test/echo.cpp index 774e339..9dd9b10 100644 --- a/llvm/tools/llvm-c-test/echo.cpp +++ b/llvm/tools/llvm-c-test/echo.cpp @@ -585,27 +585,53 @@ struct FunCloner { } }; -static LLVMValueRef clone_function(LLVMValueRef Src, LLVMModuleRef M) { +static void clone_function(LLVMValueRef Src, LLVMModuleRef M) { const char *Name = LLVMGetValueName(Src); LLVMValueRef Fun = LLVMGetNamedFunction(M, Name); - if (Fun != nullptr) - return Fun; + if (!Fun) + report_fatal_error("Function must have been declared already"); - LLVMTypeRef FunTy = LLVMGetElementType(TypeCloner(M).Clone(Src)); - Fun = LLVMAddFunction(M, Name, FunTy); FunCloner FC(Src, Fun); FC.CloneBBs(Src); +} + +static void declare_function(LLVMValueRef Src, LLVMModuleRef M) { + const char *Name = LLVMGetValueName(Src); + LLVMValueRef Fun = LLVMGetNamedFunction(M, Name); + if (Fun != nullptr) + report_fatal_error("Function already cloned"); - return Fun; + LLVMTypeRef FunTy = LLVMGetElementType(TypeCloner(M).Clone(Src)); + LLVMAddFunction(M, Name, FunTy); } static void clone_functions(LLVMModuleRef Src, LLVMModuleRef Dst) { LLVMValueRef Begin = LLVMGetFirstFunction(Src); LLVMValueRef End = LLVMGetLastFunction(Src); + // First pass, we declare all function LLVMValueRef Cur = Begin; LLVMValueRef Next = nullptr; while (true) { + declare_function(Cur, Dst); + Next = LLVMGetNextFunction(Cur); + if (Next == nullptr) { + if (Cur != End) + report_fatal_error("Last function does not match End"); + break; + } + + LLVMValueRef Prev = LLVMGetPreviousFunction(Next); + if (Prev != Cur) + report_fatal_error("Next.Previous function is not Current"); + + Cur = Next; + } + + // Second pass, we define them + Cur = Begin; + Next = nullptr; + while (true) { clone_function(Cur, Dst); Next = LLVMGetNextFunction(Cur); if (Next == nullptr) {