Skip to content

Commit 2227f8e

Browse files
DougGregorcompnerd
authored andcommitted
[Macros] Replace use of free for Swift-allocated pointer
We cannot depend on Swift's unsafe pointers using `malloc` under the hood, so don't use `free` on them. Instead, expose entry points from Swift to C++ to free any Swift-allocated data structures that need to be deallocated from C++.
1 parent 89067bf commit 2227f8e

File tree

2 files changed

+22
-4
lines changed

2 files changed

+22
-4
lines changed

lib/ASTGen/Sources/ASTGen/Macros.swift

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,11 @@ func allocateUTF8String(
167167
}
168168
}
169169

170+
@_cdecl("swift_ASTGen_freeString")
171+
public func freeString(pointer: UnsafePointer<UInt8>?) {
172+
pointer?.deallocate()
173+
}
174+
170175
/// Diagnostics produced here.
171176
enum ASTGenMacroDiagnostic: DiagnosticMessage, FixItMessage {
172177
case thrownError(Error)
@@ -410,6 +415,14 @@ func checkMacroDefinition(
410415
}
411416
}
412417

418+
@_cdecl("swift_ASTGen_freeExpansionReplacements")
419+
public func freeExpansionReplacements(
420+
pointer: UnsafeMutablePointer<Int>?,
421+
numReplacements: Int
422+
) {
423+
UnsafeMutableBufferPointer(start: pointer, count: numReplacements).deallocate()
424+
}
425+
413426
// Make an expansion result for '@_cdecl' function caller.
414427
func makeExpansionOutputResult(
415428
expandedSource: String?,

lib/Sema/TypeCheckMacros.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ using namespace swift;
4949
extern "C" void *swift_ASTGen_resolveMacroType(const void *macroType);
5050
extern "C" void swift_ASTGen_destroyMacro(void *macro);
5151

52+
extern "C" void swift_ASTGen_freeString(const char *str);
53+
5254
extern "C" void *swift_ASTGen_resolveExecutableMacro(
5355
const char *moduleName, ptrdiff_t moduleNameLength,
5456
const char *typeName, ptrdiff_t typeNameLength,
@@ -64,6 +66,9 @@ extern "C" ptrdiff_t swift_ASTGen_checkMacroDefinition(
6466
ptrdiff_t **replacementsPtr,
6567
ptrdiff_t *numReplacements
6668
);
69+
extern "C" void swift_ASTGen_freeExpansionReplacements(
70+
ptrdiff_t *replacementsPtr,
71+
ptrdiff_t numReplacements);
6772

6873
extern "C" ptrdiff_t swift_ASTGen_expandFreestandingMacro(
6974
void *diagEngine, void *macro, uint8_t externalKind,
@@ -197,8 +202,8 @@ MacroDefinition MacroDefinitionRequest::evaluate(
197202

198203
// Clean up after the call.
199204
SWIFT_DEFER {
200-
free(externalMacroNamePtr);
201-
free(replacements);
205+
swift_ASTGen_freeString(externalMacroNamePtr);
206+
swift_ASTGen_freeExpansionReplacements(replacements, numReplacements);
202207
};
203208

204209
if (checkResult < 0 && ctx.CompletionCallback) {
@@ -1054,7 +1059,7 @@ evaluateFreestandingMacro(FreestandingMacroExpansion *expansion,
10541059
evaluatedSource = llvm::MemoryBuffer::getMemBufferCopy(
10551060
{evaluatedSourceAddress, (size_t)evaluatedSourceLength},
10561061
adjustMacroExpansionBufferName(*discriminator));
1057-
free((void *)evaluatedSourceAddress);
1062+
swift_ASTGen_freeString(evaluatedSourceAddress);
10581063
break;
10591064
#else
10601065
ctx.Diags.diagnose(loc, diag::macro_unsupported);
@@ -1333,7 +1338,7 @@ static SourceFile *evaluateAttachedMacro(MacroDecl *macro, Decl *attachedTo,
13331338
evaluatedSource = llvm::MemoryBuffer::getMemBufferCopy(
13341339
{evaluatedSourceAddress, (size_t)evaluatedSourceLength},
13351340
adjustMacroExpansionBufferName(*discriminator));
1336-
free((void *)evaluatedSourceAddress);
1341+
swift_ASTGen_freeString(evaluatedSourceAddress);
13371342
break;
13381343
#else
13391344
attachedTo->diagnose(diag::macro_unsupported);

0 commit comments

Comments
 (0)