Mercurial > projects > ldc
view tools/binding/llvm-ext.cpp @ 1650:40bd4a0d4870
Update to work with LLVM 2.7.
Removed use of dyn_cast, llvm no compiles
without exceptions and rtti by
default. We do need exceptions for the libconfig stuff, but rtti isn't
necessary (anymore).
Debug info needs to be rewritten, as in LLVM 2.7 the format has
completely changed. To have something to look at while rewriting, the
old code has been wrapped inside #ifndef DISABLE_DEBUG_INFO , this means
that you have to define this to compile at the moment.
Updated tango 0.99.9 patch to include updated EH runtime code, which is
needed for LLVM 2.7 as well.
author | Tomas Lindquist Olsen |
---|---|
date | Wed, 19 May 2010 12:42:32 +0200 |
parents | 1ba61de8796b |
children |
line wrap: on
line source
// Extension of the LLVM C interface for use with D, some things in the // LLVM 2.2 release are kind sparse or even broken... // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // #ifndef D11_LLVMCEXT_H #define D11_LLVMCEXT_H #include "llvm/Type.h" #include "llvm/Constants.h" #include "llvm/Support/CFG.h" #include "llvm/Target/TargetData.h" #include "llvm-c/Core.h" #include <sstream> #include <cstring> using namespace llvm; using namespace std; extern "C" { // we need to be able to erase an instruction from its parent void LLVMEraseFromParent(LLVMValueRef I) { unwrap<Instruction>(I)->eraseFromParent(); } // we need to be able to check if a basic block is terminated int LLVMIsTerminated(LLVMBasicBlockRef BB) { return (unwrap(BB)->getTerminator() != NULL); } // we need to be able to check if a basic block has any predecessors int LLVMHasPredecessors(LLVMBasicBlockRef BB) { BasicBlock* B = unwrap(BB); return (pred_begin(B) != pred_end(B)); } // we need to be able to check if a basic block is empty int LLVMIsBasicBlockEmpty(LLVMBasicBlockRef BB) { return unwrap(BB)->empty(); } // we need to be able to replace all uses of V with W void LLVMReplaceAllUsesWith(LLVMValueRef V, LLVMValueRef W) { unwrap<Value>(V)->replaceAllUsesWith(unwrap<Value>(W)); } // sometimes it's nice to be able to dump a type, not only values... void LLVMDumpType(LLVMTypeRef T) { unwrap(T)->dump(); } LLVMValueRef LLVMGetOrInsertFunction(LLVMModuleRef M, char* Name, LLVMTypeRef Type) { return wrap(unwrap(M)->getOrInsertFunction(Name, unwrap<FunctionType>(Type))); } // being able to determine the "kind" of a value is really useful unsigned LLVMGetValueKind(LLVMValueRef Value) { return unwrap(Value)->getValueID(); } char* LLVMValueToString(LLVMValueRef v) { stringstream ss; unwrap(v)->print(ss); return strdup(ss.str().c_str()); } char* LLVMTypeToString(LLVMTypeRef ty) { stringstream ss; unwrap(ty)->print(ss); return strdup(ss.str().c_str()); } LLVMTypeRef LLVMGetTypeByName(LLVMModuleRef M, char* Name) { return wrap(unwrap(M)->getTypeByName(Name)); } int LLVMIsTypeAbstract(LLVMTypeRef T) { return unwrap(T)->isAbstract(); } } // extern "C" #endif