Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion swift/extractor/SwiftExtractor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ static std::unordered_set<swift::ModuleDecl*> extractDeclarations(
bodyEmissionStrategy);
auto topLevelDecls = getTopLevelDecls(module, primaryFile, lazyDeclaration);
for (auto decl : topLevelDecls) {
if (swift::AvailableAttr::isUnavailable(decl)) {
if (decl->isUnavailable()) {
continue;
}
visitor.extract(decl);
Expand Down
9 changes: 8 additions & 1 deletion swift/extractor/infra/SwiftLocationExtractor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,14 @@ void SwiftLocationExtractor::attachLocationImpl(const swift::SourceManager& sour
entry.file = fetchFileLabel(file);
std::tie(entry.start_line, entry.start_column) =
sourceManager.getLineAndColumnInBuffer(range.Start);
std::tie(entry.end_line, entry.end_column) = sourceManager.getLineAndColumnInBuffer(range.End);
if (sourceManager.getLineAndColumnInBuffer(range.End) >=
sourceManager.getLineAndColumnInBuffer(range.Start)) {
std::tie(entry.end_line, entry.end_column) = sourceManager.getLineAndColumnInBuffer(range.End);
} else {
// the compiler may generate source ranges that go backwards
entry.end_line = entry.start_line;
entry.end_column = entry.start_column;
}
SwiftMangledName locName{"loc", entry.file, ':', entry.start_line, ':', entry.start_column,
':', entry.end_line, ':', entry.end_column};
entry.id = trap.createTypedLabel<DbLocationTag>(locName);
Expand Down
12 changes: 6 additions & 6 deletions swift/extractor/infra/SwiftTagTraits.h
Original file line number Diff line number Diff line change
Expand Up @@ -102,8 +102,9 @@ MAP(swift::Expr, ExprTag)
MAP(swift::IdentityExpr, IdentityExprTag)
MAP(swift::ParenExpr, ParenExprTag)
MAP(swift::DotSelfExpr, DotSelfExprTag)
MAP(swift::BorrowExpr, BorrowExprTag)
MAP(swift::AwaitExpr, AwaitExprTag)
MAP(swift::UnsafeExpr, void) // TODO: Swift 6.2
MAP(swift::BorrowExpr, BorrowExprTag)
MAP(swift::UnresolvedMemberChainResultExpr, UnresolvedMemberChainResultExprTag)
MAP(swift::AnyTryExpr, AnyTryExprTag)
MAP(swift::TryExpr, TryExprTag)
Expand Down Expand Up @@ -195,7 +196,6 @@ MAP(swift::Expr, ExprTag)
MAP(swift::ObjCSelectorExpr, ObjCSelectorExprTag)
MAP(swift::KeyPathExpr, KeyPathExprTag)
MAP(swift::KeyPathDotExpr, KeyPathDotExprTag)
MAP(swift::OneWayExpr, OneWayExprTag)
MAP(swift::TapExpr, TapExprTag)
MAP(swift::TypeJoinExpr, void) // does not appear in a visible AST, skipping
MAP(swift::MacroExpansionExpr, void) // unexpanded macro in an expr context, skipping
Expand Down Expand Up @@ -237,11 +237,11 @@ MAP(swift::Decl, DeclTag)
MAP(swift::ExtensionDecl, ExtensionDeclTag)
MAP(swift::TopLevelCodeDecl, TopLevelCodeDeclTag)
MAP(swift::ImportDecl, ImportDeclTag)
MAP(swift::PoundDiagnosticDecl, PoundDiagnosticDeclTag)
MAP(swift::PrecedenceGroupDecl, PrecedenceGroupDeclTag)
MAP(swift::MissingMemberDecl, MissingMemberDeclTag)
MAP(swift::PatternBindingDecl, PatternBindingDeclTag)
MAP(swift::EnumCaseDecl, EnumCaseDeclTag)
MAP(swift::UsingDecl, void) // TODO: Swift 6.2
MAP(swift::OperatorDecl, OperatorDeclTag)
MAP(swift::InfixOperatorDecl, InfixOperatorDeclTag)
MAP(swift::PrefixOperatorDecl, PrefixOperatorDeclTag)
Expand Down Expand Up @@ -315,7 +315,7 @@ MAP(swift::TypeBase, TypeTag)
MAP(swift::PrimaryArchetypeType, PrimaryArchetypeTypeTag)
MAP(swift::OpaqueTypeArchetypeType, OpaqueTypeArchetypeTypeTag)
MAP(swift::LocalArchetypeType, LocalArchetypeTypeTag)
MAP(swift::OpenedArchetypeType, OpenedArchetypeTypeTag)
MAP(swift::ExistentialArchetypeType, ExistentialArchetypeTypeTag)
MAP(swift::ElementArchetypeType, ElementArchetypeTypeTag)
MAP(swift::PackArchetypeType, PackArchetypeTypeTag)
MAP(swift::GenericTypeParamType, GenericTypeParamTypeTag)
Expand All @@ -342,16 +342,16 @@ MAP(swift::TypeBase, TypeTag)
MAP(swift::IntegerType, IntegerTypeTag)
MAP(swift::SugarType, SugarTypeTag)
MAP(swift::TypeAliasType, TypeAliasTypeTag)
MAP(swift::LocatableType, void) // TODO: Swift 6.2
MAP(swift::SyntaxSugarType, SyntaxSugarTypeTag)
MAP(swift::UnarySyntaxSugarType, UnarySyntaxSugarTypeTag)
MAP(swift::ArraySliceType, ArraySliceTypeTag)
MAP(swift::OptionalType, OptionalTypeTag)
MAP(swift::VariadicSequenceType, VariadicSequenceTypeTag)
MAP(swift::InlineArrayType, void) // TODO: Swift 6.2
MAP(swift::DictionaryType, DictionaryTypeTag)

MAP(swift::AvailabilitySpec, AvailabilitySpecTag)
MAP(swift::PlatformVersionConstraintAvailabilitySpec, PlatformVersionAvailabilitySpecTag)
MAP(swift::OtherPlatformAvailabilitySpec, OtherAvailabilitySpecTag)

MAP(swift::PoundAvailableInfo, AvailabilityInfoTag)
MAP(swift::MacroRoleAttr, MacroRoleTag)
Expand Down
41 changes: 38 additions & 3 deletions swift/extractor/mangler/SwiftMangler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -215,8 +215,8 @@ SwiftMangledName SwiftMangler::visitAnyFunctionType(const swift::AnyFunctionType
if (flags.isSending()) {
ret << "_sending";
}
if (flags.isCompileTimeConst()) {
ret << "_compiletimeconst";
if (flags.isCompileTimeLiteral()) {
ret << "_compiletimeliteral";
}
if (flags.isNoDerivative()) {
ret << "_noderivative";
Expand All @@ -225,6 +225,40 @@ SwiftMangledName SwiftMangler::visitAnyFunctionType(const swift::AnyFunctionType
ret << "...";
}
}

if (type->hasLifetimeDependencies()) {
for (const auto& lifetime : type->getLifetimeDependencies()) {
auto addressable = lifetime.getAddressableIndices();
auto condAddressable = lifetime.getConditionallyAddressableIndices();
ret << "_lifetime";

auto addIndexes = [&](swift::IndexSubset* bitvector) {
for (unsigned i = 0; i < bitvector->getCapacity(); ++i) {
if (bitvector->contains(i)) {
if (addressable && addressable->contains(i)) {
ret << "_address";
} else if (condAddressable && condAddressable->contains(i)) {
ret << "_address_for_deps";
}
ret << "_" << i;
}
}
};

if (lifetime.hasInheritLifetimeParamIndices()) {
ret << "_copy";
addIndexes(lifetime.getInheritIndices());
}
if (lifetime.hasScopeLifetimeParamIndices()) {
ret << "_borrow";
addIndexes(lifetime.getScopeIndices());
}
if (lifetime.isImmortal()) {
ret << "_immortal";
}
}
}

ret << "->" << fetch(type->getResult());
if (type->isAsync()) {
ret << "_async";
Expand Down Expand Up @@ -361,7 +395,8 @@ SwiftMangledName SwiftMangler::visitOpaqueTypeArchetypeType(
return visitArchetypeType(type) << fetch(type->getDecl());
}

SwiftMangledName SwiftMangler::visitOpenedArchetypeType(const swift::OpenedArchetypeType* type) {
SwiftMangledName SwiftMangler::visitExistentialArchetypeType(
const swift::ExistentialArchetypeType* type) {
auto* env = type->getGenericEnvironment();
llvm::SmallVector<char> uuid;
env->getOpenedExistentialUUID().toString(uuid);
Expand Down
2 changes: 1 addition & 1 deletion swift/extractor/mangler/SwiftMangler.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ class SwiftMangler : private swift::TypeVisitor<SwiftMangler, SwiftMangledName>,
SwiftMangledName visitTypeAliasType(const swift::TypeAliasType* type);
SwiftMangledName visitArchetypeType(const swift::ArchetypeType* type);
SwiftMangledName visitOpaqueTypeArchetypeType(const swift::OpaqueTypeArchetypeType* type);
SwiftMangledName visitOpenedArchetypeType(const swift::OpenedArchetypeType* type);
SwiftMangledName visitExistentialArchetypeType(const swift::ExistentialArchetypeType* type);
SwiftMangledName visitProtocolCompositionType(const swift::ProtocolCompositionType* type);
SwiftMangledName visitLValueType(const swift::LValueType* type);
SwiftMangledName visitDynamicSelfType(const swift::DynamicSelfType* type);
Expand Down
22 changes: 13 additions & 9 deletions swift/extractor/translators/DeclTranslator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,18 @@ codeql::Accessor DeclTranslator::translateAccessorDecl(const swift::AccessorDecl
case swift::AccessorKind::MutableAddress:
entry.is_unsafe_mutable_address = true;
break;
case swift::AccessorKind::DistributedGet:
// TODO: Swift 6.2
break;
case swift::AccessorKind::Read2:
// TODO: Swift 6.2
break;
case swift::AccessorKind::Modify2:
// TODO: Swift 6.2
break;
case swift::AccessorKind::Init:
// TODO: Swift 6.2
break;
}
fillFunction(decl, entry);
return entry;
Expand Down Expand Up @@ -280,7 +292,7 @@ void DeclTranslator::fillTypeDecl(const swift::TypeDecl& decl, codeql::TypeDecl&
void DeclTranslator::fillIterableDeclContext(const swift::IterableDeclContext& decl,
codeql::Decl& entry) {
for (auto member : decl.getMembers()) {
if (swift::AvailableAttr::isUnavailable(member)) {
if (member->isUnavailable()) {
continue;
}
entry.members.emplace_back(dispatcher.fetchLabel(member));
Expand Down Expand Up @@ -342,14 +354,6 @@ codeql::OpaqueTypeDecl DeclTranslator::translateOpaqueTypeDecl(const swift::Opaq
return entry;
}

codeql::PoundDiagnosticDecl DeclTranslator::translatePoundDiagnosticDecl(
const swift::PoundDiagnosticDecl& decl) {
auto entry = createEntry(decl);
entry.kind = translateDiagnosticsKind(decl.getKind());
entry.message = dispatcher.fetchLabel(decl.getMessage());
return entry;
}

codeql::MissingMemberDecl DeclTranslator::translateMissingMemberDecl(
const swift::MissingMemberDecl& decl) {
auto entry = createEntry(decl);
Expand Down
1 change: 0 additions & 1 deletion swift/extractor/translators/DeclTranslator.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ class DeclTranslator : public AstTranslatorBase<DeclTranslator> {
codeql::ImportDecl translateImportDecl(const swift::ImportDecl& decl);
codeql::ModuleDecl translateModuleDecl(const swift::ModuleDecl& decl);
codeql::OpaqueTypeDecl translateOpaqueTypeDecl(const swift::OpaqueTypeDecl& decl);
codeql::PoundDiagnosticDecl translatePoundDiagnosticDecl(const swift::PoundDiagnosticDecl& decl);
codeql::MissingMemberDecl translateMissingMemberDecl(const swift::MissingMemberDecl& decl);
codeql::CapturedDecl translateCapturedValue(const swift::CapturedValue& capture);
codeql::MacroDecl translateMacroDecl(const swift::MacroDecl& decl);
Expand Down
12 changes: 3 additions & 9 deletions swift/extractor/translators/ExprTranslator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -185,12 +185,6 @@ codeql::ObjCSelectorExpr ExprTranslator::translateObjCSelectorExpr(
return entry;
}

codeql::OneWayExpr ExprTranslator::translateOneWayExpr(const swift::OneWayExpr& expr) {
auto entry = createExprEntry(expr);
entry.sub_expr = dispatcher.fetchLabel(expr.getSubExpr());
return entry;
}

codeql::OpenExistentialExpr ExprTranslator::translateOpenExistentialExpr(
const swift::OpenExistentialExpr& expr) {
auto entry = createExprEntry(expr);
Expand Down Expand Up @@ -498,7 +492,7 @@ TrapLabel<KeyPathComponentTag> ExprTranslator::emitKeyPathComponent(
const swift::KeyPathExpr::Component& component) {
auto entry = dispatcher.createUncachedEntry(component);
entry.kind = static_cast<int>(component.getKind());
if (auto subscript_args = component.getSubscriptArgs()) {
if (auto subscript_args = component.getArgs()) {
for (const auto& arg : *subscript_args) {
entry.subscript_arguments.push_back(emitArgument(arg));
}
Expand Down Expand Up @@ -691,8 +685,8 @@ codeql::CurrentContextIsolationExpr ExprTranslator::translateCurrentContextIsola

codeql::TypeValueExpr ExprTranslator::translateTypeValueExpr(const swift::TypeValueExpr& expr) {
auto entry = createExprEntry(expr);
if (expr.getParamTypeRepr() && expr.getParamType()) {
entry.type_repr = dispatcher.fetchLabel(expr.getParamTypeRepr(), expr.getParamType());
if (expr.getRepr() && expr.getParamType()) {
entry.type_repr = dispatcher.fetchLabel(expr.getRepr(), expr.getParamType());
}
return entry;
}
Expand Down
1 change: 0 additions & 1 deletion swift/extractor/translators/ExprTranslator.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ class ExprTranslator : public AstTranslatorBase<ExprTranslator> {
codeql::MakeTemporarilyEscapableExpr translateMakeTemporarilyEscapableExpr(
const swift::MakeTemporarilyEscapableExpr& expr);
codeql::ObjCSelectorExpr translateObjCSelectorExpr(const swift::ObjCSelectorExpr& expr);
codeql::OneWayExpr translateOneWayExpr(const swift::OneWayExpr& expr);
codeql::OpenExistentialExpr translateOpenExistentialExpr(const swift::OpenExistentialExpr& expr);
codeql::OptionalEvaluationExpr translateOptionalEvaluationExpr(
const swift::OptionalEvaluationExpr& expr);
Expand Down
22 changes: 7 additions & 15 deletions swift/extractor/translators/StmtTranslator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,25 +36,17 @@ void StmtTranslator::translateAndEmit(const swift::PoundAvailableInfo& availabil
}

void StmtTranslator::translateAndEmit(const swift::AvailabilitySpec& spec) {
if (llvm::isa<swift::PlatformVersionConstraintAvailabilitySpec>(spec)) {
translateAndEmit(llvm::cast<swift::PlatformVersionConstraintAvailabilitySpec>(spec));
} else if (llvm::isa<swift::OtherPlatformAvailabilitySpec>(spec)) {
translateAndEmit(llvm::cast<swift::OtherPlatformAvailabilitySpec>(spec));
}
}

void StmtTranslator::translateAndEmit(
const swift::PlatformVersionConstraintAvailabilitySpec& spec) {
auto entry = dispatcher.createEntry(spec);
entry.platform = swift::platformString(spec.getPlatform()).str();
entry.version = spec.getVersion().getAsString();
entry.is_wildcard = spec.isWildcard();
if (!spec.isWildcard()) {
auto domain = spec.getDomainOrIdentifier().getAsDomain();
entry.platform =
swift::platformString(domain ? domain->getPlatformKind() : swift::PlatformKind::none).str();
entry.version = spec.getRawVersion().getAsString();
}
dispatcher.emit(entry);
}

void StmtTranslator::translateAndEmit(const swift::OtherPlatformAvailabilitySpec& spec) {
dispatcher.emit(dispatcher.createEntry(spec));
}

codeql::BraceStmt StmtTranslator::translateBraceStmt(const swift::BraceStmt& stmt) {
auto entry = dispatcher.createEntry(stmt);
entry.elements = dispatcher.fetchRepeatedLabels(stmt.getElements());
Expand Down
2 changes: 0 additions & 2 deletions swift/extractor/translators/StmtTranslator.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@ class StmtTranslator : public AstTranslatorBase<StmtTranslator> {
void translateAndEmit(const swift::CaseLabelItem& labelItem);
void translateAndEmit(const swift::PoundAvailableInfo& availability);
void translateAndEmit(const swift::AvailabilitySpec& spec);
void translateAndEmit(const swift::PlatformVersionConstraintAvailabilitySpec& spec);
void translateAndEmit(const swift::OtherPlatformAvailabilitySpec& spec);

codeql::BraceStmt translateBraceStmt(const swift::BraceStmt& stmt);
codeql::ReturnStmt translateReturnStmt(const swift::ReturnStmt& stmt);
Expand Down
4 changes: 2 additions & 2 deletions swift/extractor/translators/TypeTranslator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -225,8 +225,8 @@ codeql::BuiltinIntegerType TypeTranslator::translateBuiltinIntegerType(
return entry;
}

codeql::OpenedArchetypeType TypeTranslator::translateOpenedArchetypeType(
const swift::OpenedArchetypeType& type) {
codeql::ExistentialArchetypeType TypeTranslator::translateExistentialArchetypeType(
const swift::ExistentialArchetypeType& type) {
auto entry = createTypeEntry(type);
fillArchetypeType(type, entry);
return entry;
Expand Down
3 changes: 2 additions & 1 deletion swift/extractor/translators/TypeTranslator.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,8 @@ class TypeTranslator : public TypeTranslatorBase<TypeTranslator> {
codeql::BuiltinIntegerLiteralType translateBuiltinIntegerLiteralType(
const swift::BuiltinIntegerLiteralType& type);
codeql::BuiltinIntegerType translateBuiltinIntegerType(const swift::BuiltinIntegerType& type);
codeql::OpenedArchetypeType translateOpenedArchetypeType(const swift::OpenedArchetypeType& type);
codeql::ExistentialArchetypeType translateExistentialArchetypeType(
const swift::ExistentialArchetypeType& type);
codeql::ModuleType translateModuleType(const swift::ModuleType& type);
codeql::OpaqueTypeArchetypeType translateOpaqueTypeArchetypeType(
const swift::OpaqueTypeArchetypeType& type);
Expand Down
Loading
Loading