mirror of
https://github.com/github/codeql.git
synced 2025-12-20 10:46:30 +01:00
For some reason `-experimental-skip-non-inlinable-function-bodies-without-types` is passed to the frontend, which will skip extraction of most bodies. By suppressing that option the problem goes away.
87 lines
3.2 KiB
Lua
87 lines
3.2 KiB
Lua
function RegisterExtractorPack(id)
|
|
local extractorDirectory = GetPlatformToolsDirectory()
|
|
local relativeSwiftExtractor = extractorDirectory .. 'extractor'
|
|
local swiftExtractor = AbsolutifyExtractorPath(id, relativeSwiftExtractor)
|
|
|
|
function indexOf(array, value)
|
|
for i, v in ipairs(array) do
|
|
if v == value then
|
|
return i
|
|
end
|
|
end
|
|
return nil
|
|
end
|
|
|
|
-- removes unsupported CLI arg including the following how_many args
|
|
function strip_unsupported_arg(args, arg, how_many)
|
|
local index = indexOf(args, arg)
|
|
if index then
|
|
table.remove(args, index)
|
|
while (how_many > 0)
|
|
do
|
|
table.remove(args, index)
|
|
how_many = how_many - 1
|
|
end
|
|
end
|
|
end
|
|
|
|
function strip_unsupported_args(args)
|
|
strip_unsupported_arg(args, '-emit-localized-strings', 0)
|
|
strip_unsupported_arg(args, '-emit-localized-strings-path', 1)
|
|
strip_unsupported_arg(args, '-stack-check', 0)
|
|
strip_unsupported_arg(args, '-experimental-skip-non-inlinable-function-bodies-without-types', 0)
|
|
end
|
|
|
|
-- xcodebuild does not always specify the -resource-dir in which case the compiler falls back
|
|
-- to a resource-dir based on its path
|
|
-- here we mimic this behavior externally
|
|
-- without a proper -resource-dir compiler-specific headers cannot be found which leads to
|
|
-- broken extraction
|
|
function insert_resource_dir_if_needed(compilerPath, args)
|
|
local resource_dir_index = indexOf(args, '-resource-dir')
|
|
if resource_dir_index then
|
|
return
|
|
end
|
|
-- derive -resource-dir based on the compilerPath
|
|
-- e.g.: /usr/bin/swift-frontend -> /usr/bin/../lib/swift
|
|
local last_slash_index = string.find(compilerPath, "/[^/]*$")
|
|
local compiler_dir = string.sub(compilerPath, 1, last_slash_index)
|
|
local resource_dir = compiler_dir .. '../lib/swift'
|
|
table.insert(args, '-resource-dir')
|
|
table.insert(args, resource_dir)
|
|
end
|
|
|
|
function SwiftMatcher(compilerName, compilerPath, compilerArguments, lang)
|
|
-- Only match binaries names `swift-frontend`
|
|
if compilerName ~= 'swift-frontend' then return nil end
|
|
-- Skip the invocation in case it's not called in `-frontend` mode
|
|
if compilerArguments.argv[1] ~= '-frontend' then return nil end
|
|
|
|
-- Drop the `-frontend` argument
|
|
table.remove(compilerArguments.argv, 1)
|
|
|
|
-- Skip "info" queries in case there is nothing to extract
|
|
if compilerArguments.argv[1] == '-print-target-info' then
|
|
return nil
|
|
end
|
|
if compilerArguments.argv[1] == '-emit-supported-features' then
|
|
return nil
|
|
end
|
|
|
|
strip_unsupported_args(compilerArguments.argv)
|
|
insert_resource_dir_if_needed(compilerPath, compilerArguments.argv)
|
|
|
|
return {
|
|
trace = true,
|
|
replace = false,
|
|
order = ORDER_AFTER,
|
|
invocation = {path = swiftExtractor, arguments = compilerArguments}
|
|
}
|
|
end
|
|
return {SwiftMatcher}
|
|
end
|
|
|
|
-- Return a list of minimum supported versions of the configuration file format
|
|
-- return one entry per supported major version.
|
|
function GetCompatibleVersions() return {'1.0.0'} end
|