diff options
author | Faisal Vali <faisalv@yahoo.com> | 2017-09-28 01:50:23 +0000 |
---|---|---|
committer | Faisal Vali <faisalv@yahoo.com> | 2017-09-28 01:50:23 +0000 |
commit | 02d8dde149a2f74119421617b51ff40b89286da3 (patch) | |
tree | 930de5e9325f9b02a95efbfe14b1395a0e5b3948 /clang/lib/Lex/MacroArgs.cpp | |
parent | 8c9ecc50109ef8d0ff623f7ae4771e2fd7da1200 (diff) | |
download | bcm5719-llvm-02d8dde149a2f74119421617b51ff40b89286da3.tar.gz bcm5719-llvm-02d8dde149a2f74119421617b51ff40b89286da3.zip |
[NFC] Modernize MacroArgs using TrailingObjects
Refactor MacroArgs to use TrailingObjects when creating a variably sized object on the heap to store the unexpanded tokens immediately after the MacroArgs object.
llvm-svn: 314372
Diffstat (limited to 'clang/lib/Lex/MacroArgs.cpp')
-rw-r--r-- | clang/lib/Lex/MacroArgs.cpp | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/clang/lib/Lex/MacroArgs.cpp b/clang/lib/Lex/MacroArgs.cpp index f791d8d4bac..c816fee085d 100644 --- a/clang/lib/Lex/MacroArgs.cpp +++ b/clang/lib/Lex/MacroArgs.cpp @@ -33,7 +33,7 @@ MacroArgs *MacroArgs::create(const MacroInfo *MI, // See if we have an entry with a big enough argument list to reuse on the // free list. If so, reuse it. for (MacroArgs **Entry = &PP.MacroArgCache; *Entry; - Entry = &(*Entry)->ArgCache) + Entry = &(*Entry)->ArgCache) { if ((*Entry)->NumUnexpArgTokens >= UnexpArgTokens.size() && (*Entry)->NumUnexpArgTokens < ClosestMatch) { ResultEnt = Entry; @@ -44,14 +44,12 @@ MacroArgs *MacroArgs::create(const MacroInfo *MI, // Otherwise, use the best fit. ClosestMatch = (*Entry)->NumUnexpArgTokens; } - + } MacroArgs *Result; if (!ResultEnt) { - // Allocate memory for a MacroArgs object with the lexer tokens at the end. - Result = (MacroArgs *)malloc(sizeof(MacroArgs) + - UnexpArgTokens.size() * sizeof(Token)); - // Construct the MacroArgs object. - new (Result) + // Allocate memory for a MacroArgs object with the lexer tokens at the end, + // and construct the MacroArgs object. + Result = new (std::malloc(totalSizeToAlloc<Token>(UnexpArgTokens.size()))) MacroArgs(UnexpArgTokens.size(), VarargsElided, MI->getNumParams()); } else { Result = *ResultEnt; @@ -63,9 +61,14 @@ MacroArgs *MacroArgs::create(const MacroInfo *MI, } // Copy the actual unexpanded tokens to immediately after the result ptr. - if (!UnexpArgTokens.empty()) + if (!UnexpArgTokens.empty()) { + static_assert(std::is_trivially_copyable_v<Token>, + "assume trivial copyability if copying into the " + "uninitialized array (as opposed to reusing a cached " + "MacroArgs)"); std::copy(UnexpArgTokens.begin(), UnexpArgTokens.end(), - const_cast<Token*>(Result->getUnexpArgument(0))); + Result->getTrailingObjects<Token>()); + } return Result; } @@ -93,6 +96,8 @@ MacroArgs *MacroArgs::deallocate() { // Run the dtor to deallocate the vectors. this->~MacroArgs(); // Release the memory for the object. + static_assert(std::is_trivially_destructible_v<Token>, + "assume trivially destructible and forego destructors"); free(this); return Next; @@ -115,7 +120,7 @@ unsigned MacroArgs::getArgLength(const Token *ArgPtr) { const Token *MacroArgs::getUnexpArgument(unsigned Arg) const { // The unexpanded argument tokens start immediately after the MacroArgs object // in memory. - const Token *Start = (const Token *)(this+1); + const Token *Start = getTrailingObjects<Token>(); const Token *Result = Start; // Scan to find Arg. for (; Arg; ++Result) { |