Skip to content

Commit 97d5401

Browse files
committed
Swift: extract mangler into a separate class
1 parent 734001b commit 97d5401

File tree

7 files changed

+68
-23
lines changed

7 files changed

+68
-23
lines changed

swift/extractor/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ swift_cc_binary(
1212
"//swift/extractor/config",
1313
"//swift/extractor/infra",
1414
"//swift/extractor/invocation",
15+
"//swift/extractor/mangler",
1516
"//swift/extractor/remapping",
1617
"//swift/extractor/translators",
1718
"//swift/third_party/swift-llvm-support",

swift/extractor/mangler/BUILD.bazel

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
load("//swift:rules.bzl", "swift_cc_library")
2+
3+
swift_cc_library(
4+
name = "mangler",
5+
srcs = glob(["*.cpp"]),
6+
hdrs = glob(["*.h"]),
7+
visibility = ["//swift:__subpackages__"],
8+
deps = [
9+
"//swift/extractor/trap",
10+
"//swift/third_party/swift-llvm-support",
11+
],
12+
)
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#include "swift/extractor/mangler/SwiftMangler.h"
2+
#include "swift/extractor/trap/generated/decl/TrapClasses.h"
3+
#include <swift/AST/Module.h>
4+
#include <sstream>
5+
6+
using namespace codeql;
7+
8+
std::string SwiftMangler::mangledName(const swift::Decl& decl) {
9+
assert(llvm::isa<swift::ValueDecl>(decl));
10+
auto& valueDecl = llvm::cast<swift::ValueDecl>(decl);
11+
std::string_view moduleName = decl.getModuleContext()->getRealName().str();
12+
// ASTMangler::mangleAnyDecl crashes when called on `ModuleDecl`
13+
if (decl.getKind() == swift::DeclKind::Module) {
14+
return std::string{moduleName};
15+
}
16+
std::ostringstream ret;
17+
// stamp all declarations with an id-ref of the containing module
18+
ret << '{' << ModuleDeclTag::prefix << '_' << moduleName << '}';
19+
if (decl.getKind() == swift::DeclKind::TypeAlias) {
20+
// In cases like this (when coming from PCM)
21+
// typealias CFXMLTree = CFTree
22+
// typealias CFXMLTreeRef = CFXMLTree
23+
// mangleAnyDecl mangles both CFXMLTree and CFXMLTreeRef into 'So12CFXMLTreeRefa'
24+
// which is not correct and causes inconsistencies. mangleEntity makes these two distinct
25+
// prefix adds a couple of special symbols, we don't necessary need them
26+
ret << mangler.mangleEntity(&valueDecl);
27+
} else {
28+
// prefix adds a couple of special symbols, we don't necessary need them
29+
ret << mangler.mangleAnyDecl(&valueDecl, /* prefix = */ false);
30+
}
31+
return ret.str();
32+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#pragma once
2+
3+
#include <vector>
4+
#include <unordered_set>
5+
#include <filesystem>
6+
7+
#include <swift/AST/ASTMangler.h>
8+
9+
namespace codeql {
10+
class SwiftMangler {
11+
public:
12+
std::string mangledName(const swift::Decl& decl);
13+
14+
private:
15+
swift::Mangle::ASTMangler mangler;
16+
};
17+
18+
} // namespace codeql

swift/extractor/translators/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ swift_cc_library(
77
visibility = ["//swift:__subpackages__"],
88
deps = [
99
"//swift/extractor/infra",
10+
"//swift/extractor/mangler",
1011
"//swift/third_party/swift-llvm-support",
1112
],
1213
)

swift/extractor/translators/DeclTranslator.cpp

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#include <swift/AST/GenericParamList.h>
44
#include <swift/AST/ParameterList.h>
55
#include "swift/extractor/infra/SwiftDiagnosticKind.h"
6-
#include "swift/AST/PropertyWrappers.h"
6+
#include <swift/AST/PropertyWrappers.h>
77

88
namespace codeql {
99
namespace {
@@ -303,27 +303,7 @@ std::optional<codeql::ModuleDecl> DeclTranslator::translateModuleDecl(
303303
}
304304

305305
std::string DeclTranslator::mangledName(const swift::ValueDecl& decl) {
306-
std::string_view moduleName = decl.getModuleContext()->getRealName().str();
307-
// ASTMangler::mangleAnyDecl crashes when called on `ModuleDecl`
308-
if (decl.getKind() == swift::DeclKind::Module) {
309-
return std::string{moduleName};
310-
}
311-
std::ostringstream ret;
312-
// stamp all declarations with an id-ref of the containing module
313-
ret << '{' << ModuleDeclTag::prefix << '_' << moduleName << '}';
314-
if (decl.getKind() == swift::DeclKind::TypeAlias) {
315-
// In cases like this (when coming from PCM)
316-
// typealias CFXMLTree = CFTree
317-
// typealias CFXMLTreeRef = CFXMLTree
318-
// mangleAnyDecl mangles both CFXMLTree and CFXMLTreeRef into 'So12CFXMLTreeRefa'
319-
// which is not correct and causes inconsistencies. mangleEntity makes these two distinct
320-
// prefix adds a couple of special symbols, we don't necessary need them
321-
ret << mangler.mangleEntity(&decl);
322-
} else {
323-
// prefix adds a couple of special symbols, we don't necessary need them
324-
ret << mangler.mangleAnyDecl(&decl, /* prefix = */ false);
325-
}
326-
return ret.str();
306+
return mangler.mangledName(decl);
327307
}
328308

329309
void DeclTranslator::fillAbstractFunctionDecl(const swift::AbstractFunctionDecl& decl,

swift/extractor/translators/DeclTranslator.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
#include "swift/extractor/translators/TranslatorBase.h"
77
#include "swift/extractor/trap/generated/decl/TrapClasses.h"
8+
#include "swift/extractor/mangler/SwiftMangler.h"
89

910
namespace codeql {
1011

@@ -86,7 +87,7 @@ class DeclTranslator : public AstTranslatorBase<DeclTranslator> {
8687
entry.module = dispatcher.fetchLabel(decl.getModuleContext());
8788
}
8889

89-
swift::Mangle::ASTMangler mangler;
90+
SwiftMangler mangler;
9091
};
9192

9293
} // namespace codeql

0 commit comments

Comments
 (0)