Skip to content

Commit 4252148

Browse files
committed
[Macros] Create llvm::MemoryBuffer directly from macro expansion result
Saves one memory copy. No need to create a temporary NullTerminatedStringRef.
1 parent 43eabf1 commit 4252148

File tree

1 file changed

+24
-29
lines changed

1 file changed

+24
-29
lines changed

lib/Sema/TypeCheckMacros.cpp

Lines changed: 24 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -677,7 +677,7 @@ Expr *swift::expandMacroExpr(
677677
return nullptr;
678678

679679
// Evaluate the macro.
680-
NullTerminatedStringRef evaluatedSource;
680+
std::unique_ptr<llvm::MemoryBuffer> evaluatedSource;
681681

682682
MacroDecl *macro = cast<MacroDecl>(macroRef.getDecl());
683683

@@ -722,8 +722,7 @@ Expr *swift::expandMacroExpr(
722722
// Expand the definition with the given arguments.
723723
auto result = expandMacroDefinition(
724724
macroDef.getExpanded(), macro, expr->getArgs());
725-
llvm::MallocAllocator allocator;
726-
evaluatedSource = NullTerminatedStringRef(result, allocator);
725+
evaluatedSource = llvm::MemoryBuffer::getMemBufferCopy(result);
727726
break;
728727
}
729728

@@ -763,8 +762,9 @@ Expr *swift::expandMacroExpr(
763762
&evaluatedSourceLength);
764763
if (!evaluatedSourceAddress)
765764
return nullptr;
766-
evaluatedSource = NullTerminatedStringRef(evaluatedSourceAddress,
767-
(size_t)evaluatedSourceLength);
765+
evaluatedSource = llvm::MemoryBuffer::getMemBufferCopy(
766+
{evaluatedSourceAddress, (size_t)evaluatedSourceLength});
767+
free((void *)evaluatedSourceAddress);
768768
break;
769769
#else
770770
ctx.Diags.diagnose(expr->getLoc(), diag::macro_unsupported);
@@ -785,14 +785,13 @@ Expr *swift::expandMacroExpr(
785785
if (ctx.LangOpts.DumpMacroExpansions) {
786786
llvm::errs() << bufferName << " as " << expandedType.getString()
787787
<< "\n------------------------------\n"
788-
<< evaluatedSource
788+
<< evaluatedSource->getBuffer()
789789
<< "\n------------------------------\n";
790790
}
791791

792792
// Create a new source buffer with the contents of the expanded macro.
793-
auto macroBuffer =
794-
llvm::MemoryBuffer::getMemBufferCopy(evaluatedSource, bufferName);
795-
unsigned macroBufferID = sourceMgr.addNewSourceBuffer(std::move(macroBuffer));
793+
unsigned macroBufferID =
794+
sourceMgr.addNewSourceBuffer(std::move(evaluatedSource));
796795
auto macroBufferRange = sourceMgr.getRangeForBuffer(macroBufferID);
797796
GeneratedSourceInfo sourceInfo{
798797
GeneratedSourceInfo::ExpressionMacroExpansion,
@@ -803,7 +802,6 @@ Expr *swift::expandMacroExpr(
803802
dc
804803
};
805804
sourceMgr.setGeneratedSourceInfo(macroBufferID, sourceInfo);
806-
free((void*)evaluatedSource.data());
807805

808806
// Create a source file to hold the macro buffer. This is automatically
809807
// registered with the enclosing module.
@@ -866,7 +864,7 @@ swift::expandFreestandingMacro(MacroExpansionDecl *med) {
866864
return None;
867865

868866
// Evaluate the macro.
869-
NullTerminatedStringRef evaluatedSource;
867+
std::unique_ptr<llvm::MemoryBuffer> evaluatedSource;
870868

871869
MacroDecl *macro = cast<MacroDecl>(med->getMacroRef().getDecl());
872870
auto macroRoles = macro->getMacroRoles();
@@ -899,8 +897,7 @@ swift::expandFreestandingMacro(MacroExpansionDecl *med) {
899897
// Expand the definition with the given arguments.
900898
auto result = expandMacroDefinition(
901899
macroDef.getExpanded(), macro, med->getArgs());
902-
llvm::MallocAllocator allocator;
903-
evaluatedSource = NullTerminatedStringRef(result, allocator);
900+
evaluatedSource = llvm::MemoryBuffer::getMemBufferCopy(result);
904901
break;
905902
}
906903

@@ -958,8 +955,9 @@ swift::expandFreestandingMacro(MacroExpansionDecl *med) {
958955
&evaluatedSourceLength);
959956
if (!evaluatedSourceAddress)
960957
return None;
961-
evaluatedSource = NullTerminatedStringRef(evaluatedSourceAddress,
962-
(size_t)evaluatedSourceLength);
958+
evaluatedSource = llvm::MemoryBuffer::getMemBufferCopy(
959+
{evaluatedSourceAddress, (size_t)evaluatedSourceLength});
960+
free((void *)evaluatedSourceAddress);
963961
break;
964962
#else
965963
med->diagnose(diag::macro_unsupported);
@@ -980,14 +978,13 @@ swift::expandFreestandingMacro(MacroExpansionDecl *med) {
980978
if (ctx.LangOpts.DumpMacroExpansions) {
981979
llvm::errs() << bufferName
982980
<< "\n------------------------------\n"
983-
<< evaluatedSource
981+
<< evaluatedSource->getBuffer()
984982
<< "\n------------------------------\n";
985983
}
986984

987985
// Create a new source buffer with the contents of the expanded macro.
988-
auto macroBuffer =
989-
llvm::MemoryBuffer::getMemBufferCopy(evaluatedSource, bufferName);
990-
unsigned macroBufferID = sourceMgr.addNewSourceBuffer(std::move(macroBuffer));
986+
unsigned macroBufferID =
987+
sourceMgr.addNewSourceBuffer(std::move(evaluatedSource));
991988
auto macroBufferRange = sourceMgr.getRangeForBuffer(macroBufferID);
992989
GeneratedSourceInfo sourceInfo{
993990
GeneratedSourceInfo::FreestandingDeclMacroExpansion,
@@ -998,7 +995,6 @@ swift::expandFreestandingMacro(MacroExpansionDecl *med) {
998995
dc
999996
};
1000997
sourceMgr.setGeneratedSourceInfo(macroBufferID, sourceInfo);
1001-
free((void*)evaluatedSource.data());
1002998

1003999
// Create a source file to hold the macro buffer. This is automatically
10041000
// registered with the enclosing module.
@@ -1092,7 +1088,7 @@ evaluateAttachedMacro(MacroDecl *macro, Decl *attachedTo, CustomAttr *attr,
10921088
}
10931089

10941090
// Evaluate the macro.
1095-
NullTerminatedStringRef evaluatedSource;
1091+
std::unique_ptr<llvm::MemoryBuffer> evaluatedSource;
10961092

10971093
std::string discriminator;
10981094
auto macroDef = macro->getDefinition();
@@ -1115,7 +1111,7 @@ evaluateAttachedMacro(MacroDecl *macro, Decl *attachedTo, CustomAttr *attr,
11151111
auto result = expandMacroDefinition(
11161112
macroDef.getExpanded(), macro, attr->getArgs());
11171113
llvm::MallocAllocator allocator;
1118-
evaluatedSource = NullTerminatedStringRef(result, allocator);
1114+
evaluatedSource = llvm::MemoryBuffer::getMemBufferCopy(result);
11191115
break;
11201116
}
11211117

@@ -1179,8 +1175,9 @@ evaluateAttachedMacro(MacroDecl *macro, Decl *attachedTo, CustomAttr *attr,
11791175
&evaluatedSourceLength);
11801176
if (!evaluatedSourceAddress)
11811177
return nullptr;
1182-
evaluatedSource = NullTerminatedStringRef(evaluatedSourceAddress,
1183-
(size_t)evaluatedSourceLength);
1178+
evaluatedSource = llvm::MemoryBuffer::getMemBufferCopy(
1179+
{evaluatedSourceAddress, (size_t)evaluatedSourceLength});
1180+
free((void *)evaluatedSourceAddress);
11841181
break;
11851182
#else
11861183
attachedTo->diagnose(diag::macro_unsupported);
@@ -1196,7 +1193,7 @@ evaluateAttachedMacro(MacroDecl *macro, Decl *attachedTo, CustomAttr *attr,
11961193
if (ctx.LangOpts.DumpMacroExpansions) {
11971194
llvm::errs() << bufferName
11981195
<< "\n------------------------------\n"
1199-
<< evaluatedSource
1196+
<< evaluatedSource->getBuffer()
12001197
<< "\n------------------------------\n";
12011198
}
12021199

@@ -1284,9 +1281,8 @@ evaluateAttachedMacro(MacroDecl *macro, Decl *attachedTo, CustomAttr *attr,
12841281
}
12851282

12861283
// Create a new source buffer with the contents of the expanded macro.
1287-
auto macroBuffer =
1288-
llvm::MemoryBuffer::getMemBufferCopy(evaluatedSource, bufferName);
1289-
unsigned macroBufferID = sourceMgr.addNewSourceBuffer(std::move(macroBuffer));
1284+
unsigned macroBufferID =
1285+
sourceMgr.addNewSourceBuffer(std::move(evaluatedSource));
12901286
auto macroBufferRange = sourceMgr.getRangeForBuffer(macroBufferID);
12911287
GeneratedSourceInfo sourceInfo{
12921288
generatedSourceKind,
@@ -1297,7 +1293,6 @@ evaluateAttachedMacro(MacroDecl *macro, Decl *attachedTo, CustomAttr *attr,
12971293
attr
12981294
};
12991295
sourceMgr.setGeneratedSourceInfo(macroBufferID, sourceInfo);
1300-
free((void*)evaluatedSource.data());
13011296

13021297
// Create a source file to hold the macro buffer. This is automatically
13031298
// registered with the enclosing module.

0 commit comments

Comments
 (0)