|  | //===-- Target.cpp --------------------------------------------------------===// | 
|  | // | 
|  | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
|  | // See https://llvm.org/LICENSE.txt for license information. | 
|  | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | // This file implements the common infrastructure (including C bindings) for | 
|  | // libLLVMTarget.a, which implements target information. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #include "llvm-c/Target.h" | 
|  | #include "llvm-c/Initialization.h" | 
|  | #include "llvm/Analysis/TargetLibraryInfo.h" | 
|  | #include "llvm/IR/DataLayout.h" | 
|  | #include "llvm/IR/LLVMContext.h" | 
|  | #include "llvm/IR/LegacyPassManager.h" | 
|  | #include "llvm/IR/Value.h" | 
|  | #include "llvm/InitializePasses.h" | 
|  | #include <cstring> | 
|  |  | 
|  | using namespace llvm; | 
|  |  | 
|  | // Avoid including "llvm-c/Core.h" for compile time, fwd-declare this instead. | 
|  | extern "C" LLVMContextRef LLVMGetGlobalContext(void); | 
|  |  | 
|  | inline TargetLibraryInfoImpl *unwrap(LLVMTargetLibraryInfoRef P) { | 
|  | return reinterpret_cast<TargetLibraryInfoImpl*>(P); | 
|  | } | 
|  |  | 
|  | inline LLVMTargetLibraryInfoRef wrap(const TargetLibraryInfoImpl *P) { | 
|  | TargetLibraryInfoImpl *X = const_cast<TargetLibraryInfoImpl*>(P); | 
|  | return reinterpret_cast<LLVMTargetLibraryInfoRef>(X); | 
|  | } | 
|  |  | 
|  | void llvm::initializeTarget(PassRegistry &Registry) { | 
|  | initializeTargetLibraryInfoWrapperPassPass(Registry); | 
|  | initializeTargetTransformInfoWrapperPassPass(Registry); | 
|  | } | 
|  |  | 
|  | void LLVMInitializeTarget(LLVMPassRegistryRef R) { | 
|  | initializeTarget(*unwrap(R)); | 
|  | } | 
|  |  | 
|  | LLVMTargetDataRef LLVMGetModuleDataLayout(LLVMModuleRef M) { | 
|  | return wrap(&unwrap(M)->getDataLayout()); | 
|  | } | 
|  |  | 
|  | void LLVMSetModuleDataLayout(LLVMModuleRef M, LLVMTargetDataRef DL) { | 
|  | unwrap(M)->setDataLayout(*unwrap(DL)); | 
|  | } | 
|  |  | 
|  | LLVMTargetDataRef LLVMCreateTargetData(const char *StringRep) { | 
|  | return wrap(new DataLayout(StringRep)); | 
|  | } | 
|  |  | 
|  | void LLVMDisposeTargetData(LLVMTargetDataRef TD) { | 
|  | delete unwrap(TD); | 
|  | } | 
|  |  | 
|  | void LLVMAddTargetLibraryInfo(LLVMTargetLibraryInfoRef TLI, | 
|  | LLVMPassManagerRef PM) { | 
|  | unwrap(PM)->add(new TargetLibraryInfoWrapperPass(*unwrap(TLI))); | 
|  | } | 
|  |  | 
|  | char *LLVMCopyStringRepOfTargetData(LLVMTargetDataRef TD) { | 
|  | std::string StringRep = unwrap(TD)->getStringRepresentation(); | 
|  | return strdup(StringRep.c_str()); | 
|  | } | 
|  |  | 
|  | LLVMByteOrdering LLVMByteOrder(LLVMTargetDataRef TD) { | 
|  | return unwrap(TD)->isLittleEndian() ? LLVMLittleEndian : LLVMBigEndian; | 
|  | } | 
|  |  | 
|  | unsigned LLVMPointerSize(LLVMTargetDataRef TD) { | 
|  | return unwrap(TD)->getPointerSize(0); | 
|  | } | 
|  |  | 
|  | unsigned LLVMPointerSizeForAS(LLVMTargetDataRef TD, unsigned AS) { | 
|  | return unwrap(TD)->getPointerSize(AS); | 
|  | } | 
|  |  | 
|  | LLVMTypeRef LLVMIntPtrType(LLVMTargetDataRef TD) { | 
|  | return wrap(unwrap(TD)->getIntPtrType(*unwrap(LLVMGetGlobalContext()))); | 
|  | } | 
|  |  | 
|  | LLVMTypeRef LLVMIntPtrTypeForAS(LLVMTargetDataRef TD, unsigned AS) { | 
|  | return wrap(unwrap(TD)->getIntPtrType(*unwrap(LLVMGetGlobalContext()), AS)); | 
|  | } | 
|  |  | 
|  | LLVMTypeRef LLVMIntPtrTypeInContext(LLVMContextRef C, LLVMTargetDataRef TD) { | 
|  | return wrap(unwrap(TD)->getIntPtrType(*unwrap(C))); | 
|  | } | 
|  |  | 
|  | LLVMTypeRef LLVMIntPtrTypeForASInContext(LLVMContextRef C, LLVMTargetDataRef TD, unsigned AS) { | 
|  | return wrap(unwrap(TD)->getIntPtrType(*unwrap(C), AS)); | 
|  | } | 
|  |  | 
|  | unsigned long long LLVMSizeOfTypeInBits(LLVMTargetDataRef TD, LLVMTypeRef Ty) { | 
|  | return unwrap(TD)->getTypeSizeInBits(unwrap(Ty)); | 
|  | } | 
|  |  | 
|  | unsigned long long LLVMStoreSizeOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) { | 
|  | return unwrap(TD)->getTypeStoreSize(unwrap(Ty)); | 
|  | } | 
|  |  | 
|  | unsigned long long LLVMABISizeOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) { | 
|  | return unwrap(TD)->getTypeAllocSize(unwrap(Ty)); | 
|  | } | 
|  |  | 
|  | unsigned LLVMABIAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) { | 
|  | return unwrap(TD)->getABITypeAlignment(unwrap(Ty)); | 
|  | } | 
|  |  | 
|  | unsigned LLVMCallFrameAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) { | 
|  | return unwrap(TD)->getABITypeAlignment(unwrap(Ty)); | 
|  | } | 
|  |  | 
|  | unsigned LLVMPreferredAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) { | 
|  | return unwrap(TD)->getPrefTypeAlignment(unwrap(Ty)); | 
|  | } | 
|  |  | 
|  | unsigned LLVMPreferredAlignmentOfGlobal(LLVMTargetDataRef TD, | 
|  | LLVMValueRef GlobalVar) { | 
|  | return unwrap(TD)->getPreferredAlignment(unwrap<GlobalVariable>(GlobalVar)); | 
|  | } | 
|  |  | 
|  | unsigned LLVMElementAtOffset(LLVMTargetDataRef TD, LLVMTypeRef StructTy, | 
|  | unsigned long long Offset) { | 
|  | StructType *STy = unwrap<StructType>(StructTy); | 
|  | return unwrap(TD)->getStructLayout(STy)->getElementContainingOffset(Offset); | 
|  | } | 
|  |  | 
|  | unsigned long long LLVMOffsetOfElement(LLVMTargetDataRef TD, LLVMTypeRef StructTy, | 
|  | unsigned Element) { | 
|  | StructType *STy = unwrap<StructType>(StructTy); | 
|  | return unwrap(TD)->getStructLayout(STy)->getElementOffset(Element); | 
|  | } |