AlignOf.h revision ab4841805a6cfafbdc3aca774c967b12615b77f9
124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian//===--- AlignOf.h - Portable calculation of type alignment -----*- C++ -*-===// 224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian// 324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian// The LLVM Compiler Infrastructure 424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian// 524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian// This file was developed by Ted Kremenek and is distributed under 624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian// the University of Illinois Open Source License. See LICENSE.TXT for details. 724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian// 824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian//===----------------------------------------------------------------------===// 924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian// 1024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian// This file defines the AlignOf function that computes alignments for 1124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian// arbitrary types. 1224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian// 1324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian//===----------------------------------------------------------------------===// 1424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#ifndef LLVM_SUPPORT_ALIGNOF_H 1624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#define LLVM_SUPPORT_ALIGNOF_H 1724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include <cassert> 1924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 2024df8f895fe8807aa2ba058e71bd40adfc01d21eBriannamespace llvm { 2124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 2224df8f895fe8807aa2ba058e71bd40adfc01d21eBriantemplate <typename T> 2324df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstruct AlignmentCalcImpl { 2424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian char x; 2524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian T t; 2624df8f895fe8807aa2ba058e71bd40adfc01d21eBrianprivate: 2724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian AlignmentCalcImpl() {} // Never instantiate. 28f2c023291a1f2887294d2aac504f8b82857ad092Brian Paul}; 297b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul 30d055b2c001a0fb233f98c10d124b43dd2448059eBrian/// AlignOf - A templated class that contains an enum value representing 3124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian/// the alignment of the template argument. For example, 32b19e8f720bb2f4d360f5497b64901fc48321f172Brian Paul/// AlignOf<int>::Alignment represents the alignment of type "int". The 3324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian/// alignment calculated is the minimum alignment, and not necessarily 3465d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul/// the "desired" alignment returned by GCC's __alignof__ (for example). Note 3545e76d2665b38ba3787548310efc59e969124c01Brian Paul/// that because the alignment is an enum value, it can be used as a 3624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian/// compile-time constant (e.g., for template instantiation). 37f2c023291a1f2887294d2aac504f8b82857ad092Brian Paultemplate <typename T> 3824df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstruct AlignOf { 392440ff74d69a8caf49b05a960b4c7e282a96565eBrian enum { Alignment = sizeof(AlignmentCalcImpl<T>) - sizeof(T) }; 4024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian}; 414ca9ba254462b9be55b78df1d50519e10b2f4d73Brian Paul 42a4bec69e7271eda0137874973aa8c7d44175fedfBrian Paul} // end namespace llvm 4324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#endif 4424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian