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