diff options
Diffstat (limited to 'gnu/llvm/tools/llvm-c-test')
| -rw-r--r-- | gnu/llvm/tools/llvm-c-test/CMakeLists.txt | 56 | ||||
| -rw-r--r-- | gnu/llvm/tools/llvm-c-test/attributes.c | 80 | ||||
| -rw-r--r-- | gnu/llvm/tools/llvm-c-test/calc.c | 147 | ||||
| -rw-r--r-- | gnu/llvm/tools/llvm-c-test/debuginfo.c | 183 | ||||
| -rw-r--r-- | gnu/llvm/tools/llvm-c-test/diagnostic.c | 89 | ||||
| -rw-r--r-- | gnu/llvm/tools/llvm-c-test/disassemble.c | 94 | ||||
| -rw-r--r-- | gnu/llvm/tools/llvm-c-test/echo.cpp | 1227 | ||||
| -rw-r--r-- | gnu/llvm/tools/llvm-c-test/helpers.c | 39 | ||||
| -rw-r--r-- | gnu/llvm/tools/llvm-c-test/include-all.c | 33 | ||||
| -rw-r--r-- | gnu/llvm/tools/llvm-c-test/llvm-c-test.h | 66 | ||||
| -rw-r--r-- | gnu/llvm/tools/llvm-c-test/main.c | 107 | ||||
| -rw-r--r-- | gnu/llvm/tools/llvm-c-test/metadata.c | 42 | ||||
| -rw-r--r-- | gnu/llvm/tools/llvm-c-test/module.c | 138 | ||||
| -rw-r--r-- | gnu/llvm/tools/llvm-c-test/object.c | 87 | ||||
| -rw-r--r-- | gnu/llvm/tools/llvm-c-test/targets.c | 30 |
15 files changed, 0 insertions, 2418 deletions
diff --git a/gnu/llvm/tools/llvm-c-test/CMakeLists.txt b/gnu/llvm/tools/llvm-c-test/CMakeLists.txt deleted file mode 100644 index bce0f4a5a42..00000000000 --- a/gnu/llvm/tools/llvm-c-test/CMakeLists.txt +++ /dev/null @@ -1,56 +0,0 @@ -set(LLVM_LINK_COMPONENTS - ${LLVM_TARGETS_TO_BUILD} - BitReader - Core - MCDisassembler - Object - Support - Target - ) - -# We should only have llvm-c-test use libLLVM if libLLVM is built with the -# default list of components. Using libLLVM with custom components can result in -# build failures. - -set (USE_LLVM_DYLIB FALSE) - -if (TARGET LLVM) - set (USE_LLVM_DYLIB TRUE) - if (DEFINED LLVM_DYLIB_COMPONENTS) - foreach(c in ${LLVM_LINK_COMPONENTS}) - list(FIND LLVM_DYLIB_COMPONENTS ${c} C_IDX) - if (C_IDX EQUAL -1) - set(USE_LLVM_DYLIB FALSE) - break() - endif() - endforeach() - endif() -endif() - -if(USE_LLVM_DYLIB) - set(LLVM_LINK_COMPONENTS) -endif() - -if (LLVM_COMPILER_IS_GCC_COMPATIBLE) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 -Wstrict-prototypes") -endif () - -add_llvm_tool(llvm-c-test - attributes.c - calc.c - debuginfo.c - diagnostic.c - disassemble.c - echo.cpp - helpers.c - include-all.c - main.c - module.c - metadata.c - object.c - targets.c - ) - -if(USE_LLVM_DYLIB) - target_link_libraries(llvm-c-test LLVM) -endif() diff --git a/gnu/llvm/tools/llvm-c-test/attributes.c b/gnu/llvm/tools/llvm-c-test/attributes.c deleted file mode 100644 index c7bc0d3c87b..00000000000 --- a/gnu/llvm/tools/llvm-c-test/attributes.c +++ /dev/null @@ -1,80 +0,0 @@ -/*===-- attributes.c - tool for testing libLLVM and llvm-c API ------------===*\ -|* *| -|* The LLVM Compiler Infrastructure *| -|* *| -|* This file is distributed under the University of Illinois Open Source *| -|* License. See LICENSE.TXT for details. *| -|* *| -|*===----------------------------------------------------------------------===*| -|* *| -|* This file implements the --test-attributes and --test-callsite-attributes *| -|* commands in llvm-c-test. *| -|* *| -\*===----------------------------------------------------------------------===*/ - -#include "llvm-c-test.h" - -#include <assert.h> -#include <stdlib.h> - -int llvm_test_function_attributes(void) { - LLVMEnablePrettyStackTrace(); - - LLVMModuleRef M = llvm_load_module(false, true); - - LLVMValueRef F = LLVMGetFirstFunction(M); - while (F) { - // Read attributes - int Idx, ParamCount; - for (Idx = LLVMAttributeFunctionIndex, ParamCount = LLVMCountParams(F); - Idx <= ParamCount; ++Idx) { - int AttrCount = LLVMGetAttributeCountAtIndex(F, Idx); - LLVMAttributeRef *Attrs = - (LLVMAttributeRef *)malloc(AttrCount * sizeof(LLVMAttributeRef)); - assert(Attrs); - LLVMGetAttributesAtIndex(F, Idx, Attrs); - free(Attrs); - } - F = LLVMGetNextFunction(F); - } - - LLVMDisposeModule(M); - - return 0; -} - -int llvm_test_callsite_attributes(void) { - LLVMEnablePrettyStackTrace(); - - LLVMModuleRef M = llvm_load_module(false, true); - - LLVMValueRef F = LLVMGetFirstFunction(M); - while (F) { - LLVMBasicBlockRef BB; - for (BB = LLVMGetFirstBasicBlock(F); BB; BB = LLVMGetNextBasicBlock(BB)) { - LLVMValueRef I; - for (I = LLVMGetFirstInstruction(BB); I; I = LLVMGetNextInstruction(I)) { - if (LLVMIsACallInst(I)) { - // Read attributes - int Idx, ParamCount; - for (Idx = LLVMAttributeFunctionIndex, - ParamCount = LLVMCountParams(F); - Idx <= ParamCount; ++Idx) { - int AttrCount = LLVMGetCallSiteAttributeCount(I, Idx); - LLVMAttributeRef *Attrs = (LLVMAttributeRef *)malloc( - AttrCount * sizeof(LLVMAttributeRef)); - assert(Attrs); - LLVMGetCallSiteAttributes(I, Idx, Attrs); - free(Attrs); - } - } - } - } - - F = LLVMGetNextFunction(F); - } - - LLVMDisposeModule(M); - - return 0; -} diff --git a/gnu/llvm/tools/llvm-c-test/calc.c b/gnu/llvm/tools/llvm-c-test/calc.c deleted file mode 100644 index 4c273cbf70a..00000000000 --- a/gnu/llvm/tools/llvm-c-test/calc.c +++ /dev/null @@ -1,147 +0,0 @@ -/*===-- calc.c - tool for testing libLLVM and llvm-c API ------------------===*\ -|* *| -|* The LLVM Compiler Infrastructure *| -|* *| -|* This file is distributed under the University of Illinois Open Source *| -|* License. See LICENSE.TXT for details. *| -|* *| -|*===----------------------------------------------------------------------===*| -|* *| -|* This file implements the --calc command in llvm-c-test. --calc reads lines *| -|* from stdin, parses them as a name and an expression in reverse polish *| -|* notation and prints a module with a function with the expression. *| -|* *| -\*===----------------------------------------------------------------------===*/ - -#include "llvm-c-test.h" -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <assert.h> - -typedef LLVMValueRef (*binop_func_t)(LLVMBuilderRef, LLVMValueRef LHS, - LLVMValueRef RHS, const char *Name); - -static LLVMOpcode op_to_opcode(char op) { - switch (op) { - case '+': return LLVMAdd; - case '-': return LLVMSub; - case '*': return LLVMMul; - case '/': return LLVMSDiv; - case '&': return LLVMAnd; - case '|': return LLVMOr; - case '^': return LLVMXor; - } - assert(0 && "unknown operation"); - return 0; -} - -#define MAX_DEPTH 32 - -static LLVMValueRef build_from_tokens(char **tokens, int ntokens, - LLVMBuilderRef builder, - LLVMValueRef param) { - LLVMValueRef stack[MAX_DEPTH]; - int depth = 0; - int i; - - for (i = 0; i < ntokens; i++) { - char tok = tokens[i][0]; - switch (tok) { - case '+': - case '-': - case '*': - case '/': - case '&': - case '|': - case '^': - if (depth < 2) { - printf("stack underflow\n"); - return NULL; - } - - stack[depth - 2] = LLVMBuildBinOp(builder, op_to_opcode(tok), - stack[depth - 1], stack[depth - 2], ""); - depth--; - - break; - - case '@': { - LLVMValueRef off; - - if (depth < 1) { - printf("stack underflow\n"); - return NULL; - } - - off = LLVMBuildGEP(builder, param, &stack[depth - 1], 1, ""); - stack[depth - 1] = LLVMBuildLoad(builder, off, ""); - - break; - } - - default: { - char *end; - long val = strtol(tokens[i], &end, 0); - if (end[0] != '\0') { - printf("error parsing number\n"); - return NULL; - } - - if (depth >= MAX_DEPTH) { - printf("stack overflow\n"); - return NULL; - } - - stack[depth++] = LLVMConstInt(LLVMInt64Type(), val, 1); - break; - } - } - } - - if (depth < 1) { - printf("stack underflow at return\n"); - return NULL; - } - - LLVMBuildRet(builder, stack[depth - 1]); - - return stack[depth - 1]; -} - -static void handle_line(char **tokens, int ntokens) { - char *name = tokens[0]; - LLVMValueRef param; - LLVMValueRef res; - - LLVMModuleRef M = LLVMModuleCreateWithName(name); - - LLVMTypeRef I64ty = LLVMInt64Type(); - LLVMTypeRef I64Ptrty = LLVMPointerType(I64ty, 0); - LLVMTypeRef Fty = LLVMFunctionType(I64ty, &I64Ptrty, 1, 0); - - LLVMValueRef F = LLVMAddFunction(M, name, Fty); - LLVMBuilderRef builder = LLVMCreateBuilder(); - LLVMPositionBuilderAtEnd(builder, LLVMAppendBasicBlock(F, "entry")); - - LLVMGetParams(F, ¶m); - LLVMSetValueName(param, "in"); - - res = build_from_tokens(tokens + 1, ntokens - 1, builder, param); - if (res) { - char *irstr = LLVMPrintModuleToString(M); - puts(irstr); - LLVMDisposeMessage(irstr); - } - - LLVMDisposeBuilder(builder); - - LLVMDisposeModule(M); -} - -int llvm_calc(void) { - - llvm_tokenize_stdin(handle_line); - - return 0; -} diff --git a/gnu/llvm/tools/llvm-c-test/debuginfo.c b/gnu/llvm/tools/llvm-c-test/debuginfo.c deleted file mode 100644 index fbd41e97d7a..00000000000 --- a/gnu/llvm/tools/llvm-c-test/debuginfo.c +++ /dev/null @@ -1,183 +0,0 @@ -/*===-- debuginfo.c - tool for testing libLLVM and llvm-c API -------------===*\ -|* *| -|* The LLVM Compiler Infrastructure *| -|* *| -|* This file is distributed under the University of Illinois Open Source *| -|* License. See LICENSE.TXT for details. *| -|* *| -|*===----------------------------------------------------------------------===*| -|* *| -|* Tests for the LLVM C DebugInfo API *| -|* *| -\*===----------------------------------------------------------------------===*/ - -#include "llvm-c-test.h" -#include "llvm-c/Core.h" -#include "llvm-c/DebugInfo.h" -#include <stdio.h> -#include <string.h> - -static LLVMMetadataRef -declare_objc_class(LLVMDIBuilderRef DIB, LLVMMetadataRef File) { - LLVMMetadataRef Decl = LLVMDIBuilderCreateStructType(DIB, File, "TestClass", 9, File, 42, 64, 0, LLVMDIFlagObjcClassComplete, NULL, NULL, 0, 0, NULL, NULL, 0); - LLVMMetadataRef SuperDecl = LLVMDIBuilderCreateStructType(DIB, File, "TestSuperClass", 14, File, 42, 64, 0, LLVMDIFlagObjcClassComplete, NULL, NULL, 0, 0, NULL, NULL, 0); - LLVMDIBuilderCreateInheritance(DIB, Decl, SuperDecl, 0, 0, 0); - LLVMMetadataRef TestProperty = - LLVMDIBuilderCreateObjCProperty(DIB, "test", 4, File, 42, "getTest", 7, "setTest", 7, 0x20 /*copy*/ | 0x40 /*nonatomic*/, SuperDecl); - LLVMDIBuilderCreateObjCIVar(DIB, "_test", 5, File, 42, 64, 0, 64, LLVMDIFlagPublic, SuperDecl, TestProperty); - return Decl; -} - -int llvm_test_dibuilder(void) { - const char *Filename = "debuginfo.c"; - LLVMModuleRef M = LLVMModuleCreateWithName(Filename); - LLVMDIBuilderRef DIB = LLVMCreateDIBuilder(M); - - LLVMMetadataRef File = LLVMDIBuilderCreateFile(DIB, Filename, - strlen(Filename), ".", 1); - - LLVMMetadataRef CompileUnit = LLVMDIBuilderCreateCompileUnit(DIB, - LLVMDWARFSourceLanguageC, File, "llvm-c-test", 11, 0, NULL, 0, 0, - NULL, 0, LLVMDWARFEmissionFull, 0, 0, 0); - - LLVMMetadataRef Module = - LLVMDIBuilderCreateModule(DIB, CompileUnit, - "llvm-c-test", 11, - "", 0, - "/test/include/llvm-c-test.h", 27, - "", 0); - - LLVMMetadataRef OtherModule = - LLVMDIBuilderCreateModule(DIB, CompileUnit, - "llvm-c-test-import", 18, - "", 0, - "/test/include/llvm-c-test-import.h", 34, - "", 0); - LLVMMetadataRef ImportedModule = - LLVMDIBuilderCreateImportedModuleFromModule(DIB, Module, OtherModule, - File, 42); - LLVMDIBuilderCreateImportedModuleFromAlias(DIB, Module, ImportedModule, - File, 42); - - LLVMMetadataRef ClassTy = declare_objc_class(DIB, File); - LLVMMetadataRef GlobalClassValueExpr = - LLVMDIBuilderCreateConstantValueExpression(DIB, 0); - LLVMDIBuilderCreateGlobalVariableExpression( - DIB, Module, "globalClass", 11, "", 0, File, 1, ClassTy, true, - GlobalClassValueExpr, NULL, 0); - - LLVMMetadataRef Int64Ty = - LLVMDIBuilderCreateBasicType(DIB, "Int64", 5, 64, 0, LLVMDIFlagZero); - LLVMMetadataRef Int64TypeDef = - LLVMDIBuilderCreateTypedef(DIB, Int64Ty, "int64_t", 7, File, 42, File); - - LLVMMetadataRef GlobalVarValueExpr = - LLVMDIBuilderCreateConstantValueExpression(DIB, 0); - LLVMDIBuilderCreateGlobalVariableExpression( - DIB, Module, "global", 6, "", 0, File, 1, Int64TypeDef, true, - GlobalVarValueExpr, NULL, 0); - - LLVMMetadataRef NameSpace = - LLVMDIBuilderCreateNameSpace(DIB, Module, "NameSpace", 9, false); - - LLVMMetadataRef StructDbgElts[] = {Int64Ty, Int64Ty, Int64Ty}; - LLVMMetadataRef StructDbgTy = - LLVMDIBuilderCreateStructType(DIB, NameSpace, "MyStruct", - 8, File, 0, 192, 0, 0, NULL, StructDbgElts, 3, - LLVMDWARFSourceLanguageC, NULL, "MyStruct", 8); - - LLVMMetadataRef StructDbgPtrTy = - LLVMDIBuilderCreatePointerType(DIB, StructDbgTy, 192, 0, 0, "", 0); - - LLVMAddNamedMetadataOperand(M, "FooType", - LLVMMetadataAsValue(LLVMGetModuleContext(M), StructDbgPtrTy)); - - - LLVMTypeRef FooParamTys[] = { - LLVMInt64Type(), - LLVMInt64Type(), - LLVMVectorType(LLVMInt64Type(), 10), - }; - LLVMTypeRef FooFuncTy = LLVMFunctionType(LLVMInt64Type(), FooParamTys, 3, 0); - LLVMValueRef FooFunction = LLVMAddFunction(M, "foo", FooFuncTy); - LLVMBasicBlockRef FooEntryBlock = LLVMAppendBasicBlock(FooFunction, "entry"); - - LLVMMetadataRef Subscripts[] = { - LLVMDIBuilderGetOrCreateSubrange(DIB, 0, 10), - }; - LLVMMetadataRef VectorTy = - LLVMDIBuilderCreateVectorType(DIB, 64 * 10, 0, - Int64Ty, Subscripts, 1); - - - LLVMMetadataRef ParamTypes[] = {Int64Ty, Int64Ty, VectorTy}; - LLVMMetadataRef FunctionTy = - LLVMDIBuilderCreateSubroutineType(DIB, File, ParamTypes, 3, 0); - - LLVMMetadataRef ReplaceableFunctionMetadata = - LLVMDIBuilderCreateReplaceableCompositeType(DIB, 0x15, "foo", 3, - File, File, 42, - 0, 0, 0, - LLVMDIFlagFwdDecl, - "", 0); - - LLVMMetadataRef FooParamLocation = - LLVMDIBuilderCreateDebugLocation(LLVMGetGlobalContext(), 42, 0, - ReplaceableFunctionMetadata, NULL); - LLVMMetadataRef FunctionMetadata = - LLVMDIBuilderCreateFunction(DIB, File, "foo", 3, "foo", 3, - File, 42, FunctionTy, true, true, - 42, 0, false); - LLVMMetadataReplaceAllUsesWith(ReplaceableFunctionMetadata, FunctionMetadata); - - LLVMMetadataRef FooParamExpression = - LLVMDIBuilderCreateExpression(DIB, NULL, 0); - LLVMMetadataRef FooParamVar1 = - LLVMDIBuilderCreateParameterVariable(DIB, FunctionMetadata, "a", 1, 1, File, - 42, Int64Ty, true, 0); - LLVMDIBuilderInsertDeclareAtEnd(DIB, LLVMConstInt(LLVMInt64Type(), 0, false), - FooParamVar1, FooParamExpression, - FooParamLocation, FooEntryBlock); - LLVMMetadataRef FooParamVar2 = - LLVMDIBuilderCreateParameterVariable(DIB, FunctionMetadata, "b", 1, 2, File, - 42, Int64Ty, true, 0); - LLVMDIBuilderInsertDeclareAtEnd(DIB, LLVMConstInt(LLVMInt64Type(), 0, false), - FooParamVar2, FooParamExpression, - FooParamLocation, FooEntryBlock); - LLVMMetadataRef FooParamVar3 = - LLVMDIBuilderCreateParameterVariable(DIB, FunctionMetadata, "c", 1, 3, File, - 42, VectorTy, true, 0); - LLVMDIBuilderInsertDeclareAtEnd(DIB, LLVMConstInt(LLVMInt64Type(), 0, false), - FooParamVar3, FooParamExpression, - FooParamLocation, FooEntryBlock); - - LLVMSetSubprogram(FooFunction, FunctionMetadata); - - LLVMMetadataRef FooLexicalBlock = - LLVMDIBuilderCreateLexicalBlock(DIB, FunctionMetadata, File, 42, 0); - - LLVMBasicBlockRef FooVarBlock = LLVMAppendBasicBlock(FooFunction, "vars"); - LLVMMetadataRef FooVarsLocation = - LLVMDIBuilderCreateDebugLocation(LLVMGetGlobalContext(), 43, 0, - FunctionMetadata, NULL); - LLVMMetadataRef FooVar1 = - LLVMDIBuilderCreateAutoVariable(DIB, FooLexicalBlock, "d", 1, File, - 43, Int64Ty, true, 0, 0); - LLVMValueRef FooVal1 = LLVMConstInt(LLVMInt64Type(), 0, false); - LLVMMetadataRef FooVarValueExpr = - LLVMDIBuilderCreateConstantValueExpression(DIB, 0); - - LLVMDIBuilderInsertDbgValueAtEnd(DIB, FooVal1, FooVar1, FooVarValueExpr, - FooVarsLocation, FooVarBlock); - - LLVMDIBuilderFinalize(DIB); - - char *MStr = LLVMPrintModuleToString(M); - puts(MStr); - LLVMDisposeMessage(MStr); - - LLVMDisposeDIBuilder(DIB); - LLVMDisposeModule(M); - - return 0; -} diff --git a/gnu/llvm/tools/llvm-c-test/diagnostic.c b/gnu/llvm/tools/llvm-c-test/diagnostic.c deleted file mode 100644 index 16d51747323..00000000000 --- a/gnu/llvm/tools/llvm-c-test/diagnostic.c +++ /dev/null @@ -1,89 +0,0 @@ -//===-- diagnostic.cpp - tool for testing libLLVM and llvm-c API ----------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the --test-diagnostic-handler command in llvm-c-test. -// -// This command uses the C API to read a module with a custom diagnostic -// handler set to test the diagnostic handler functionality. -// -//===----------------------------------------------------------------------===// - -#include "llvm-c-test.h" -#include "llvm-c/BitReader.h" -#include "llvm-c/Core.h" - -#include <stdio.h> - -static void diagnosticHandler(LLVMDiagnosticInfoRef DI, void *C) { - fprintf(stderr, "Executing diagnostic handler\n"); - - fprintf(stderr, "Diagnostic severity is of type "); - switch (LLVMGetDiagInfoSeverity(DI)) { - case LLVMDSError: - fprintf(stderr, "error"); - break; - case LLVMDSWarning: - fprintf(stderr, "warning"); - break; - case LLVMDSRemark: - fprintf(stderr, "remark"); - break; - case LLVMDSNote: - fprintf(stderr, "note"); - break; - } - fprintf(stderr, "\n"); - - (*(int *)C) = 1; -} - -static int handlerCalled = 0; - -int llvm_test_diagnostic_handler(void) { - LLVMContextRef C = LLVMGetGlobalContext(); - LLVMContextSetDiagnosticHandler(C, diagnosticHandler, &handlerCalled); - - if (LLVMContextGetDiagnosticHandler(C) != diagnosticHandler) { - fprintf(stderr, "LLVMContext{Set,Get}DiagnosticHandler failed\n"); - return 1; - } - - int *DC = (int *)LLVMContextGetDiagnosticContext(C); - if (DC != &handlerCalled || *DC) { - fprintf(stderr, "LLVMContextGetDiagnosticContext failed\n"); - return 1; - } - - LLVMMemoryBufferRef MB; - char *msg = NULL; - if (LLVMCreateMemoryBufferWithSTDIN(&MB, &msg)) { - fprintf(stderr, "Error reading file: %s\n", msg); - LLVMDisposeMessage(msg); - return 1; - } - - - LLVMModuleRef M; - int Ret = LLVMGetBitcodeModule2(MB, &M); - if (Ret) { - // We do not return if the bitcode was invalid, as we want to test whether - // the diagnostic handler was executed. - fprintf(stderr, "Error parsing bitcode: %s\n", msg); - } - - LLVMDisposeMemoryBuffer(MB); - - if (handlerCalled) { - fprintf(stderr, "Diagnostic handler was called while loading module\n"); - } else { - fprintf(stderr, "Diagnostic handler was not called while loading module\n"); - } - - return 0; -} diff --git a/gnu/llvm/tools/llvm-c-test/disassemble.c b/gnu/llvm/tools/llvm-c-test/disassemble.c deleted file mode 100644 index 7d6f1783aed..00000000000 --- a/gnu/llvm/tools/llvm-c-test/disassemble.c +++ /dev/null @@ -1,94 +0,0 @@ -/*===-- disassemble.c - tool for testing libLLVM and llvm-c API -----------===*\ -|* *| -|* The LLVM Compiler Infrastructure *| -|* *| -|* This file is distributed under the University of Illinois Open Source *| -|* License. See LICENSE.TXT for details. *| -|* *| -|*===----------------------------------------------------------------------===*| -|* *| -|* This file implements the --disassemble command in llvm-c-test. *| -|* --disassemble reads lines from stdin, parses them as a triple and hex *| -|* machine code, and prints disassembly of the machine code. *| -|* *| -\*===----------------------------------------------------------------------===*/ - -#include "llvm-c-test.h" -#include "llvm-c/Disassembler.h" -#include "llvm-c/Target.h" -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -static void pprint(int pos, unsigned char *buf, int len, const char *disasm) { - int i; - printf("%04x: ", pos); - for (i = 0; i < 8; i++) { - if (i < len) { - printf("%02x ", buf[i]); - } else { - printf(" "); - } - } - - printf(" %s\n", disasm); -} - -static void do_disassemble(const char *triple, const char *features, - unsigned char *buf, int siz) { - LLVMDisasmContextRef D = LLVMCreateDisasmCPUFeatures(triple, "", features, - NULL, 0, NULL, NULL); - char outline[1024]; - int pos; - - if (!D) { - printf("ERROR: Couldn't create disassembler for triple %s\n", triple); - return; - } - - pos = 0; - while (pos < siz) { - size_t l = LLVMDisasmInstruction(D, buf + pos, siz - pos, 0, outline, - sizeof(outline)); - if (!l) { - pprint(pos, buf + pos, 1, "\t???"); - pos++; - } else { - pprint(pos, buf + pos, l, outline); - pos += l; - } - } - - LLVMDisasmDispose(D); -} - -static void handle_line(char **tokens, int ntokens) { - unsigned char disbuf[128]; - size_t disbuflen = 0; - const char *triple = tokens[0]; - const char *features = tokens[1]; - int i; - - printf("triple: %s, features: %s\n", triple, features); - if (!strcmp(features, "NULL")) - features = ""; - - for (i = 2; i < ntokens; i++) { - disbuf[disbuflen++] = strtol(tokens[i], NULL, 16); - if (disbuflen >= sizeof(disbuf)) { - fprintf(stderr, "Warning: Too long line, truncating\n"); - break; - } - } - do_disassemble(triple, features, disbuf, disbuflen); -} - -int llvm_disassemble(void) { - LLVMInitializeAllTargetInfos(); - LLVMInitializeAllTargetMCs(); - LLVMInitializeAllDisassemblers(); - - llvm_tokenize_stdin(handle_line); - - return 0; -} diff --git a/gnu/llvm/tools/llvm-c-test/echo.cpp b/gnu/llvm/tools/llvm-c-test/echo.cpp deleted file mode 100644 index db926e8acea..00000000000 --- a/gnu/llvm/tools/llvm-c-test/echo.cpp +++ /dev/null @@ -1,1227 +0,0 @@ -//===-- echo.cpp - tool for testing libLLVM and llvm-c API ----------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the --echo command in llvm-c-test. -// -// This command uses the C API to read a module and output an exact copy of it -// as output. It is used to check that the resulting module matches the input -// to validate that the C API can read and write modules properly. -// -//===----------------------------------------------------------------------===// - -#include "llvm-c-test.h" -#include "llvm-c/DebugInfo.h" -#include "llvm-c/Target.h" -#include "llvm/ADT/DenseMap.h" -#include "llvm/Support/ErrorHandling.h" - -#include <stdio.h> -#include <stdlib.h> - -using namespace llvm; - -// Provide DenseMapInfo for C API opaque types. -template<typename T> -struct CAPIDenseMap {}; - -// The default DenseMapInfo require to know about pointer alignement. -// Because the C API uses opaques pointer types, their alignement is unknown. -// As a result, we need to roll out our own implementation. -template<typename T> -struct CAPIDenseMap<T*> { - struct CAPIDenseMapInfo { - static inline T* getEmptyKey() { - uintptr_t Val = static_cast<uintptr_t>(-1); - return reinterpret_cast<T*>(Val); - } - static inline T* getTombstoneKey() { - uintptr_t Val = static_cast<uintptr_t>(-2); - return reinterpret_cast<T*>(Val); - } - static unsigned getHashValue(const T *PtrVal) { - return hash_value(PtrVal); - } - static bool isEqual(const T *LHS, const T *RHS) { return LHS == RHS; } - }; - - typedef DenseMap<T*, T*, CAPIDenseMapInfo> Map; -}; - -typedef CAPIDenseMap<LLVMValueRef>::Map ValueMap; -typedef CAPIDenseMap<LLVMBasicBlockRef>::Map BasicBlockMap; - -struct TypeCloner { - LLVMModuleRef M; - LLVMContextRef Ctx; - - TypeCloner(LLVMModuleRef M): M(M), Ctx(LLVMGetModuleContext(M)) {} - - LLVMTypeRef Clone(LLVMValueRef Src) { - return Clone(LLVMTypeOf(Src)); - } - - LLVMTypeRef Clone(LLVMTypeRef Src) { - LLVMTypeKind Kind = LLVMGetTypeKind(Src); - switch (Kind) { - case LLVMVoidTypeKind: - return LLVMVoidTypeInContext(Ctx); - case LLVMHalfTypeKind: - return LLVMHalfTypeInContext(Ctx); - case LLVMFloatTypeKind: - return LLVMFloatTypeInContext(Ctx); - case LLVMDoubleTypeKind: - return LLVMDoubleTypeInContext(Ctx); - case LLVMX86_FP80TypeKind: - return LLVMX86FP80TypeInContext(Ctx); - case LLVMFP128TypeKind: - return LLVMFP128TypeInContext(Ctx); - case LLVMPPC_FP128TypeKind: - return LLVMPPCFP128TypeInContext(Ctx); - case LLVMLabelTypeKind: - return LLVMLabelTypeInContext(Ctx); - case LLVMIntegerTypeKind: - return LLVMIntTypeInContext(Ctx, LLVMGetIntTypeWidth(Src)); - case LLVMFunctionTypeKind: { - unsigned ParamCount = LLVMCountParamTypes(Src); - LLVMTypeRef* Params = nullptr; - if (ParamCount > 0) { - Params = static_cast<LLVMTypeRef*>( - safe_malloc(ParamCount * sizeof(LLVMTypeRef))); - LLVMGetParamTypes(Src, Params); - for (unsigned i = 0; i < ParamCount; i++) - Params[i] = Clone(Params[i]); - } - - LLVMTypeRef FunTy = LLVMFunctionType(Clone(LLVMGetReturnType(Src)), - Params, ParamCount, - LLVMIsFunctionVarArg(Src)); - if (ParamCount > 0) - free(Params); - return FunTy; - } - case LLVMStructTypeKind: { - LLVMTypeRef S = nullptr; - const char *Name = LLVMGetStructName(Src); - if (Name) { - S = LLVMGetTypeByName(M, Name); - if (S) - return S; - S = LLVMStructCreateNamed(Ctx, Name); - if (LLVMIsOpaqueStruct(Src)) - return S; - } - - unsigned EltCount = LLVMCountStructElementTypes(Src); - SmallVector<LLVMTypeRef, 8> Elts; - for (unsigned i = 0; i < EltCount; i++) - Elts.push_back(Clone(LLVMStructGetTypeAtIndex(Src, i))); - if (Name) - LLVMStructSetBody(S, Elts.data(), EltCount, LLVMIsPackedStruct(Src)); - else - S = LLVMStructTypeInContext(Ctx, Elts.data(), EltCount, - LLVMIsPackedStruct(Src)); - return S; - } - case LLVMArrayTypeKind: - return LLVMArrayType( - Clone(LLVMGetElementType(Src)), - LLVMGetArrayLength(Src) - ); - case LLVMPointerTypeKind: - return LLVMPointerType( - Clone(LLVMGetElementType(Src)), - LLVMGetPointerAddressSpace(Src) - ); - case LLVMVectorTypeKind: - return LLVMVectorType( - Clone(LLVMGetElementType(Src)), - LLVMGetVectorSize(Src) - ); - case LLVMMetadataTypeKind: - return LLVMMetadataTypeInContext(Ctx); - case LLVMX86_MMXTypeKind: - return LLVMX86MMXTypeInContext(Ctx); - case LLVMTokenTypeKind: - return LLVMTokenTypeInContext(Ctx); - } - - fprintf(stderr, "%d is not a supported typekind\n", Kind); - exit(-1); - } -}; - -static ValueMap clone_params(LLVMValueRef Src, LLVMValueRef Dst) { - unsigned Count = LLVMCountParams(Src); - if (Count != LLVMCountParams(Dst)) - report_fatal_error("Parameter count mismatch"); - - ValueMap VMap; - if (Count == 0) - return VMap; - - LLVMValueRef SrcFirst = LLVMGetFirstParam(Src); - LLVMValueRef DstFirst = LLVMGetFirstParam(Dst); - LLVMValueRef SrcLast = LLVMGetLastParam(Src); - LLVMValueRef DstLast = LLVMGetLastParam(Dst); - - LLVMValueRef SrcCur = SrcFirst; - LLVMValueRef DstCur = DstFirst; - LLVMValueRef SrcNext = nullptr; - LLVMValueRef DstNext = nullptr; - while (true) { - size_t NameLen; - const char *Name = LLVMGetValueName2(SrcCur, &NameLen); - LLVMSetValueName2(DstCur, Name, NameLen); - - VMap[SrcCur] = DstCur; - - Count--; - SrcNext = LLVMGetNextParam(SrcCur); - DstNext = LLVMGetNextParam(DstCur); - if (SrcNext == nullptr && DstNext == nullptr) { - if (SrcCur != SrcLast) - report_fatal_error("SrcLast param does not match End"); - if (DstCur != DstLast) - report_fatal_error("DstLast param does not match End"); - break; - } - - if (SrcNext == nullptr) - report_fatal_error("SrcNext was unexpectedly null"); - if (DstNext == nullptr) - report_fatal_error("DstNext was unexpectedly null"); - - LLVMValueRef SrcPrev = LLVMGetPreviousParam(SrcNext); - if (SrcPrev != SrcCur) - report_fatal_error("SrcNext.Previous param is not Current"); - - LLVMValueRef DstPrev = LLVMGetPreviousParam(DstNext); - if (DstPrev != DstCur) - report_fatal_error("DstNext.Previous param is not Current"); - - SrcCur = SrcNext; - DstCur = DstNext; - } - - if (Count != 0) - report_fatal_error("Parameter count does not match iteration"); - - return VMap; -} - -static void check_value_kind(LLVMValueRef V, LLVMValueKind K) { - if (LLVMGetValueKind(V) != K) - report_fatal_error("LLVMGetValueKind returned incorrect type"); -} - -static LLVMValueRef clone_constant_impl(LLVMValueRef Cst, LLVMModuleRef M); - -static LLVMValueRef clone_constant(LLVMValueRef Cst, LLVMModuleRef M) { - LLVMValueRef Ret = clone_constant_impl(Cst, M); - check_value_kind(Ret, LLVMGetValueKind(Cst)); - return Ret; -} - -static LLVMValueRef clone_constant_impl(LLVMValueRef Cst, LLVMModuleRef M) { - if (!LLVMIsAConstant(Cst)) - report_fatal_error("Expected a constant"); - - // Maybe it is a symbol - if (LLVMIsAGlobalValue(Cst)) { - size_t NameLen; - const char *Name = LLVMGetValueName2(Cst, &NameLen); - - // Try function - if (LLVMIsAFunction(Cst)) { - check_value_kind(Cst, LLVMFunctionValueKind); - - LLVMValueRef Dst = nullptr; - // Try an intrinsic - unsigned ID = LLVMGetIntrinsicID(Cst); - if (ID > 0 && !LLVMIntrinsicIsOverloaded(ID)) { - Dst = LLVMGetIntrinsicDeclaration(M, ID, nullptr, 0); - } else { - // Try a normal function - Dst = LLVMGetNamedFunction(M, Name); - } - - if (Dst) - return Dst; - report_fatal_error("Could not find function"); - } - - // Try global variable - if (LLVMIsAGlobalVariable(Cst)) { - check_value_kind(Cst, LLVMGlobalVariableValueKind); - LLVMValueRef Dst = LLVMGetNamedGlobal(M, Name); - if (Dst) - return Dst; - report_fatal_error("Could not find variable"); - } - - // Try global alias - if (LLVMIsAGlobalAlias(Cst)) { - check_value_kind(Cst, LLVMGlobalAliasValueKind); - LLVMValueRef Dst = LLVMGetNamedGlobalAlias(M, Name, NameLen); - if (Dst) - return Dst; - report_fatal_error("Could not find alias"); - } - - fprintf(stderr, "Could not find @%s\n", Name); - exit(-1); - } - - // Try integer literal - if (LLVMIsAConstantInt(Cst)) { - check_value_kind(Cst, LLVMConstantIntValueKind); - return LLVMConstInt(TypeCloner(M).Clone(Cst), - LLVMConstIntGetZExtValue(Cst), false); - } - - // Try zeroinitializer - if (LLVMIsAConstantAggregateZero(Cst)) { - check_value_kind(Cst, LLVMConstantAggregateZeroValueKind); - return LLVMConstNull(TypeCloner(M).Clone(Cst)); - } - - // Try constant array - if (LLVMIsAConstantArray(Cst)) { - check_value_kind(Cst, LLVMConstantArrayValueKind); - LLVMTypeRef Ty = TypeCloner(M).Clone(Cst); - unsigned EltCount = LLVMGetArrayLength(Ty); - SmallVector<LLVMValueRef, 8> Elts; - for (unsigned i = 0; i < EltCount; i++) - Elts.push_back(clone_constant(LLVMGetOperand(Cst, i), M)); - return LLVMConstArray(LLVMGetElementType(Ty), Elts.data(), EltCount); - } - - // Try contant data array - if (LLVMIsAConstantDataArray(Cst)) { - check_value_kind(Cst, LLVMConstantDataArrayValueKind); - LLVMTypeRef Ty = TypeCloner(M).Clone(Cst); - unsigned EltCount = LLVMGetArrayLength(Ty); - SmallVector<LLVMValueRef, 8> Elts; - for (unsigned i = 0; i < EltCount; i++) - Elts.push_back(clone_constant(LLVMGetElementAsConstant(Cst, i), M)); - return LLVMConstArray(LLVMGetElementType(Ty), Elts.data(), EltCount); - } - - // Try constant struct - if (LLVMIsAConstantStruct(Cst)) { - check_value_kind(Cst, LLVMConstantStructValueKind); - LLVMTypeRef Ty = TypeCloner(M).Clone(Cst); - unsigned EltCount = LLVMCountStructElementTypes(Ty); - SmallVector<LLVMValueRef, 8> Elts; - for (unsigned i = 0; i < EltCount; i++) - Elts.push_back(clone_constant(LLVMGetOperand(Cst, i), M)); - if (LLVMGetStructName(Ty)) - return LLVMConstNamedStruct(Ty, Elts.data(), EltCount); - return LLVMConstStructInContext(LLVMGetModuleContext(M), Elts.data(), - EltCount, LLVMIsPackedStruct(Ty)); - } - - // Try undef - if (LLVMIsUndef(Cst)) { - check_value_kind(Cst, LLVMUndefValueValueKind); - return LLVMGetUndef(TypeCloner(M).Clone(Cst)); - } - - // Try null - if (LLVMIsNull(Cst)) { - check_value_kind(Cst, LLVMConstantTokenNoneValueKind); - LLVMTypeRef Ty = TypeCloner(M).Clone(Cst); - return LLVMConstNull(Ty); - } - - // Try float literal - if (LLVMIsAConstantFP(Cst)) { - check_value_kind(Cst, LLVMConstantFPValueKind); - report_fatal_error("ConstantFP is not supported"); - } - - // This kind of constant is not supported - if (!LLVMIsAConstantExpr(Cst)) - report_fatal_error("Expected a constant expression"); - - // At this point, it must be a constant expression - check_value_kind(Cst, LLVMConstantExprValueKind); - - LLVMOpcode Op = LLVMGetConstOpcode(Cst); - switch(Op) { - case LLVMBitCast: - return LLVMConstBitCast(clone_constant(LLVMGetOperand(Cst, 0), M), - TypeCloner(M).Clone(Cst)); - default: - fprintf(stderr, "%d is not a supported opcode\n", Op); - exit(-1); - } -} - -struct FunCloner { - LLVMValueRef Fun; - LLVMModuleRef M; - - ValueMap VMap; - BasicBlockMap BBMap; - - FunCloner(LLVMValueRef Src, LLVMValueRef Dst): Fun(Dst), - M(LLVMGetGlobalParent(Fun)), VMap(clone_params(Src, Dst)) {} - - LLVMTypeRef CloneType(LLVMTypeRef Src) { - return TypeCloner(M).Clone(Src); - } - - LLVMTypeRef CloneType(LLVMValueRef Src) { - return TypeCloner(M).Clone(Src); - } - - // Try to clone everything in the llvm::Value hierarchy. - LLVMValueRef CloneValue(LLVMValueRef Src) { - // First, the value may be constant. - if (LLVMIsAConstant(Src)) - return clone_constant(Src, M); - - // Function argument should always be in the map already. - auto i = VMap.find(Src); - if (i != VMap.end()) - return i->second; - - if (!LLVMIsAInstruction(Src)) - report_fatal_error("Expected an instruction"); - - auto Ctx = LLVMGetModuleContext(M); - auto Builder = LLVMCreateBuilderInContext(Ctx); - auto BB = DeclareBB(LLVMGetInstructionParent(Src)); - LLVMPositionBuilderAtEnd(Builder, BB); - auto Dst = CloneInstruction(Src, Builder); - LLVMDisposeBuilder(Builder); - return Dst; - } - - void CloneAttrs(LLVMValueRef Src, LLVMValueRef Dst) { - auto Ctx = LLVMGetModuleContext(M); - int ArgCount = LLVMGetNumArgOperands(Src); - for (int i = LLVMAttributeReturnIndex; i <= ArgCount; i++) { - for (unsigned k = 0, e = LLVMGetLastEnumAttributeKind(); k < e; ++k) { - if (auto SrcA = LLVMGetCallSiteEnumAttribute(Src, i, k)) { - auto Val = LLVMGetEnumAttributeValue(SrcA); - auto A = LLVMCreateEnumAttribute(Ctx, k, Val); - LLVMAddCallSiteAttribute(Dst, i, A); - } - } - } - } - - LLVMValueRef CloneInstruction(LLVMValueRef Src, LLVMBuilderRef Builder) { - check_value_kind(Src, LLVMInstructionValueKind); - if (!LLVMIsAInstruction(Src)) - report_fatal_error("Expected an instruction"); - - size_t NameLen; - const char *Name = LLVMGetValueName2(Src, &NameLen); - - // Check if this is something we already computed. - { - auto i = VMap.find(Src); - if (i != VMap.end()) { - // If we have a hit, it means we already generated the instruction - // as a dependancy to somethign else. We need to make sure - // it is ordered properly. - auto I = i->second; - LLVMInstructionRemoveFromParent(I); - LLVMInsertIntoBuilderWithName(Builder, I, Name); - return I; - } - } - - // 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))); - break; - } - case LLVMBr: { - if (!LLVMIsConditional(Src)) { - LLVMValueRef SrcOp = LLVMGetOperand(Src, 0); - LLVMBasicBlockRef SrcBB = LLVMValueAsBasicBlock(SrcOp); - Dst = LLVMBuildBr(Builder, DeclareBB(SrcBB)); - break; - } - - LLVMValueRef Cond = LLVMGetCondition(Src); - LLVMValueRef Else = LLVMGetOperand(Src, 1); - LLVMBasicBlockRef ElseBB = DeclareBB(LLVMValueAsBasicBlock(Else)); - LLVMValueRef Then = LLVMGetOperand(Src, 2); - LLVMBasicBlockRef ThenBB = DeclareBB(LLVMValueAsBasicBlock(Then)); - Dst = LLVMBuildCondBr(Builder, CloneValue(Cond), ThenBB, ElseBB); - break; - } - case LLVMSwitch: - case LLVMIndirectBr: - break; - case LLVMInvoke: { - SmallVector<LLVMValueRef, 8> Args; - int ArgCount = LLVMGetNumArgOperands(Src); - for (int i = 0; i < ArgCount; i++) - Args.push_back(CloneValue(LLVMGetOperand(Src, i))); - LLVMValueRef Fn = CloneValue(LLVMGetCalledValue(Src)); - LLVMBasicBlockRef Then = DeclareBB(LLVMGetNormalDest(Src)); - LLVMBasicBlockRef Unwind = DeclareBB(LLVMGetUnwindDest(Src)); - Dst = LLVMBuildInvoke(Builder, Fn, Args.data(), ArgCount, - Then, Unwind, Name); - CloneAttrs(Src, Dst); - break; - } - case LLVMUnreachable: - Dst = LLVMBuildUnreachable(Builder); - break; - case LLVMAdd: { - LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0)); - LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1)); - Dst = LLVMBuildAdd(Builder, LHS, RHS, Name); - break; - } - case LLVMSub: { - LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0)); - LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1)); - Dst = LLVMBuildSub(Builder, LHS, RHS, Name); - break; - } - case LLVMMul: { - LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0)); - LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1)); - Dst = LLVMBuildMul(Builder, LHS, RHS, Name); - break; - } - case LLVMUDiv: { - LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0)); - LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1)); - Dst = LLVMBuildUDiv(Builder, LHS, RHS, Name); - break; - } - case LLVMSDiv: { - LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0)); - LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1)); - Dst = LLVMBuildSDiv(Builder, LHS, RHS, Name); - break; - } - case LLVMURem: { - LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0)); - LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1)); - Dst = LLVMBuildURem(Builder, LHS, RHS, Name); - break; - } - case LLVMSRem: { - LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0)); - LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1)); - Dst = LLVMBuildSRem(Builder, LHS, RHS, Name); - break; - } - case LLVMShl: { - LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0)); - LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1)); - Dst = LLVMBuildShl(Builder, LHS, RHS, Name); - break; - } - case LLVMLShr: { - LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0)); - LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1)); - Dst = LLVMBuildLShr(Builder, LHS, RHS, Name); - break; - } - case LLVMAShr: { - LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0)); - LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1)); - Dst = LLVMBuildAShr(Builder, LHS, RHS, Name); - break; - } - case LLVMAnd: { - LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0)); - LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1)); - Dst = LLVMBuildAnd(Builder, LHS, RHS, Name); - break; - } - case LLVMOr: { - LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0)); - LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1)); - Dst = LLVMBuildOr(Builder, LHS, RHS, Name); - break; - } - case LLVMXor: { - LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0)); - LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1)); - Dst = LLVMBuildXor(Builder, LHS, RHS, Name); - break; - } - case LLVMAlloca: { - LLVMTypeRef Ty = CloneType(LLVMGetAllocatedType(Src)); - Dst = LLVMBuildAlloca(Builder, Ty, Name); - break; - } - case LLVMLoad: { - LLVMValueRef Ptr = CloneValue(LLVMGetOperand(Src, 0)); - Dst = LLVMBuildLoad(Builder, Ptr, Name); - LLVMSetAlignment(Dst, LLVMGetAlignment(Src)); - break; - } - case LLVMStore: { - LLVMValueRef Val = CloneValue(LLVMGetOperand(Src, 0)); - LLVMValueRef Ptr = CloneValue(LLVMGetOperand(Src, 1)); - Dst = LLVMBuildStore(Builder, Val, Ptr); - LLVMSetAlignment(Dst, LLVMGetAlignment(Src)); - break; - } - case LLVMGetElementPtr: { - LLVMValueRef Ptr = CloneValue(LLVMGetOperand(Src, 0)); - SmallVector<LLVMValueRef, 8> Idx; - int NumIdx = LLVMGetNumIndices(Src); - for (int i = 1; i <= NumIdx; i++) - Idx.push_back(CloneValue(LLVMGetOperand(Src, i))); - if (LLVMIsInBounds(Src)) - Dst = LLVMBuildInBoundsGEP(Builder, Ptr, Idx.data(), NumIdx, Name); - else - Dst = LLVMBuildGEP(Builder, Ptr, Idx.data(), NumIdx, Name); - break; - } - case LLVMAtomicCmpXchg: { - LLVMValueRef Ptr = CloneValue(LLVMGetOperand(Src, 0)); - LLVMValueRef Cmp = CloneValue(LLVMGetOperand(Src, 1)); - LLVMValueRef New = CloneValue(LLVMGetOperand(Src, 2)); - LLVMAtomicOrdering Succ = LLVMGetCmpXchgSuccessOrdering(Src); - LLVMAtomicOrdering Fail = LLVMGetCmpXchgFailureOrdering(Src); - LLVMBool SingleThread = LLVMIsAtomicSingleThread(Src); - - Dst = LLVMBuildAtomicCmpXchg(Builder, Ptr, Cmp, New, Succ, Fail, - SingleThread); - } break; - case LLVMBitCast: { - LLVMValueRef V = CloneValue(LLVMGetOperand(Src, 0)); - Dst = LLVMBuildBitCast(Builder, V, CloneType(Src), Name); - break; - } - case LLVMICmp: { - LLVMIntPredicate Pred = LLVMGetICmpPredicate(Src); - LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0)); - LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1)); - Dst = LLVMBuildICmp(Builder, Pred, LHS, RHS, Name); - break; - } - case LLVMPHI: { - // We need to aggressively set things here because of loops. - VMap[Src] = Dst = LLVMBuildPhi(Builder, CloneType(Src), Name); - - SmallVector<LLVMValueRef, 8> Values; - SmallVector<LLVMBasicBlockRef, 8> Blocks; - - unsigned IncomingCount = LLVMCountIncoming(Src); - for (unsigned i = 0; i < IncomingCount; ++i) { - Blocks.push_back(DeclareBB(LLVMGetIncomingBlock(Src, i))); - Values.push_back(CloneValue(LLVMGetIncomingValue(Src, i))); - } - - LLVMAddIncoming(Dst, Values.data(), Blocks.data(), IncomingCount); - return Dst; - } - case LLVMCall: { - SmallVector<LLVMValueRef, 8> Args; - int ArgCount = LLVMGetNumArgOperands(Src); - for (int i = 0; i < ArgCount; i++) - Args.push_back(CloneValue(LLVMGetOperand(Src, i))); - LLVMValueRef Fn = CloneValue(LLVMGetCalledValue(Src)); - Dst = LLVMBuildCall(Builder, Fn, Args.data(), ArgCount, Name); - LLVMSetTailCall(Dst, LLVMIsTailCall(Src)); - CloneAttrs(Src, Dst); - break; - } - case LLVMResume: { - Dst = LLVMBuildResume(Builder, CloneValue(LLVMGetOperand(Src, 0))); - break; - } - case LLVMLandingPad: { - // The landing pad API is a bit screwed up for historical reasons. - Dst = LLVMBuildLandingPad(Builder, CloneType(Src), nullptr, 0, Name); - unsigned NumClauses = LLVMGetNumClauses(Src); - for (unsigned i = 0; i < NumClauses; ++i) - LLVMAddClause(Dst, CloneValue(LLVMGetClause(Src, i))); - LLVMSetCleanup(Dst, LLVMIsCleanup(Src)); - break; - } - case LLVMCleanupRet: { - LLVMValueRef CatchPad = CloneValue(LLVMGetOperand(Src, 0)); - LLVMBasicBlockRef Unwind = nullptr; - if (LLVMBasicBlockRef UDest = LLVMGetUnwindDest(Src)) - Unwind = DeclareBB(UDest); - Dst = LLVMBuildCleanupRet(Builder, CatchPad, Unwind); - break; - } - case LLVMCatchRet: { - LLVMValueRef CatchPad = CloneValue(LLVMGetOperand(Src, 0)); - LLVMBasicBlockRef SuccBB = DeclareBB(LLVMGetSuccessor(Src, 0)); - Dst = LLVMBuildCatchRet(Builder, CatchPad, SuccBB); - break; - } - case LLVMCatchPad: { - LLVMValueRef ParentPad = CloneValue(LLVMGetParentCatchSwitch(Src)); - SmallVector<LLVMValueRef, 8> Args; - int ArgCount = LLVMGetNumArgOperands(Src); - for (int i = 0; i < ArgCount; i++) - Args.push_back(CloneValue(LLVMGetOperand(Src, i))); - Dst = LLVMBuildCatchPad(Builder, ParentPad, - Args.data(), ArgCount, Name); - break; - } - case LLVMCleanupPad: { - LLVMValueRef ParentPad = CloneValue(LLVMGetOperand(Src, 0)); - SmallVector<LLVMValueRef, 8> Args; - int ArgCount = LLVMGetNumArgOperands(Src); - for (int i = 0; i < ArgCount; i++) - Args.push_back(CloneValue(LLVMGetArgOperand(Src, i))); - Dst = LLVMBuildCleanupPad(Builder, ParentPad, - Args.data(), ArgCount, Name); - break; - } - case LLVMCatchSwitch: { - LLVMValueRef ParentPad = CloneValue(LLVMGetOperand(Src, 0)); - LLVMBasicBlockRef UnwindBB = nullptr; - if (LLVMBasicBlockRef UDest = LLVMGetUnwindDest(Src)) { - UnwindBB = DeclareBB(UDest); - } - unsigned NumHandlers = LLVMGetNumHandlers(Src); - Dst = LLVMBuildCatchSwitch(Builder, ParentPad, UnwindBB, NumHandlers, Name); - if (NumHandlers > 0) { - LLVMBasicBlockRef *Handlers = static_cast<LLVMBasicBlockRef*>( - safe_malloc(NumHandlers * sizeof(LLVMBasicBlockRef))); - LLVMGetHandlers(Src, Handlers); - for (unsigned i = 0; i < NumHandlers; i++) - LLVMAddHandler(Dst, DeclareBB(Handlers[i])); - free(Handlers); - } - break; - } - case LLVMExtractValue: { - LLVMValueRef Agg = CloneValue(LLVMGetOperand(Src, 0)); - if (LLVMGetNumIndices(Src) != 1) - report_fatal_error("Expected only one indice"); - auto I = LLVMGetIndices(Src)[0]; - Dst = LLVMBuildExtractValue(Builder, Agg, I, Name); - break; - } - case LLVMInsertValue: { - LLVMValueRef Agg = CloneValue(LLVMGetOperand(Src, 0)); - LLVMValueRef V = CloneValue(LLVMGetOperand(Src, 1)); - if (LLVMGetNumIndices(Src) != 1) - report_fatal_error("Expected only one indice"); - auto I = LLVMGetIndices(Src)[0]; - Dst = LLVMBuildInsertValue(Builder, Agg, V, I, Name); - break; - } - default: - break; - } - - if (Dst == nullptr) { - fprintf(stderr, "%d is not a supported opcode\n", Op); - exit(-1); - } - - auto Ctx = LLVMGetModuleContext(M); - size_t NumMetadataEntries; - auto *AllMetadata = - LLVMInstructionGetAllMetadataOtherThanDebugLoc(Src, - &NumMetadataEntries); - for (unsigned i = 0; i < NumMetadataEntries; ++i) { - unsigned Kind = LLVMValueMetadataEntriesGetKind(AllMetadata, i); - LLVMMetadataRef MD = LLVMValueMetadataEntriesGetMetadata(AllMetadata, i); - LLVMSetMetadata(Dst, Kind, LLVMMetadataAsValue(Ctx, MD)); - } - LLVMDisposeValueMetadataEntries(AllMetadata); - LLVMSetInstDebugLocation(Builder, Dst); - - check_value_kind(Dst, LLVMInstructionValueKind); - 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; - } - } - - LLVMValueRef V = LLVMBasicBlockAsValue(Src); - if (!LLVMValueIsBasicBlock(V) || LLVMValueAsBasicBlock(V) != Src) - report_fatal_error("Basic block is not a basic block"); - - const char *Name = LLVMGetBasicBlockName(Src); - size_t NameLen; - const char *VName = LLVMGetValueName2(V, &NameLen); - if (Name != VName) - report_fatal_error("Basic block name mismatch"); - - LLVMBasicBlockRef BB = LLVMAppendBasicBlock(Fun, Name); - return BBMap[Src] = BB; - } - - 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) - report_fatal_error("Has no first instruction, but last one"); - return BB; - } - - auto Ctx = LLVMGetModuleContext(M); - LLVMBuilderRef Builder = LLVMCreateBuilderInContext(Ctx); - LLVMPositionBuilderAtEnd(Builder, BB); - - LLVMValueRef Cur = First; - LLVMValueRef Next = nullptr; - while(true) { - CloneInstruction(Cur, Builder); - Next = LLVMGetNextInstruction(Cur); - if (Next == nullptr) { - if (Cur != Last) - report_fatal_error("Final instruction does not match Last"); - break; - } - - LLVMValueRef Prev = LLVMGetPreviousInstruction(Next); - if (Prev != Cur) - report_fatal_error("Next.Previous instruction is not Current"); - - Cur = Next; - } - - LLVMDisposeBuilder(Builder); - return BB; - } - - 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) - report_fatal_error("Final basic block does not match Last"); - break; - } - - LLVMBasicBlockRef Prev = LLVMGetPreviousBasicBlock(Next); - if (Prev != Cur) - report_fatal_error("Next.Previous basic bloc is not Current"); - - Cur = Next; - } - - if (Count != 0) - report_fatal_error("Basic block count does not match iterration"); - } -}; - -static void declare_symbols(LLVMModuleRef Src, LLVMModuleRef M) { - auto Ctx = LLVMGetModuleContext(M); - - LLVMValueRef Begin = LLVMGetFirstGlobal(Src); - LLVMValueRef End = LLVMGetLastGlobal(Src); - - LLVMValueRef Cur = Begin; - LLVMValueRef Next = nullptr; - if (!Begin) { - if (End != nullptr) - report_fatal_error("Range has an end but no beginning"); - goto FunDecl; - } - - while (true) { - size_t NameLen; - const char *Name = LLVMGetValueName2(Cur, &NameLen); - if (LLVMGetNamedGlobal(M, Name)) - report_fatal_error("GlobalVariable already cloned"); - LLVMAddGlobal(M, LLVMGetElementType(TypeCloner(M).Clone(Cur)), Name); - - Next = LLVMGetNextGlobal(Cur); - if (Next == nullptr) { - if (Cur != End) - report_fatal_error(""); - break; - } - - LLVMValueRef Prev = LLVMGetPreviousGlobal(Next); - if (Prev != Cur) - report_fatal_error("Next.Previous global is not Current"); - - Cur = Next; - } - -FunDecl: - Begin = LLVMGetFirstFunction(Src); - End = LLVMGetLastFunction(Src); - if (!Begin) { - if (End != nullptr) - report_fatal_error("Range has an end but no beginning"); - goto AliasDecl; - } - - Cur = Begin; - Next = nullptr; - while (true) { - size_t NameLen; - const char *Name = LLVMGetValueName2(Cur, &NameLen); - if (LLVMGetNamedFunction(M, Name)) - report_fatal_error("Function already cloned"); - auto Ty = LLVMGetElementType(TypeCloner(M).Clone(Cur)); - auto F = LLVMAddFunction(M, Name, Ty); - - // Copy attributes - for (int i = LLVMAttributeFunctionIndex, c = LLVMCountParams(F); - i <= c; ++i) { - for (unsigned k = 0, e = LLVMGetLastEnumAttributeKind(); k < e; ++k) { - if (auto SrcA = LLVMGetEnumAttributeAtIndex(Cur, i, k)) { - auto Val = LLVMGetEnumAttributeValue(SrcA); - auto DstA = LLVMCreateEnumAttribute(Ctx, k, Val); - LLVMAddAttributeAtIndex(F, i, DstA); - } - } - } - - 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; - } - -AliasDecl: - Begin = LLVMGetFirstGlobalAlias(Src); - End = LLVMGetLastGlobalAlias(Src); - if (!Begin) { - if (End != nullptr) - report_fatal_error("Range has an end but no beginning"); - goto NamedMDDecl; - } - - Cur = Begin; - Next = nullptr; - while (true) { - size_t NameLen; - const char *Name = LLVMGetValueName2(Cur, &NameLen); - if (LLVMGetNamedGlobalAlias(M, Name, NameLen)) - report_fatal_error("Global alias already cloned"); - LLVMTypeRef CurType = TypeCloner(M).Clone(Cur); - // FIXME: Allow NULL aliasee. - LLVMAddAlias(M, CurType, LLVMGetUndef(CurType), Name); - - Next = LLVMGetNextGlobalAlias(Cur); - if (Next == nullptr) { - if (Cur != End) - report_fatal_error(""); - break; - } - - LLVMValueRef Prev = LLVMGetPreviousGlobalAlias(Next); - if (Prev != Cur) - report_fatal_error("Next.Previous global is not Current"); - - Cur = Next; - } - -NamedMDDecl: - LLVMNamedMDNodeRef BeginMD = LLVMGetFirstNamedMetadata(Src); - LLVMNamedMDNodeRef EndMD = LLVMGetLastNamedMetadata(Src); - if (!BeginMD) { - if (EndMD != nullptr) - report_fatal_error("Range has an end but no beginning"); - return; - } - - LLVMNamedMDNodeRef CurMD = BeginMD; - LLVMNamedMDNodeRef NextMD = nullptr; - while (true) { - size_t NameLen; - const char *Name = LLVMGetNamedMetadataName(CurMD, &NameLen); - if (LLVMGetNamedMetadata(M, Name, NameLen)) - report_fatal_error("Named Metadata Node already cloned"); - LLVMGetOrInsertNamedMetadata(M, Name, NameLen); - - NextMD = LLVMGetNextNamedMetadata(CurMD); - if (NextMD == nullptr) { - if (CurMD != EndMD) - report_fatal_error(""); - break; - } - - LLVMNamedMDNodeRef PrevMD = LLVMGetPreviousNamedMetadata(NextMD); - if (PrevMD != CurMD) - report_fatal_error("Next.Previous global is not Current"); - - CurMD = NextMD; - } -} - -static void clone_symbols(LLVMModuleRef Src, LLVMModuleRef M) { - LLVMValueRef Begin = LLVMGetFirstGlobal(Src); - LLVMValueRef End = LLVMGetLastGlobal(Src); - - LLVMValueRef Cur = Begin; - LLVMValueRef Next = nullptr; - if (!Begin) { - if (End != nullptr) - report_fatal_error("Range has an end but no beginning"); - goto FunClone; - } - - while (true) { - size_t NameLen; - const char *Name = LLVMGetValueName2(Cur, &NameLen); - LLVMValueRef G = LLVMGetNamedGlobal(M, Name); - if (!G) - report_fatal_error("GlobalVariable must have been declared already"); - - if (auto I = LLVMGetInitializer(Cur)) - LLVMSetInitializer(G, clone_constant(I, M)); - - size_t NumMetadataEntries; - auto *AllMetadata = LLVMGlobalCopyAllMetadata(Cur, &NumMetadataEntries); - for (unsigned i = 0; i < NumMetadataEntries; ++i) { - unsigned Kind = LLVMValueMetadataEntriesGetKind(AllMetadata, i); - LLVMMetadataRef MD = LLVMValueMetadataEntriesGetMetadata(AllMetadata, i); - LLVMGlobalSetMetadata(G, Kind, MD); - } - LLVMDisposeValueMetadataEntries(AllMetadata); - - LLVMSetGlobalConstant(G, LLVMIsGlobalConstant(Cur)); - LLVMSetThreadLocal(G, LLVMIsThreadLocal(Cur)); - LLVMSetExternallyInitialized(G, LLVMIsExternallyInitialized(Cur)); - LLVMSetLinkage(G, LLVMGetLinkage(Cur)); - LLVMSetSection(G, LLVMGetSection(Cur)); - LLVMSetVisibility(G, LLVMGetVisibility(Cur)); - LLVMSetUnnamedAddress(G, LLVMGetUnnamedAddress(Cur)); - LLVMSetAlignment(G, LLVMGetAlignment(Cur)); - - Next = LLVMGetNextGlobal(Cur); - if (Next == nullptr) { - if (Cur != End) - report_fatal_error(""); - break; - } - - LLVMValueRef Prev = LLVMGetPreviousGlobal(Next); - if (Prev != Cur) - report_fatal_error("Next.Previous global is not Current"); - - Cur = Next; - } - -FunClone: - Begin = LLVMGetFirstFunction(Src); - End = LLVMGetLastFunction(Src); - if (!Begin) { - if (End != nullptr) - report_fatal_error("Range has an end but no beginning"); - goto AliasClone; - } - - Cur = Begin; - Next = nullptr; - while (true) { - size_t NameLen; - const char *Name = LLVMGetValueName2(Cur, &NameLen); - LLVMValueRef Fun = LLVMGetNamedFunction(M, Name); - if (!Fun) - report_fatal_error("Function must have been declared already"); - - if (LLVMHasPersonalityFn(Cur)) { - size_t FNameLen; - const char *FName = LLVMGetValueName2(LLVMGetPersonalityFn(Cur), - &FNameLen); - LLVMValueRef P = LLVMGetNamedFunction(M, FName); - if (!P) - report_fatal_error("Could not find personality function"); - LLVMSetPersonalityFn(Fun, P); - } - - size_t NumMetadataEntries; - auto *AllMetadata = LLVMGlobalCopyAllMetadata(Cur, &NumMetadataEntries); - for (unsigned i = 0; i < NumMetadataEntries; ++i) { - unsigned Kind = LLVMValueMetadataEntriesGetKind(AllMetadata, i); - LLVMMetadataRef MD = LLVMValueMetadataEntriesGetMetadata(AllMetadata, i); - LLVMGlobalSetMetadata(Fun, Kind, MD); - } - LLVMDisposeValueMetadataEntries(AllMetadata); - - FunCloner FC(Cur, Fun); - FC.CloneBBs(Cur); - - 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; - } - -AliasClone: - Begin = LLVMGetFirstGlobalAlias(Src); - End = LLVMGetLastGlobalAlias(Src); - if (!Begin) { - if (End != nullptr) - report_fatal_error("Range has an end but no beginning"); - goto NamedMDClone; - } - - Cur = Begin; - Next = nullptr; - while (true) { - size_t NameLen; - const char *Name = LLVMGetValueName2(Cur, &NameLen); - LLVMValueRef Alias = LLVMGetNamedGlobalAlias(M, Name, NameLen); - if (!Alias) - report_fatal_error("Global alias must have been declared already"); - - if (LLVMValueRef Aliasee = LLVMAliasGetAliasee(Cur)) { - LLVMAliasSetAliasee(Alias, clone_constant(Aliasee, M)); - } - - LLVMSetLinkage(Alias, LLVMGetLinkage(Cur)); - LLVMSetUnnamedAddress(Alias, LLVMGetUnnamedAddress(Cur)); - - Next = LLVMGetNextGlobalAlias(Cur); - if (Next == nullptr) { - if (Cur != End) - report_fatal_error("Last global alias does not match End"); - break; - } - - LLVMValueRef Prev = LLVMGetPreviousGlobalAlias(Next); - if (Prev != Cur) - report_fatal_error("Next.Previous global alias is not Current"); - - Cur = Next; - } - -NamedMDClone: - LLVMNamedMDNodeRef BeginMD = LLVMGetFirstNamedMetadata(Src); - LLVMNamedMDNodeRef EndMD = LLVMGetLastNamedMetadata(Src); - if (!BeginMD) { - if (EndMD != nullptr) - report_fatal_error("Range has an end but no beginning"); - return; - } - - LLVMNamedMDNodeRef CurMD = BeginMD; - LLVMNamedMDNodeRef NextMD = nullptr; - while (true) { - size_t NameLen; - const char *Name = LLVMGetNamedMetadataName(CurMD, &NameLen); - LLVMNamedMDNodeRef NamedMD = LLVMGetNamedMetadata(M, Name, NameLen); - if (!NamedMD) - report_fatal_error("Named MD Node must have been declared already"); - - unsigned OperandCount = LLVMGetNamedMetadataNumOperands(Src, Name); - LLVMValueRef *OperandBuf = static_cast<LLVMValueRef *>( - safe_malloc(OperandCount * sizeof(LLVMValueRef))); - LLVMGetNamedMetadataOperands(Src, Name, OperandBuf); - for (unsigned i = 0, e = OperandCount; i != e; ++i) { - LLVMAddNamedMetadataOperand(M, Name, OperandBuf[i]); - } - free(OperandBuf); - - NextMD = LLVMGetNextNamedMetadata(CurMD); - if (NextMD == nullptr) { - if (CurMD != EndMD) - report_fatal_error("Last Named MD Node does not match End"); - break; - } - - LLVMNamedMDNodeRef PrevMD = LLVMGetPreviousNamedMetadata(NextMD); - if (PrevMD != CurMD) - report_fatal_error("Next.Previous Named MD Node is not Current"); - - CurMD = NextMD; - } -} - -int llvm_echo(void) { - LLVMEnablePrettyStackTrace(); - - LLVMModuleRef Src = llvm_load_module(false, true); - size_t SourceFileLen; - const char *SourceFileName = LLVMGetSourceFileName(Src, &SourceFileLen); - size_t ModuleIdentLen; - const char *ModuleName = LLVMGetModuleIdentifier(Src, &ModuleIdentLen); - LLVMContextRef Ctx = LLVMContextCreate(); - LLVMModuleRef M = LLVMModuleCreateWithNameInContext(ModuleName, Ctx); - - LLVMSetSourceFileName(M, SourceFileName, SourceFileLen); - LLVMSetModuleIdentifier(M, ModuleName, ModuleIdentLen); - - LLVMSetTarget(M, LLVMGetTarget(Src)); - LLVMSetModuleDataLayout(M, LLVMGetModuleDataLayout(Src)); - if (strcmp(LLVMGetDataLayoutStr(M), LLVMGetDataLayoutStr(Src))) - report_fatal_error("Inconsistent DataLayout string representation"); - - size_t ModuleInlineAsmLen; - const char *ModuleAsm = LLVMGetModuleInlineAsm(Src, &ModuleInlineAsmLen); - LLVMSetModuleInlineAsm2(M, ModuleAsm, ModuleInlineAsmLen); - - declare_symbols(Src, M); - clone_symbols(Src, M); - char *Str = LLVMPrintModuleToString(M); - fputs(Str, stdout); - - LLVMDisposeMessage(Str); - LLVMDisposeModule(Src); - LLVMDisposeModule(M); - LLVMContextDispose(Ctx); - - return 0; -} diff --git a/gnu/llvm/tools/llvm-c-test/helpers.c b/gnu/llvm/tools/llvm-c-test/helpers.c deleted file mode 100644 index 9af88bd8be9..00000000000 --- a/gnu/llvm/tools/llvm-c-test/helpers.c +++ /dev/null @@ -1,39 +0,0 @@ -/*===-- helpers.c - tool for testing libLLVM and llvm-c API ---------------===*\ -|* *| -|* The LLVM Compiler Infrastructure *| -|* *| -|* This file is distributed under the University of Illinois Open Source *| -|* License. See LICENSE.TXT for details. *| -|* *| -|*===----------------------------------------------------------------------===*| -|* *| -|* Helper functions *| -|* *| -\*===----------------------------------------------------------------------===*/ - -#include <stdio.h> -#include <string.h> - -#define MAX_TOKENS 512 -#define MAX_LINE_LEN 1024 - -void llvm_tokenize_stdin(void (*cb)(char **tokens, int ntokens)) { - char line[MAX_LINE_LEN]; - char *tokbuf[MAX_TOKENS]; - - while (fgets(line, sizeof(line), stdin)) { - int c = 0; - - if (line[0] == ';' || line[0] == '\n') - continue; - - while (c < MAX_TOKENS) { - tokbuf[c] = strtok(c ? NULL : line, " \n"); - if (!tokbuf[c]) - break; - c++; - } - if (c) - cb(tokbuf, c); - } -} diff --git a/gnu/llvm/tools/llvm-c-test/include-all.c b/gnu/llvm/tools/llvm-c-test/include-all.c deleted file mode 100644 index 17b9917a876..00000000000 --- a/gnu/llvm/tools/llvm-c-test/include-all.c +++ /dev/null @@ -1,33 +0,0 @@ -/*===-- include-all.c - tool for testing libLLVM and llvm-c API -----------===*\ -|* *| -|* The LLVM Compiler Infrastructure *| -|* *| -|* This file is distributed under the University of Illinois Open Source *| -|* License. See LICENSE.TXT for details. *| -|* *| -|*===----------------------------------------------------------------------===*| -|* *| -|* This file doesn't have any actual code. It just make sure that all *| -|* the llvm-c include files are good and doesn't generate any warnings *| -|* *| -\*===----------------------------------------------------------------------===*/ - -// FIXME: Autogenerate this list - -#include "llvm-c/Analysis.h" -#include "llvm-c/BitReader.h" -#include "llvm-c/BitWriter.h" -#include "llvm-c/Core.h" -#include "llvm-c/Disassembler.h" -#include "llvm-c/ExecutionEngine.h" -#include "llvm-c/Initialization.h" -#include "llvm-c/LinkTimeOptimizer.h" -#include "llvm-c/Linker.h" -#include "llvm-c/Object.h" -#include "llvm-c/Target.h" -#include "llvm-c/TargetMachine.h" -#include "llvm-c/Transforms/IPO.h" -#include "llvm-c/Transforms/PassManagerBuilder.h" -#include "llvm-c/Transforms/Scalar.h" -#include "llvm-c/Transforms/Vectorize.h" -#include "llvm-c/lto.h" diff --git a/gnu/llvm/tools/llvm-c-test/llvm-c-test.h b/gnu/llvm/tools/llvm-c-test/llvm-c-test.h deleted file mode 100644 index cf9a0f99de6..00000000000 --- a/gnu/llvm/tools/llvm-c-test/llvm-c-test.h +++ /dev/null @@ -1,66 +0,0 @@ -/*===-- llvm-c-test.h - tool for testing libLLVM and llvm-c API -----------===*\ -|* *| -|* The LLVM Compiler Infrastructure *| -|* *| -|* This file is distributed under the University of Illinois Open Source *| -|* License. See LICENSE.TXT for details. *| -|* *| -|*===----------------------------------------------------------------------===*| -|* *| -|* Header file for llvm-c-test *| -|* *| -\*===----------------------------------------------------------------------===*/ -#ifndef LLVM_C_TEST_H -#define LLVM_C_TEST_H - -#include <stdbool.h> -#include "llvm-c/Core.h" - -#ifdef __cplusplus -extern "C" { -#endif - -// helpers.c -void llvm_tokenize_stdin(void (*cb)(char **tokens, int ntokens)); - -// module.c -LLVMModuleRef llvm_load_module(bool Lazy, bool New); -int llvm_module_dump(bool Lazy, bool New); -int llvm_module_list_functions(void); -int llvm_module_list_globals(void); - -// calc.c -int llvm_calc(void); - -// disassemble.c -int llvm_disassemble(void); - -// debuginfo.c -int llvm_test_dibuilder(void); - -// metadata.c -int llvm_add_named_metadata_operand(void); -int llvm_set_metadata(void); - -// object.c -int llvm_object_list_sections(void); -int llvm_object_list_symbols(void); - -// targets.c -int llvm_targets_list(void); - -// echo.c -int llvm_echo(void); - -// diagnostic.c -int llvm_test_diagnostic_handler(void); - -// attributes.c -int llvm_test_function_attributes(void); -int llvm_test_callsite_attributes(void); - -#ifdef __cplusplus -} -#endif /* !defined(__cplusplus) */ - -#endif diff --git a/gnu/llvm/tools/llvm-c-test/main.c b/gnu/llvm/tools/llvm-c-test/main.c deleted file mode 100644 index 60ab7f0f900..00000000000 --- a/gnu/llvm/tools/llvm-c-test/main.c +++ /dev/null @@ -1,107 +0,0 @@ -/*===-- main.c - tool for testing libLLVM and llvm-c API ------------------===*\ -|* *| -|* The LLVM Compiler Infrastructure *| -|* *| -|* This file is distributed under the University of Illinois Open Source *| -|* License. See LICENSE.TXT for details. *| -|* *| -|*===----------------------------------------------------------------------===*| -|* *| -|* Main file for llvm-c-tests. "Parses" arguments and dispatches. *| -|* *| -\*===----------------------------------------------------------------------===*/ - -#include "llvm-c-test.h" -#include <stdio.h> -#include <string.h> - -static void print_usage(void) { - fprintf(stderr, "llvm-c-test command\n\n"); - fprintf(stderr, " Commands:\n"); - fprintf(stderr, " * --module-dump\n"); - fprintf(stderr, " Read bitcode from stdin - print disassembly\n\n"); - fprintf(stderr, " * --lazy-module-dump\n"); - fprintf(stderr, - " Lazily read bitcode from stdin - print disassembly\n\n"); - fprintf(stderr, " * --new-module-dump\n"); - fprintf(stderr, " Read bitcode from stdin - print disassembly\n\n"); - fprintf(stderr, " * --lazy-new-module-dump\n"); - fprintf(stderr, - " Lazily read bitcode from stdin - print disassembly\n\n"); - fprintf(stderr, " * --module-list-functions\n"); - fprintf(stderr, - " Read bitcode from stdin - list summary of functions\n\n"); - fprintf(stderr, " * --module-list-globals\n"); - fprintf(stderr, " Read bitcode from stdin - list summary of globals\n\n"); - fprintf(stderr, " * --targets-list\n"); - fprintf(stderr, " List available targets\n\n"); - fprintf(stderr, " * --object-list-sections\n"); - fprintf(stderr, " Read object file form stdin - list sections\n\n"); - fprintf(stderr, " * --object-list-symbols\n"); - fprintf(stderr, - " Read object file form stdin - list symbols (like nm)\n\n"); - fprintf(stderr, " * --disassemble\n"); - fprintf(stderr, " Read lines of triple, hex ascii machine code from stdin " - "- print disassembly\n\n"); - fprintf(stderr, " * --calc\n"); - fprintf( - stderr, - " Read lines of name, rpn from stdin - print generated module\n\n"); - fprintf(stderr, " * --echo\n"); - fprintf(stderr, - " Read bitcode file form stdin - print it back out\n\n"); - fprintf(stderr, " * --test-diagnostic-handler\n"); - fprintf(stderr, - " Read bitcode file form stdin with a diagnostic handler set\n\n"); - fprintf(stderr, " * --test-dibuilder\n"); - fprintf(stderr, - " Run tests for the DIBuilder C API - print generated module\n\n"); -} - -int main(int argc, char **argv) { - LLVMPassRegistryRef pr = LLVMGetGlobalPassRegistry(); - - LLVMInitializeCore(pr); - - if (argc == 2 && !strcmp(argv[1], "--lazy-new-module-dump")) { - return llvm_module_dump(true, true); - } else if (argc == 2 && !strcmp(argv[1], "--new-module-dump")) { - return llvm_module_dump(false, true); - } else if (argc == 2 && !strcmp(argv[1], "--lazy-module-dump")) { - return llvm_module_dump(true, false); - } else if (argc == 2 && !strcmp(argv[1], "--module-dump")) { - return llvm_module_dump(false, false); - } else if (argc == 2 && !strcmp(argv[1], "--module-list-functions")) { - return llvm_module_list_functions(); - } else if (argc == 2 && !strcmp(argv[1], "--module-list-globals")) { - return llvm_module_list_globals(); - } else if (argc == 2 && !strcmp(argv[1], "--targets-list")) { - return llvm_targets_list(); - } else if (argc == 2 && !strcmp(argv[1], "--object-list-sections")) { - return llvm_object_list_sections(); - } else if (argc == 2 && !strcmp(argv[1], "--object-list-symbols")) { - return llvm_object_list_symbols(); - } else if (argc == 2 && !strcmp(argv[1], "--disassemble")) { - return llvm_disassemble(); - } else if (argc == 2 && !strcmp(argv[1], "--calc")) { - return llvm_calc(); - } else if (argc == 2 && !strcmp(argv[1], "--add-named-metadata-operand")) { - return llvm_add_named_metadata_operand(); - } else if (argc == 2 && !strcmp(argv[1], "--set-metadata")) { - return llvm_set_metadata(); - } else if (argc == 2 && !strcmp(argv[1], "--test-function-attributes")) { - return llvm_test_function_attributes(); - } else if (argc == 2 && !strcmp(argv[1], "--test-callsite-attributes")) { - return llvm_test_callsite_attributes(); - } else if (argc == 2 && !strcmp(argv[1], "--echo")) { - return llvm_echo(); - } else if (argc == 2 && !strcmp(argv[1], "--test-diagnostic-handler")) { - return llvm_test_diagnostic_handler(); - } else if (argc == 2 && !strcmp(argv[1], "--test-dibuilder")) { - return llvm_test_dibuilder(); - } else { - print_usage(); - } - - return 1; -} diff --git a/gnu/llvm/tools/llvm-c-test/metadata.c b/gnu/llvm/tools/llvm-c-test/metadata.c deleted file mode 100644 index 89215b8ebcb..00000000000 --- a/gnu/llvm/tools/llvm-c-test/metadata.c +++ /dev/null @@ -1,42 +0,0 @@ -/*===-- object.c - tool for testing libLLVM and llvm-c API ----------------===*\ -|* *| -|* The LLVM Compiler Infrastructure *| -|* *| -|* This file is distributed under the University of Illinois Open Source *| -|* License. See LICENSE.TXT for details. *| -|* *| -|*===----------------------------------------------------------------------===*| -|* *| -|* This file implements the --add-named-metadata-operand and --set-metadata *| -|* commands in llvm-c-test. *| -|* *| -\*===----------------------------------------------------------------------===*/ - -#include "llvm-c-test.h" - -int llvm_add_named_metadata_operand(void) { - LLVMModuleRef m = LLVMModuleCreateWithName("Mod"); - LLVMValueRef values[] = { LLVMConstInt(LLVMInt32Type(), 0, 0) }; - - // This used to trigger an assertion - LLVMAddNamedMetadataOperand(m, "name", LLVMMDNode(values, 1)); - - LLVMDisposeModule(m); - - return 0; -} - -int llvm_set_metadata(void) { - LLVMBuilderRef b = LLVMCreateBuilder(); - LLVMValueRef values[] = { LLVMConstInt(LLVMInt32Type(), 0, 0) }; - - // This used to trigger an assertion - LLVMSetMetadata( - LLVMBuildRetVoid(b), - LLVMGetMDKindID("kind", 4), - LLVMMDNode(values, 1)); - - LLVMDisposeBuilder(b); - - return 0; -} diff --git a/gnu/llvm/tools/llvm-c-test/module.c b/gnu/llvm/tools/llvm-c-test/module.c deleted file mode 100644 index cbb44d0bd15..00000000000 --- a/gnu/llvm/tools/llvm-c-test/module.c +++ /dev/null @@ -1,138 +0,0 @@ -/*===-- module.c - tool for testing libLLVM and llvm-c API ----------------===*\ -|* *| -|* The LLVM Compiler Infrastructure *| -|* *| -|* This file is distributed under the University of Illinois Open Source *| -|* License. See LICENSE.TXT for details. *| -|* *| -|*===----------------------------------------------------------------------===*| -|* *| -|* This file implements the --module-dump, --module-list-functions and *| -|* --module-list-globals commands in llvm-c-test. *| -|* *| -\*===----------------------------------------------------------------------===*/ - -#include "llvm-c-test.h" -#include "llvm-c/BitReader.h" -#include <stdio.h> -#include <stdlib.h> - -static void diagnosticHandler(LLVMDiagnosticInfoRef DI, void *C) { - char *CErr = LLVMGetDiagInfoDescription(DI); - fprintf(stderr, "Error with new bitcode parser: %s\n", CErr); - LLVMDisposeMessage(CErr); - exit(1); -} - -LLVMModuleRef llvm_load_module(bool Lazy, bool New) { - LLVMMemoryBufferRef MB; - LLVMModuleRef M; - char *msg = NULL; - - if (LLVMCreateMemoryBufferWithSTDIN(&MB, &msg)) { - fprintf(stderr, "Error reading file: %s\n", msg); - exit(1); - } - - LLVMBool Ret; - if (New) { - LLVMContextRef C = LLVMGetGlobalContext(); - LLVMContextSetDiagnosticHandler(C, diagnosticHandler, NULL); - if (Lazy) - Ret = LLVMGetBitcodeModule2(MB, &M); - else - Ret = LLVMParseBitcode2(MB, &M); - } else { - if (Lazy) - Ret = LLVMGetBitcodeModule(MB, &M, &msg); - else - Ret = LLVMParseBitcode(MB, &M, &msg); - } - - if (Ret) { - fprintf(stderr, "Error parsing bitcode: %s\n", msg); - LLVMDisposeMemoryBuffer(MB); - exit(1); - } - - if (!Lazy) - LLVMDisposeMemoryBuffer(MB); - - return M; -} - -int llvm_module_dump(bool Lazy, bool New) { - LLVMModuleRef M = llvm_load_module(Lazy, New); - - char *irstr = LLVMPrintModuleToString(M); - puts(irstr); - LLVMDisposeMessage(irstr); - - LLVMDisposeModule(M); - - return 0; -} - -int llvm_module_list_functions(void) { - LLVMModuleRef M = llvm_load_module(false, false); - LLVMValueRef f; - - f = LLVMGetFirstFunction(M); - while (f) { - if (LLVMIsDeclaration(f)) { - printf("FunctionDeclaration: %s\n", LLVMGetValueName(f)); - } else { - LLVMBasicBlockRef bb; - LLVMValueRef isn; - unsigned nisn = 0; - unsigned nbb = 0; - - printf("FunctionDefinition: %s [#bb=%u]\n", LLVMGetValueName(f), - LLVMCountBasicBlocks(f)); - - for (bb = LLVMGetFirstBasicBlock(f); bb; - bb = LLVMGetNextBasicBlock(bb)) { - nbb++; - for (isn = LLVMGetFirstInstruction(bb); isn; - isn = LLVMGetNextInstruction(isn)) { - nisn++; - if (LLVMIsACallInst(isn)) { - LLVMValueRef callee = - LLVMGetOperand(isn, LLVMGetNumOperands(isn) - 1); - printf(" calls: %s\n", LLVMGetValueName(callee)); - } - } - } - printf(" #isn: %u\n", nisn); - printf(" #bb: %u\n\n", nbb); - } - f = LLVMGetNextFunction(f); - } - - LLVMDisposeModule(M); - - return 0; -} - -int llvm_module_list_globals(void) { - LLVMModuleRef M = llvm_load_module(false, false); - LLVMValueRef g; - - g = LLVMGetFirstGlobal(M); - while (g) { - LLVMTypeRef T = LLVMTypeOf(g); - char *s = LLVMPrintTypeToString(T); - - printf("Global%s: %s %s\n", - LLVMIsDeclaration(g) ? "Declaration" : "Definition", - LLVMGetValueName(g), s); - - LLVMDisposeMessage(s); - - g = LLVMGetNextGlobal(g); - } - - LLVMDisposeModule(M); - - return 0; -} diff --git a/gnu/llvm/tools/llvm-c-test/object.c b/gnu/llvm/tools/llvm-c-test/object.c deleted file mode 100644 index 809ad54f872..00000000000 --- a/gnu/llvm/tools/llvm-c-test/object.c +++ /dev/null @@ -1,87 +0,0 @@ -/*===-- object.c - tool for testing libLLVM and llvm-c API ----------------===*\ -|* *| -|* The LLVM Compiler Infrastructure *| -|* *| -|* This file is distributed under the University of Illinois Open Source *| -|* License. See LICENSE.TXT for details. *| -|* *| -|*===----------------------------------------------------------------------===*| -|* *| -|* This file implements the --object-list-sections and --object-list-symbols *| -|* commands in llvm-c-test. *| -|* *| -\*===----------------------------------------------------------------------===*/ - -#include "llvm-c-test.h" -#include "llvm-c/Object.h" -#include <stdio.h> -#include <stdlib.h> - -int llvm_object_list_sections(void) { - LLVMMemoryBufferRef MB; - LLVMObjectFileRef O; - LLVMSectionIteratorRef sect; - char *msg = NULL; - - if (LLVMCreateMemoryBufferWithSTDIN(&MB, &msg)) { - fprintf(stderr, "Error reading file: %s\n", msg); - exit(1); - } - - O = LLVMCreateObjectFile(MB); - if (!O) { - fprintf(stderr, "Error reading object\n"); - exit(1); - } - - sect = LLVMGetSections(O); - while (!LLVMIsSectionIteratorAtEnd(O, sect)) { - printf("'%s': @0x%08" PRIx64 " +%" PRIu64 "\n", LLVMGetSectionName(sect), - LLVMGetSectionAddress(sect), LLVMGetSectionSize(sect)); - - LLVMMoveToNextSection(sect); - } - - LLVMDisposeSectionIterator(sect); - - LLVMDisposeObjectFile(O); - - return 0; -} - -int llvm_object_list_symbols(void) { - LLVMMemoryBufferRef MB; - LLVMObjectFileRef O; - LLVMSectionIteratorRef sect; - LLVMSymbolIteratorRef sym; - char *msg = NULL; - - if (LLVMCreateMemoryBufferWithSTDIN(&MB, &msg)) { - fprintf(stderr, "Error reading file: %s\n", msg); - exit(1); - } - - O = LLVMCreateObjectFile(MB); - if (!O) { - fprintf(stderr, "Error reading object\n"); - exit(1); - } - - sect = LLVMGetSections(O); - sym = LLVMGetSymbols(O); - while (!LLVMIsSymbolIteratorAtEnd(O, sym)) { - - LLVMMoveToContainingSection(sect, sym); - printf("%s @0x%08" PRIx64 " +%" PRIu64 " (%s)\n", LLVMGetSymbolName(sym), - LLVMGetSymbolAddress(sym), LLVMGetSymbolSize(sym), - LLVMGetSectionName(sect)); - - LLVMMoveToNextSymbol(sym); - } - - LLVMDisposeSymbolIterator(sym); - - LLVMDisposeObjectFile(O); - - return 0; -} diff --git a/gnu/llvm/tools/llvm-c-test/targets.c b/gnu/llvm/tools/llvm-c-test/targets.c deleted file mode 100644 index f2a9e924a74..00000000000 --- a/gnu/llvm/tools/llvm-c-test/targets.c +++ /dev/null @@ -1,30 +0,0 @@ -/*===-- targets.c - tool for testing libLLVM and llvm-c API ---------------===*\ -|* *| -|* The LLVM Compiler Infrastructure *| -|* *| -|* This file is distributed under the University of Illinois Open Source *| -|* License. See LICENSE.TXT for details. *| -|* *| -|*===----------------------------------------------------------------------===*| -|* *| -|* This file implements the --targets command in llvm-c-test. *| -|* *| -\*===----------------------------------------------------------------------===*/ - -#include "llvm-c/TargetMachine.h" -#include <stdio.h> - -int llvm_targets_list(void) { - LLVMTargetRef t; - LLVMInitializeAllTargetInfos(); - LLVMInitializeAllTargets(); - - for (t = LLVMGetFirstTarget(); t; t = LLVMGetNextTarget(t)) { - printf("%s", LLVMGetTargetName(t)); - if (LLVMTargetHasJIT(t)) - printf(" (+jit)"); - printf("\n - %s\n", LLVMGetTargetDescription(t)); - } - - return 0; -} |
