Target.cpp revision 249423
131492Swollman//===-- Target.cpp --------------------------------------------------------===//
231492Swollman//
331492Swollman//                     The LLVM Compiler Infrastructure
431492Swollman//
531492Swollman// This file is distributed under the University of Illinois Open Source
631492Swollman// License. See LICENSE.TXT for details.
731492Swollman//
831492Swollman//===----------------------------------------------------------------------===//
931492Swollman//
1031492Swollman// This file implements the common infrastructure (including C bindings) for
1131492Swollman// libLLVMTarget.a, which implements target information.
1231492Swollman//
1331492Swollman//===----------------------------------------------------------------------===//
1431492Swollman
1531492Swollman#include "llvm-c/Target.h"
1631492Swollman#include "llvm-c/Initialization.h"
1731492Swollman#include "llvm/IR/DataLayout.h"
1831492Swollman#include "llvm/IR/LLVMContext.h"
1931492Swollman#include "llvm/InitializePasses.h"
2031492Swollman#include "llvm/PassManager.h"
2131492Swollman#include "llvm/Target/TargetLibraryInfo.h"
2231492Swollman#include <cstring>
2331492Swollman
2431492Swollmanusing namespace llvm;
2531492Swollman
2631492Swollmanvoid llvm::initializeTarget(PassRegistry &Registry) {
2731492Swollman  initializeDataLayoutPass(Registry);
2831492Swollman  initializeTargetLibraryInfoPass(Registry);
2931492Swollman}
3031492Swollman
3131492Swollmanvoid LLVMInitializeTarget(LLVMPassRegistryRef R) {
3231492Swollman  initializeTarget(*unwrap(R));
3331492Swollman}
3431492Swollman
3531492SwollmanLLVMTargetDataRef LLVMCreateTargetData(const char *StringRep) {
3631492Swollman  return wrap(new DataLayout(StringRep));
3731492Swollman}
3831492Swollman
39117590Sgadvoid LLVMAddTargetData(LLVMTargetDataRef TD, LLVMPassManagerRef PM) {
40117590Sgad  unwrap(PM)->add(new DataLayout(*unwrap(TD)));
41117590Sgad}
42117590Sgad
43117590Sgadvoid LLVMAddTargetLibraryInfo(LLVMTargetLibraryInfoRef TLI,
44117590Sgad                              LLVMPassManagerRef PM) {
45117541Sgad  unwrap(PM)->add(new TargetLibraryInfo(*unwrap(TLI)));
46117541Sgad}
4731492Swollman
4831492Swollmanchar *LLVMCopyStringRepOfTargetData(LLVMTargetDataRef TD) {
4931492Swollman  std::string StringRep = unwrap(TD)->getStringRepresentation();
5031492Swollman  return strdup(StringRep.c_str());
5131492Swollman}
5231492Swollman
5331492SwollmanLLVMByteOrdering LLVMByteOrder(LLVMTargetDataRef TD) {
5431492Swollman  return unwrap(TD)->isLittleEndian() ? LLVMLittleEndian : LLVMBigEndian;
5531492Swollman}
5631492Swollman
5731492Swollmanunsigned LLVMPointerSize(LLVMTargetDataRef TD) {
5831492Swollman  return unwrap(TD)->getPointerSize(0);
5931492Swollman}
6031492Swollman
6131492Swollmanunsigned LLVMPointerSizeForAS(LLVMTargetDataRef TD, unsigned AS) {
6231492Swollman  return unwrap(TD)->getPointerSize(AS);
6378146Sgad}
6431492Swollman
6578146SgadLLVMTypeRef LLVMIntPtrType(LLVMTargetDataRef TD) {
6678146Sgad  return wrap(unwrap(TD)->getIntPtrType(getGlobalContext()));
6778146Sgad}
6878146Sgad
6978146SgadLLVMTypeRef LLVMIntPtrTypeForAS(LLVMTargetDataRef TD, unsigned AS) {
7078146Sgad  return wrap(unwrap(TD)->getIntPtrType(getGlobalContext(), AS));
7178146Sgad}
7278146Sgad
7331492Swollmanunsigned long long LLVMSizeOfTypeInBits(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
7431492Swollman  return unwrap(TD)->getTypeSizeInBits(unwrap(Ty));
7531492Swollman}
7631492Swollman
7731492Swollmanunsigned long long LLVMStoreSizeOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
7831492Swollman  return unwrap(TD)->getTypeStoreSize(unwrap(Ty));
7931492Swollman}
8031492Swollman
8131492Swollmanunsigned long long LLVMABISizeOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
8231492Swollman  return unwrap(TD)->getTypeAllocSize(unwrap(Ty));
8331492Swollman}
8431492Swollman
8531492Swollmanunsigned LLVMABIAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
8631492Swollman  return unwrap(TD)->getABITypeAlignment(unwrap(Ty));
8731492Swollman}
8831492Swollman
8931492Swollmanunsigned LLVMCallFrameAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
9031492Swollman  return unwrap(TD)->getCallFrameTypeAlignment(unwrap(Ty));
9131492Swollman}
9231492Swollman
9331492Swollmanunsigned LLVMPreferredAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
9431492Swollman  return unwrap(TD)->getPrefTypeAlignment(unwrap(Ty));
9531492Swollman}
9631492Swollman
9731492Swollmanunsigned LLVMPreferredAlignmentOfGlobal(LLVMTargetDataRef TD,
9831492Swollman                                        LLVMValueRef GlobalVar) {
9931492Swollman  return unwrap(TD)->getPreferredAlignment(unwrap<GlobalVariable>(GlobalVar));
10031492Swollman}
10131492Swollman
10231492Swollmanunsigned LLVMElementAtOffset(LLVMTargetDataRef TD, LLVMTypeRef StructTy,
10331492Swollman                             unsigned long long Offset) {
10431492Swollman  StructType *STy = unwrap<StructType>(StructTy);
10531492Swollman  return unwrap(TD)->getStructLayout(STy)->getElementContainingOffset(Offset);
10631492Swollman}
10731492Swollman
10831492Swollmanunsigned long long LLVMOffsetOfElement(LLVMTargetDataRef TD, LLVMTypeRef StructTy,
10931492Swollman                                       unsigned Element) {
11031492Swollman  StructType *STy = unwrap<StructType>(StructTy);
11131492Swollman  return unwrap(TD)->getStructLayout(STy)->getElementOffset(Element);
11231492Swollman}
11331492Swollman
11431492Swollmanvoid LLVMDisposeTargetData(LLVMTargetDataRef TD) {
11531492Swollman  delete unwrap(TD);
11631492Swollman}
11731492Swollman