diff options
| author | Benjamin Kramer <benny.kra@googlemail.com> | 2012-02-26 18:34:12 +0000 |
|---|---|---|
| committer | Benjamin Kramer <benny.kra@googlemail.com> | 2012-02-26 18:34:12 +0000 |
| commit | 441607ddcbc6cef890c114d099af9ef643b6001d (patch) | |
| tree | effa8c5d0dbe696d1c625d72cb259629bb35c84f | |
| parent | 74f011db76c7879257b9ee26e84353b03d63575f (diff) | |
| download | bcm5719-llvm-441607ddcbc6cef890c114d099af9ef643b6001d.tar.gz bcm5719-llvm-441607ddcbc6cef890c114d099af9ef643b6001d.zip | |
Make clever use of padding to shrink IntegerLiterals.
Inheritance allows us to use padding across classes.
40 -> 32 bytes on x86_64.
llvm-svn: 151499
| -rw-r--r-- | clang/include/clang/AST/Expr.h | 11 |
1 files changed, 4 insertions, 7 deletions
diff --git a/clang/include/clang/AST/Expr.h b/clang/include/clang/AST/Expr.h index a3225dfdfff..90f8bcdb805 100644 --- a/clang/include/clang/AST/Expr.h +++ b/clang/include/clang/AST/Expr.h @@ -1085,11 +1085,11 @@ public: /// the APFloat/APInt values will never get freed. APNumericStorage uses /// ASTContext's allocator for memory allocation. class APNumericStorage { - unsigned BitWidth; union { uint64_t VAL; ///< Used to store the <= 64 bits integer value. uint64_t *pVal; ///< Used to store the >64 bits integer value. }; + unsigned BitWidth; bool hasAllocation() const { return llvm::APInt::getNumWords(BitWidth) > 1; } @@ -1097,7 +1097,7 @@ class APNumericStorage { APNumericStorage& operator=(const APNumericStorage&); // do not implement protected: - APNumericStorage() : BitWidth(0), VAL(0) { } + APNumericStorage() : VAL(0), BitWidth(0) { } llvm::APInt getIntValue() const { unsigned NumWords = llvm::APInt::getNumWords(BitWidth); @@ -1109,7 +1109,7 @@ protected: void setIntValue(ASTContext &C, const llvm::APInt &Val); }; -class APIntStorage : public APNumericStorage { +class APIntStorage : private APNumericStorage { public: llvm::APInt getValue() const { return getIntValue(); } void setValue(ASTContext &C, const llvm::APInt &Val) { setIntValue(C, Val); } @@ -1125,8 +1125,7 @@ public: } }; -class IntegerLiteral : public Expr { - APIntStorage Num; +class IntegerLiteral : public Expr, public APIntStorage { SourceLocation Loc; /// \brief Construct an empty integer literal. @@ -1156,13 +1155,11 @@ public: /// \brief Returns a new empty integer literal. static IntegerLiteral *Create(ASTContext &C, EmptyShell Empty); - llvm::APInt getValue() const { return Num.getValue(); } SourceRange getSourceRange() const { return SourceRange(Loc); } /// \brief Retrieve the location of the literal. SourceLocation getLocation() const { return Loc; } - void setValue(ASTContext &C, const llvm::APInt &Val) { Num.setValue(C, Val); } void setLocation(SourceLocation Location) { Loc = Location; } static bool classof(const Stmt *T) { |

