]> granicus.if.org Git - clang/commitdiff
Eek! getDeclAlign sometimes returned alignment in bits.
authorDaniel Dunbar <daniel@zuster.org>
Tue, 17 Feb 2009 22:16:19 +0000 (22:16 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Tue, 17 Feb 2009 22:16:19 +0000 (22:16 +0000)
 - Renamed to getDeclAlignInBytes since most other query functions
   work in bits.

 - Fun to track down as isIntegerConstantExpr was getting it right,
   but Evaluate() was getting it wrong. Maybe we should assert they
   compute the same thing when they succeed?

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64828 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/ASTContext.h
lib/AST/ASTContext.cpp
lib/AST/ExprConstant.cpp
test/CodeGen/alignof.c [new file with mode: 0644]

index 4bc5b7a54cdbb283081300e13bcdc4c8185b89fa..0cb2b35f5a17931ab9d6eaa5b0a05ba921024b30 100644 (file)
@@ -434,10 +434,10 @@ public:
   /// a data type.
   unsigned getPreferredTypeAlign(const Type *T);
   
-  /// getDeclAlign - Return the alignment of the specified decl that should be
-  /// returned by __alignof().  Note that bitfields do not have a valid
-  /// alignment, so this method will assert on them.
-  unsigned getDeclAlign(const Decl *D);
+  /// getDeclAlignInBytes - Return the alignment of the specified decl
+  /// that should be returned by __alignof().  Note that bitfields do
+  /// not have a valid alignment, so this method will assert on them.
+  unsigned getDeclAlignInBytes(const Decl *D);
   
   /// getASTRecordLayout - Get or compute information about the layout of the
   /// specified record (struct/union/class), which indicates its size and field
index c87b08627ddef35e320e8d86350f9441defe4c0a..4a3f00f356aa53a50ea9b76a7c20b11472225207 100644 (file)
@@ -263,7 +263,7 @@ const llvm::fltSemantics &ASTContext::getFloatTypeSemantics(QualType T) const {
 /// getDeclAlign - Return a conservative estimate of the alignment of the
 /// specified decl.  Note that bitfields do not have a valid alignment, so
 /// this method will assert on them.
-unsigned ASTContext::getDeclAlign(const Decl *D) {
+unsigned ASTContext::getDeclAlignInBytes(const Decl *D) {
   // FIXME: If attribute(align) is specified on the decl, round up to it.
   
   if (const ValueDecl *VD = dyn_cast<ValueDecl>(D)) {
@@ -275,7 +275,7 @@ unsigned ASTContext::getDeclAlign(const Decl *D) {
     while (isa<VariableArrayType>(T) || isa<IncompleteArrayType>(T))
       T = cast<ArrayType>(T)->getElementType();
     
-    return getTypeAlign(T);
+    return getTypeAlign(T) / Target.getCharWidth();
   }
   
   return 1;
index 7b3e64908a4f1eba33e42932165634f2e5c5fc3e..ad83e372b460ce055e6223124f7c68a1c156a52b 100644 (file)
@@ -981,10 +981,10 @@ unsigned IntExprEvaluator::GetAlignOfExpr(const Expr *E) {
   // alignof decl is always accepted, even if it doesn't make sense: we default
   // to 1 in those cases. 
   if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
-    return Info.Ctx.getDeclAlign(DRE->getDecl());
+    return Info.Ctx.getDeclAlignInBytes(DRE->getDecl());
     
   if (const MemberExpr *ME = dyn_cast<MemberExpr>(E))
-    return Info.Ctx.getDeclAlign(ME->getMemberDecl());
+    return Info.Ctx.getDeclAlignInBytes(ME->getMemberDecl());
 
   return GetAlignOfType(E->getType());
 }
diff --git a/test/CodeGen/alignof.c b/test/CodeGen/alignof.c
new file mode 100644 (file)
index 0000000..edeb0db
--- /dev/null
@@ -0,0 +1,12 @@
+// RUN: clang -triple i386-unknown-unknown -O1 -emit-llvm -o %t %s &&
+// RUN: grep 'ret i32 4' %t
+
+enum e0 { E0 };
+struct s0 {
+  enum e0         a:31;
+};
+
+struct s0 t1_tmp;
+int f0() {
+  return __alignof__(t1_tmp);
+}