//===- llvm/DataLayout.h - Data size & alignment info -----------*- C++ -*-===// // // 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 defines layout properties related to datatype size/offset/alignment // information. It uses lazy annotations to cache information about how // structure types are laid out and used. // // This structure should be created once, filled in if the defaults are not // correct and then passed around by const&. None of the members functions // require modification to the object. // //===----------------------------------------------------------------------===// #ifndef LLVM_IR_DATALAYOUT_H #define LLVM_IR_DATALAYOUT_H #include "llvm/ADT/APInt.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" #include "llvm/IR/DerivedTypes.h" #include "llvm/IR/Type.h" #include "llvm/Support/Alignment.h" #include "llvm/Support/Casting.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/MathExtras.h" #include "llvm/Support/TrailingObjects.h" #include "llvm/Support/TypeSize.h" #include <cassert> #include <cstdint> #include <string> // This needs to be outside of the namespace, to avoid conflict with llvm-c // decl. LLVMTargetDataRef; namespace llvm { class GlobalVariable; class LLVMContext; class StructLayout; class Triple; class Value; // FIXME: Currently the DataLayout string carries a "preferred alignment" // for types. As the DataLayout is module/global, this should likely be // sunk down to an FTTI element that is queried rather than a global // preference. /// A parsed version of the target data layout string in and methods for /// querying it. /// /// The target data layout string is specified *by the target* - a frontend /// generating LLVM IR is required to generate the right target data for the /// target being codegen'd to. class DataLayout { … }; inline DataLayout *unwrap(LLVMTargetDataRef P) { … } inline LLVMTargetDataRef wrap(const DataLayout *P) { … } /// Used to lazily calculate structure layout information for a target machine, /// based on the DataLayout structure. class StructLayout final : public TrailingObjects<StructLayout, TypeSize> { … }; // The implementation of this method is provided inline as it is particularly // well suited to constant folding when called on a specific Type subclass. inline TypeSize DataLayout::getTypeSizeInBits(Type *Ty) const { … } } // end namespace llvm #endif // LLVM_IR_DATALAYOUT_H