mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-04 22:02:52 +01:00
precompile and cache Carbon prelude (#7432)
Refactors the link driver to automatically compile and cache the carbon prelude for use in linking. Implements a `carbon_library` rule for compiling the Core library dependencies in the examples.
This commit is contained in:
+253
-46
@@ -4,6 +4,7 @@
|
||||
|
||||
"""Provides rules for building Carbon files using the toolchain."""
|
||||
|
||||
load("@bazel_tools//tools/cpp:toolchain_utils.bzl", "find_cpp_toolchain")
|
||||
load("@rules_cc//cc:action_names.bzl", "ACTION_NAMES")
|
||||
load("@rules_cc//cc/common:cc_common.bzl", "cc_common")
|
||||
load("@rules_cc//cc/common:cc_info.bzl", "CcInfo")
|
||||
@@ -26,8 +27,10 @@ def _carbon_binary_impl(ctx):
|
||||
# Pass any C++ flags from our dependencies onto Carbon.
|
||||
dep_flags = []
|
||||
dep_hdrs = []
|
||||
dep_api_files = []
|
||||
dep_link_inputs = []
|
||||
for dep in ctx.attr.deps:
|
||||
deps = ctx.attr.deps + ctx.attr._default_deps
|
||||
for dep in deps:
|
||||
if CcInfo in dep:
|
||||
cc_info = dep[CcInfo]
|
||||
|
||||
@@ -46,16 +49,16 @@ def _carbon_binary_impl(ctx):
|
||||
dep_link_inputs += lib.objects
|
||||
if DefaultInfo in dep:
|
||||
dep_link_inputs += dep[DefaultInfo].files.to_list()
|
||||
if CarbonLibraryInfo in dep:
|
||||
carbon_info = dep[CarbonLibraryInfo]
|
||||
dep_link_inputs += carbon_info.objs.to_list()
|
||||
dep_api_files.append(carbon_info.api)
|
||||
|
||||
# Add the dependencies' link flags and inputs to the link flags.
|
||||
link_flags += [dep.path for dep in dep_link_inputs]
|
||||
|
||||
# Build object files for the prelude and for the binary itself.
|
||||
# TODO: Eventually the prelude should be build as a separate `carbon_library`.
|
||||
srcs_and_flags = [
|
||||
(ctx.files.prelude_srcs, ["--no-prelude-import"]),
|
||||
(ctx.files.srcs, dep_flags),
|
||||
]
|
||||
srcs_and_flags = [(ctx.files.srcs, dep_flags)]
|
||||
|
||||
objs = []
|
||||
for (srcs, extra_flags) in srcs_and_flags:
|
||||
@@ -76,13 +79,14 @@ def _carbon_binary_impl(ctx):
|
||||
src.short_path.removeprefix(ctx.label.package).removesuffix(src.extension),
|
||||
))
|
||||
objs.append(out)
|
||||
srcs_reordered = [s for s in srcs if s != src] + [src]
|
||||
srcs_reordered = dep_api_files + [s for s in srcs if s != src] + [src]
|
||||
ctx.actions.run(
|
||||
outputs = [out],
|
||||
inputs = depset(direct = srcs_reordered, transitive = dep_hdrs),
|
||||
executable = toolchain_driver,
|
||||
tools = depset(toolchain_data),
|
||||
arguments = ["compile", "--output=" + out.path, "--output-last-input-only"] +
|
||||
["--no-include-carbon-core"] +
|
||||
[s.path for s in srcs_reordered] + extra_flags + ctx.attr.flags,
|
||||
mnemonic = "CarbonCompile",
|
||||
progress_message = "Compiling " + src.short_path,
|
||||
@@ -119,19 +123,164 @@ def _carbon_binary_impl(ctx):
|
||||
|
||||
ctx.actions.run(
|
||||
outputs = [bin],
|
||||
inputs = objs + dep_link_inputs,
|
||||
inputs = depset(direct = objs + dep_link_inputs),
|
||||
executable = toolchain_driver,
|
||||
tools = depset(toolchain_data + prebuilt_runtimes),
|
||||
tools = depset(direct = toolchain_data + prebuilt_runtimes),
|
||||
arguments = full_link_flags,
|
||||
mnemonic = "CarbonLink",
|
||||
progress_message = "Linking " + bin.short_path,
|
||||
)
|
||||
return [DefaultInfo(files = depset([bin]), executable = bin)]
|
||||
|
||||
CarbonLibraryInfo = provider(
|
||||
doc = "Contains information about a compiled Carbon library.",
|
||||
fields = {
|
||||
"api": "The api source file to provide to library consumers.",
|
||||
"objs": "A depset of one or more compiled library files, including impl and api.",
|
||||
},
|
||||
)
|
||||
|
||||
def _carbon_library_impl(ctx):
|
||||
toolchain_driver = ctx.executable.internal_exec_toolchain_driver
|
||||
toolchain_data = ctx.files.internal_exec_toolchain_data
|
||||
|
||||
# If the exec driver isn't provided, that means we're trying to use a target
|
||||
# config toolchain, likely to avoid build overhead of two configs.
|
||||
if toolchain_driver == None:
|
||||
toolchain_driver = ctx.executable.internal_target_toolchain_driver
|
||||
toolchain_data = ctx.files.internal_target_toolchain_data
|
||||
|
||||
# Pass any C++ flags from our dependencies onto Carbon.
|
||||
dep_flags = []
|
||||
dep_hdrs = []
|
||||
dep_api_srcs = []
|
||||
for dep in ctx.attr.deps:
|
||||
if CcInfo in dep:
|
||||
cc_info = dep[CcInfo]
|
||||
|
||||
# TODO: We should reuse the feature-based flag generation in
|
||||
# bazel/cc_toolchains here.
|
||||
dep_flags += ["--clang-arg=-D{0}".format(define) for define in cc_info.compilation_context.defines.to_list()]
|
||||
dep_flags += ["--clang-arg=-I{0}".format(path) for path in cc_info.compilation_context.includes.to_list()]
|
||||
dep_flags += ["--clang-arg=-iquote{0}".format(path) for path in cc_info.compilation_context.quote_includes.to_list()]
|
||||
dep_flags += ["--clang-arg=-isystem{0}".format(path) for path in cc_info.compilation_context.system_includes.to_list()]
|
||||
dep_hdrs.append(cc_info.compilation_context.headers)
|
||||
if CarbonLibraryInfo in dep:
|
||||
carbon_info = dep[CarbonLibraryInfo]
|
||||
dep_api_srcs.append(carbon_info.api)
|
||||
|
||||
# Build object files for the library impls and api file
|
||||
srcs_and_flags = [(ctx.files.impls + ctx.files.api, dep_flags)]
|
||||
|
||||
objs = []
|
||||
for (srcs, extra_flags) in srcs_and_flags:
|
||||
for src in srcs:
|
||||
# Build each source file. For now, we pass all sources to each compile
|
||||
# because we don't have visibility into dependencies and have no way to
|
||||
# specify multiple output files. Object code for each input is written
|
||||
# into the output file in turn, so the final carbon source file
|
||||
# specified ends up determining the contents of the object file.
|
||||
#
|
||||
# TODO: This is a hack; replace with something better once the toolchain
|
||||
# supports doing so.
|
||||
#
|
||||
# TODO: Switch to the `prefix` based rule similar to linking when
|
||||
# the prelude moves there.
|
||||
out = ctx.actions.declare_file("_objs/{0}/{1}o".format(
|
||||
ctx.label.name,
|
||||
src.short_path.removeprefix(ctx.label.package).removesuffix(src.extension),
|
||||
))
|
||||
objs.append(out)
|
||||
srcs_reordered = dep_api_srcs + [s for s in srcs if s != src] + [src]
|
||||
ctx.actions.run(
|
||||
outputs = [out],
|
||||
inputs = depset(direct = srcs_reordered, transitive = dep_hdrs),
|
||||
executable = toolchain_driver,
|
||||
tools = depset(toolchain_data),
|
||||
arguments = ["compile", "--output=" + out.path, "--output-last-input-only"] +
|
||||
["--no-include-carbon-core"] +
|
||||
extra_flags + ctx.attr.flags + [s.path for s in srcs_reordered],
|
||||
mnemonic = "CarbonCompile",
|
||||
progress_message = "Compiling " + src.short_path,
|
||||
)
|
||||
|
||||
return [CarbonLibraryInfo(api = ctx.files.api[0], objs = depset(objs))]
|
||||
|
||||
def _carbon_prelude_impl(ctx):
|
||||
cc_toolchain = find_cpp_toolchain(ctx)
|
||||
|
||||
# TODO: find a less terrible way to figure this out
|
||||
repo_root = str(cc_toolchain.compiler_executable)
|
||||
repo_root = repo_root.removeprefix(cc_toolchain._crosstool_top_path + "/")
|
||||
|
||||
# The tool path seems to be relative to the toolchain _repository_ root, so
|
||||
# it includes the `toolchain/install` suffix, which is why we remove it here.
|
||||
repo_root = repo_root.removesuffix("toolchain/install/llvm/bin/clang++")
|
||||
|
||||
carbon_busybox = repo_root + cc_toolchain._tool_paths["carbon-busybox"]
|
||||
|
||||
srcs = [s for s in ctx.files.srcs if s.extension == "carbon"]
|
||||
objs = []
|
||||
for src in srcs:
|
||||
out = ctx.actions.declare_file("_objs/{0}/{1}o".format(
|
||||
ctx.label.name,
|
||||
src.short_path.removeprefix(ctx.label.package).removesuffix(src.extension),
|
||||
))
|
||||
objs.append(out)
|
||||
srcs_reordered = [s for s in srcs if s != src] + [src]
|
||||
ctx.actions.run(
|
||||
outputs = [out],
|
||||
inputs = depset(direct = srcs_reordered),
|
||||
tools = depset(transitive = [cc_toolchain.all_files]),
|
||||
executable = carbon_busybox,
|
||||
arguments = ["compile", "--output=" + out.path, "--output-last-input-only"] +
|
||||
["--no-prelude-import"] +
|
||||
[s.path for s in srcs_reordered] + ctx.attr.flags,
|
||||
mnemonic = "CarbonPrelude",
|
||||
progress_message = "Precompiling prelude file " + src.short_path,
|
||||
)
|
||||
|
||||
return DefaultInfo(files = depset(objs))
|
||||
|
||||
# We synthesize two sets of attributes from mirrored `select`s here
|
||||
# because we want to select on an internal property of these attributes
|
||||
# but that isn't `select`-able. Instead, we have both attributes and
|
||||
# `select` which one we use.
|
||||
_select_internal_exec_toolchain_driver = select({
|
||||
Label("//bazel/carbon_rules:use_target_config_carbon_rules_config"): None,
|
||||
"//conditions:default": Label("//toolchain/install:carbon-busybox"),
|
||||
})
|
||||
_select_internal_exec_toolchain_data = select({
|
||||
Label("//bazel/carbon_rules:use_target_config_carbon_rules_config"): None,
|
||||
"//conditions:default": Label("//toolchain/install:install_data"),
|
||||
})
|
||||
_select_internal_exec_prebuilt_runtimes = select({
|
||||
Label("//bazel/carbon_rules:use_target_config_carbon_rules_config"): None,
|
||||
"//conditions:default": Label("//toolchain/install:built_runtimes"),
|
||||
})
|
||||
_select_internal_target_toolchain_driver = select({
|
||||
Label(
|
||||
"//bazel/carbon_rules:use_target_config_carbon_rules_config",
|
||||
): Label("//toolchain/install:carbon-busybox"),
|
||||
"//conditions:default": None,
|
||||
})
|
||||
_select_internal_target_toolchain_data = select({
|
||||
Label(
|
||||
"//bazel/carbon_rules:use_target_config_carbon_rules_config",
|
||||
): Label("//toolchain/install:install_data"),
|
||||
"//conditions:default": None,
|
||||
})
|
||||
_select_internal_target_prebuilt_runtimes = select({
|
||||
Label(
|
||||
"//bazel/carbon_rules:use_target_config_carbon_rules_config",
|
||||
): Label("//toolchain/install:built_runtimes"),
|
||||
"//conditions:default": None,
|
||||
})
|
||||
|
||||
_carbon_binary_internal = rule(
|
||||
implementation = _carbon_binary_impl,
|
||||
attrs = {
|
||||
"deps": attr.label_list(allow_files = True, providers = [[CcInfo]]),
|
||||
"deps": attr.label_list(allow_files = True, providers = [[CcInfo], [CarbonLibraryInfo]]),
|
||||
"flags": attr.string_list(),
|
||||
|
||||
# The exec config toolchain attributes. These will be `None` when using
|
||||
@@ -167,14 +316,74 @@ _carbon_binary_internal = rule(
|
||||
executable = True,
|
||||
cfg = "target",
|
||||
),
|
||||
"prelude_srcs": attr.label_list(allow_files = [".carbon"]),
|
||||
"srcs": attr.label_list(allow_files = [".carbon"]),
|
||||
"_cc_toolchain": attr.label(default = "//toolchain/install:carbon_stage1_cc_toolchain"),
|
||||
"_default_deps": attr.label_list(default = [Label("//core:io"), Label("//core:range")]),
|
||||
},
|
||||
executable = True,
|
||||
fragments = ["cpp"],
|
||||
)
|
||||
|
||||
_carbon_library_internal = rule(
|
||||
implementation = _carbon_library_impl,
|
||||
attrs = {
|
||||
"api": attr.label(allow_single_file = True),
|
||||
"deps": attr.label_list(allow_files = True),
|
||||
"flags": attr.string_list(),
|
||||
"impls": attr.label_list(allow_files = [".carbon"]),
|
||||
|
||||
# The exec config toolchain attributes. These will be `None` when using
|
||||
# the target config and populated when using the exec config. We have to
|
||||
# use duplicate attributes here and below to have different `cfg`
|
||||
# settings, as that isn't `select`-able, and we'll use `select`s when
|
||||
# populating these.
|
||||
"internal_exec_prebuilt_runtimes": attr.label(
|
||||
cfg = "exec",
|
||||
),
|
||||
"internal_exec_toolchain_data": attr.label(
|
||||
cfg = "exec",
|
||||
),
|
||||
"internal_exec_toolchain_driver": attr.label(
|
||||
allow_single_file = True,
|
||||
executable = True,
|
||||
cfg = "exec",
|
||||
),
|
||||
|
||||
# The target config toolchain attributes. These will be 'None' when
|
||||
# using the exec config and populated when using the target config. We
|
||||
# have to use duplicate attributes here and below to have different
|
||||
# `cfg` settings, as that isn't `select`-able, and we'll use `select`s
|
||||
# when populating these.
|
||||
"internal_target_prebuilt_runtimes": attr.label(
|
||||
cfg = "target",
|
||||
),
|
||||
"internal_target_toolchain_data": attr.label(
|
||||
cfg = "target",
|
||||
),
|
||||
"internal_target_toolchain_driver": attr.label(
|
||||
allow_single_file = True,
|
||||
executable = True,
|
||||
cfg = "target",
|
||||
),
|
||||
"_cc_toolchain": attr.label(default = "//toolchain/install:carbon_stage1_cc_toolchain"),
|
||||
},
|
||||
executable = False,
|
||||
fragments = ["cpp"],
|
||||
)
|
||||
|
||||
carbon_prelude = rule(
|
||||
implementation = _carbon_prelude_impl,
|
||||
attrs = {
|
||||
"flags": attr.string_list(),
|
||||
"srcs": attr.label_list(allow_files = [".carbon"]),
|
||||
"_cc_toolchain": attr.label(
|
||||
default = Label("@bazel_tools//tools/cpp:current_cc_toolchain"),
|
||||
),
|
||||
},
|
||||
toolchains = ["@bazel_tools//tools/cpp:toolchain_type"],
|
||||
fragments = ["cpp"],
|
||||
)
|
||||
|
||||
def carbon_binary(name, srcs, deps = [], flags = [], tags = []):
|
||||
"""Compiles a Carbon binary.
|
||||
|
||||
@@ -188,43 +397,41 @@ def carbon_binary(name, srcs, deps = [], flags = [], tags = []):
|
||||
_carbon_binary_internal(
|
||||
name = name,
|
||||
srcs = srcs,
|
||||
prelude_srcs = [Label("//core:prelude_files")],
|
||||
deps = deps,
|
||||
flags = flags,
|
||||
tags = tags,
|
||||
internal_exec_toolchain_driver = _select_internal_exec_toolchain_driver,
|
||||
internal_exec_toolchain_data = _select_internal_exec_toolchain_data,
|
||||
internal_exec_prebuilt_runtimes = _select_internal_exec_prebuilt_runtimes,
|
||||
internal_target_toolchain_driver = _select_internal_target_toolchain_driver,
|
||||
internal_target_toolchain_data = _select_internal_target_toolchain_data,
|
||||
internal_target_prebuilt_runtimes = _select_internal_target_prebuilt_runtimes,
|
||||
)
|
||||
|
||||
# We synthesize two sets of attributes from mirrored `select`s here
|
||||
# because we want to select on an internal property of these attributes
|
||||
# but that isn't `select`-able. Instead, we have both attributes and
|
||||
# `select` which one we use.
|
||||
internal_exec_toolchain_driver = select({
|
||||
Label("//bazel/carbon_rules:use_target_config_carbon_rules_config"): None,
|
||||
"//conditions:default": Label("//toolchain/install:carbon-busybox"),
|
||||
}),
|
||||
internal_exec_toolchain_data = select({
|
||||
Label("//bazel/carbon_rules:use_target_config_carbon_rules_config"): None,
|
||||
"//conditions:default": Label("//toolchain/install:install_data"),
|
||||
}),
|
||||
internal_exec_prebuilt_runtimes = select({
|
||||
Label("//bazel/carbon_rules:use_target_config_carbon_rules_config"): None,
|
||||
"//conditions:default": Label("//toolchain/install:built_runtimes"),
|
||||
}),
|
||||
internal_target_toolchain_driver = select({
|
||||
Label(
|
||||
"//bazel/carbon_rules:use_target_config_carbon_rules_config",
|
||||
): Label("//toolchain/install:carbon-busybox"),
|
||||
"//conditions:default": None,
|
||||
}),
|
||||
internal_target_toolchain_data = select({
|
||||
Label(
|
||||
"//bazel/carbon_rules:use_target_config_carbon_rules_config",
|
||||
): Label("//toolchain/install:install_data"),
|
||||
"//conditions:default": None,
|
||||
}),
|
||||
internal_target_prebuilt_runtimes = select({
|
||||
Label(
|
||||
"//bazel/carbon_rules:use_target_config_carbon_rules_config",
|
||||
): Label("//toolchain/install:built_runtimes"),
|
||||
"//conditions:default": None,
|
||||
}),
|
||||
def carbon_library(name, api, impls = [], deps = [], flags = [], tags = [], visibility = []):
|
||||
"""Compiles a Carbon library.
|
||||
|
||||
Args:
|
||||
name: The name of the build target.
|
||||
api: Name of a single api file.
|
||||
impls: List of zero or more implementation files.
|
||||
deps: List of dependencies.
|
||||
flags: Extra flags to pass to the Carbon compile command.
|
||||
tags: Tags to apply to the rule.
|
||||
visibility: Visibility rules for the library.
|
||||
"""
|
||||
_carbon_library_internal(
|
||||
name = name,
|
||||
api = api,
|
||||
impls = impls,
|
||||
deps = deps,
|
||||
flags = flags,
|
||||
tags = tags,
|
||||
visibility = visibility,
|
||||
internal_exec_toolchain_driver = _select_internal_exec_toolchain_driver,
|
||||
internal_exec_toolchain_data = _select_internal_exec_toolchain_data,
|
||||
internal_exec_prebuilt_runtimes = _select_internal_exec_prebuilt_runtimes,
|
||||
internal_target_toolchain_driver = _select_internal_target_toolchain_driver,
|
||||
internal_target_toolchain_data = _select_internal_target_toolchain_data,
|
||||
internal_target_prebuilt_runtimes = _select_internal_target_prebuilt_runtimes,
|
||||
)
|
||||
|
||||
@@ -11,6 +11,7 @@ load(
|
||||
"flag_group",
|
||||
"flag_set",
|
||||
"tool",
|
||||
"tool_path",
|
||||
)
|
||||
load(
|
||||
"@rules_cc//cc:defs.bzl",
|
||||
@@ -162,6 +163,7 @@ def _carbon_cc_toolchain_config_impl(ctx):
|
||||
ctx.attr.target_cpu,
|
||||
ctx.attr.target_os,
|
||||
)
|
||||
|
||||
return cc_common.create_cc_toolchain_config_info(
|
||||
ctx = ctx,
|
||||
features = clang_cc_toolchain_features(
|
||||
@@ -197,7 +199,7 @@ def _carbon_cc_toolchain_config_impl(ctx):
|
||||
|
||||
# Pass in our tool paths to expose Make variables like $(NM) and
|
||||
# $(OBJCOPY).
|
||||
tool_paths = llvm_tool_paths(llvm_bindir, clang_bindir),
|
||||
tool_paths = llvm_tool_paths(llvm_bindir, clang_bindir) + [tool_path(name = "carbon-busybox", path = "carbon-busybox")],
|
||||
)
|
||||
|
||||
carbon_cc_toolchain_config = rule(
|
||||
|
||||
+42
-2
@@ -2,13 +2,13 @@
|
||||
# Exceptions. See /LICENSE for license information.
|
||||
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
|
||||
load("//bazel/carbon_rules:defs.bzl", "carbon_library")
|
||||
load("//bazel/manifest:defs.bzl", "manifest")
|
||||
|
||||
# Raw prelude files.
|
||||
# TODO: This includes all of Core, not just the prelude.
|
||||
filegroup(
|
||||
name = "prelude_files",
|
||||
srcs = glob(["**/*.carbon"]),
|
||||
srcs = ["prelude.carbon"] + glob(["prelude/**/*.carbon"]),
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
||||
|
||||
@@ -29,3 +29,43 @@ filegroup(
|
||||
],
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "core_library_files",
|
||||
srcs = glob(
|
||||
include = ["**/*.carbon"],
|
||||
exclude = [
|
||||
"prelude.carbon",
|
||||
"prelude/**",
|
||||
],
|
||||
),
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
||||
|
||||
manifest(
|
||||
name = "core_library_manifest.txt",
|
||||
srcs = [":core_library_files"],
|
||||
strip_package_dir = True,
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "core_library",
|
||||
srcs = [
|
||||
":core_library_files",
|
||||
":core_library_manifest.txt",
|
||||
],
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
||||
|
||||
carbon_library(
|
||||
name = "io",
|
||||
api = "io.carbon",
|
||||
impls = ["io.impl.carbon"],
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
||||
|
||||
carbon_library(
|
||||
name = "range",
|
||||
api = "range.carbon",
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
||||
|
||||
+2
-11
@@ -7,24 +7,15 @@
|
||||
|
||||
package Core library "io";
|
||||
|
||||
import library "prelude";
|
||||
|
||||
// TODO: Support printing other types.
|
||||
// TODO: Consider rewriting using native support once library support exists.
|
||||
fn Print(x: i32) = "print.int";
|
||||
fn PrintChar(x: char) -> i32 = "print.char";
|
||||
|
||||
fn PrintStr(msg: str) {
|
||||
let size: i64 = msg.Size() as i64;
|
||||
var i: i64 = 0;
|
||||
while (i < size) {
|
||||
PrintChar(msg[i]);
|
||||
++i;
|
||||
}
|
||||
}
|
||||
fn PrintStr(msg: str);
|
||||
|
||||
// TODO: Return an `Optional(char)` instead of `i32`.
|
||||
fn ReadChar() -> i32 = "read.char";
|
||||
|
||||
// TODO: Change this to a global constant once they are fully supported.
|
||||
fn EOF() -> i32 { return -1; }
|
||||
fn EOF() -> i32;
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
|
||||
// Exceptions. See /LICENSE for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
|
||||
// TODO: This library is not part of the design. Either write a matching
|
||||
// proposal or remove this.
|
||||
|
||||
impl package Core library "io";
|
||||
|
||||
fn PrintStr(msg: str) {
|
||||
let size: i64 = msg.Size() as i64;
|
||||
var i: i64 = 0;
|
||||
while (i < size) {
|
||||
PrintChar(msg[i]);
|
||||
++i;
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Change this to a global constant once they are fully supported.
|
||||
fn EOF() -> i32 { return -1; }
|
||||
@@ -7,15 +7,6 @@
|
||||
|
||||
package Core library "range";
|
||||
|
||||
import library "prelude/destroy";
|
||||
import library "prelude/iterate";
|
||||
import library "prelude/operators/arithmetic";
|
||||
import library "prelude/operators/as";
|
||||
import library "prelude/operators/comparison";
|
||||
import library "prelude/types/int";
|
||||
import library "prelude/types/int_literal";
|
||||
import library "prelude/types/optional";
|
||||
|
||||
class IntRange(N: IntLiteral) {
|
||||
fn Make(start: Int(N), end: Int(N)) -> Self {
|
||||
return {.start = start, .end = end};
|
||||
|
||||
@@ -86,6 +86,11 @@ auto InstallPaths::ReadClangHeadersManifest() const
|
||||
return ReadManifest(root_, "clang_headers_manifest.txt");
|
||||
}
|
||||
|
||||
auto InstallPaths::ReadCarbonCoreManifest() const
|
||||
-> ErrorOr<llvm::SmallVector<std::string>> {
|
||||
return ReadManifest(core_package(), "core_library_manifest.txt");
|
||||
}
|
||||
|
||||
auto InstallPaths::ReadManifest(std::filesystem::path manifest_path,
|
||||
std::filesystem::path manifest_file) const
|
||||
-> ErrorOr<llvm::SmallVector<std::string>> {
|
||||
|
||||
@@ -81,6 +81,11 @@ class InstallPaths {
|
||||
auto ReadClangHeadersManifest() const
|
||||
-> ErrorOr<llvm::SmallVector<std::string>>;
|
||||
|
||||
// Returns the contents of the core library manifest file. This is the list
|
||||
// of Carbon source files in the Carbon Core library, excluding the prelude.
|
||||
auto ReadCarbonCoreManifest() const
|
||||
-> ErrorOr<llvm::SmallVector<std::string>>;
|
||||
|
||||
// Check for an error detecting the install paths correctly.
|
||||
//
|
||||
// A nullopt return means no errors encountered and the paths should work
|
||||
|
||||
@@ -25,6 +25,10 @@ load("@llvm-project//libcxx:libcxx_library.bzl", "libcxx_and_abi_copts")
|
||||
load("@llvm-project//libunwind:libunwind_library.bzl", "libunwind_copts")
|
||||
load("//bazel/cc_rules:defs.bzl", "cc_library")
|
||||
|
||||
CARBON_CORE_SRCS_FILEGROUPS = [
|
||||
"//core:prelude_files",
|
||||
]
|
||||
|
||||
CRT_FILES = {
|
||||
"crtbegin_src": "@llvm-project//compiler-rt:builtins_crtbegin_src",
|
||||
"crtend_src": "@llvm-project//compiler-rt:builtins_crtend_src",
|
||||
@@ -72,6 +76,7 @@ RUNTIMES_PREFIXES = {
|
||||
"libcxxabi_textual_srcs": "runtimes/libcxxabi/",
|
||||
"libunwind_hdrs": "runtimes/libunwind/",
|
||||
"libunwind_srcs": "runtimes/libunwind/",
|
||||
"prelude_files": "core/",
|
||||
}
|
||||
|
||||
def _get_name(target):
|
||||
@@ -143,6 +148,7 @@ def _get_substitutions(ctx):
|
||||
RUNTIMES_PREFIXES[name],
|
||||
)
|
||||
for name in [_get_name(g) for g in (
|
||||
CARBON_CORE_SRCS_FILEGROUPS +
|
||||
RUNTIMES_HDRS_FILEGROUPS + RUNTIMES_SRCS_FILEGROUPS +
|
||||
RUNTIMES_TEXTUAL_SRCS_FILEGROUPS
|
||||
)]
|
||||
@@ -154,6 +160,7 @@ _common_runtimes_rule_attrs = {
|
||||
} | {
|
||||
"_" + _get_name(g): attr.label_list(default = [g], allow_files = True)
|
||||
for g in (
|
||||
CARBON_CORE_SRCS_FILEGROUPS +
|
||||
BUILTINS_SRCS_FILEGROUPS +
|
||||
BUILTINS_TEXTUAL_SRCS_FILEGROUPS +
|
||||
RUNTIMES_HDRS_FILEGROUPS +
|
||||
|
||||
@@ -40,6 +40,8 @@ inline constexpr llvm::StringLiteral LibcxxCopts[] = {LIBCXX_AND_ABI_COPTS};
|
||||
inline constexpr llvm::StringLiteral LibunwindSrcs[] = {LIBUNWIND_SRCS};
|
||||
inline constexpr llvm::StringLiteral LibunwindCopts[] = {LIBUNWIND_COPTS};
|
||||
|
||||
inline constexpr llvm::StringLiteral CarbonCorePreludeSrcs[] = {PRELUDE_FILES};
|
||||
|
||||
} // namespace Carbon::RuntimesBuildInfo
|
||||
|
||||
#endif // CARBON_TOOLCHAIN_BASE_RUNTIMES_BUILD_INFO_TPL_H_
|
||||
|
||||
@@ -43,3 +43,5 @@ libunwind_hdrs = [LIBUNWIND_HDRS]
|
||||
libunwind_srcs = [LIBUNWIND_SRCS]
|
||||
|
||||
libunwind_copts = [LIBUNWIND_COPTS]
|
||||
|
||||
carbon_core_srcs = [PRELUDE_FILES]
|
||||
|
||||
@@ -116,7 +116,9 @@ class InProcessCompiler {
|
||||
|
||||
auto RunCompile(llvm::StringRef file_name, Phase phase) -> bool {
|
||||
if constexpr (L == Lang::Carbon) {
|
||||
return driver_->RunCommand({"compile", PhaseFlag(phase), file_name})
|
||||
return driver_
|
||||
->RunCommand({"compile", PhaseFlag(phase), "--no-include-carbon-core",
|
||||
file_name})
|
||||
.success;
|
||||
}
|
||||
|
||||
@@ -204,7 +206,8 @@ class SubprocessCompiler {
|
||||
|
||||
if constexpr (L == Lang::Carbon) {
|
||||
program = carbon_path_;
|
||||
args = {"carbon", "compile", PhaseFlag(phase), file_name};
|
||||
args = {"carbon", "compile", PhaseFlag(phase), "--no-include-carbon-core",
|
||||
file_name};
|
||||
} else {
|
||||
program = clang_path_;
|
||||
args = {"clang++", "--driver-mode=g++"};
|
||||
|
||||
@@ -102,7 +102,9 @@ class PreludeCompileBenchmark {
|
||||
if (mem_usage) {
|
||||
driver.set_mem_usage(mem_usage);
|
||||
}
|
||||
return driver.RunCommand({"compile", "--phase=check", InputFileName})
|
||||
return driver
|
||||
.RunCommand({"compile", "--phase=check", "--no-include-carbon-core",
|
||||
InputFileName})
|
||||
.success;
|
||||
}
|
||||
|
||||
|
||||
@@ -242,7 +242,10 @@ auto TestCompile(llvm::StringRef source) -> bool {
|
||||
|
||||
fs->addFile("test.carbon", /*ModificationTime=*/0,
|
||||
llvm::MemoryBuffer::getMemBuffer(source));
|
||||
return driver.RunCommand({"compile", "--phase=check", "test.carbon"}).success;
|
||||
return driver
|
||||
.RunCommand({"compile", "--phase=check", "--no-include-carbon-core",
|
||||
"test.carbon"})
|
||||
.success;
|
||||
}
|
||||
|
||||
TEST(SourceGenTest, GenApiFileDenseDeclsTest) {
|
||||
|
||||
@@ -458,13 +458,25 @@ auto CheckParseTrees(
|
||||
|
||||
// Add the prelude import. It's added to explicit_import_map so that it can
|
||||
// conflict with an explicit import of the prelude.
|
||||
// We add the prelude to every Carbon unit except for the prelude itself.
|
||||
if (options.prelude_import &&
|
||||
!(packaging && packaging->names.package_id == PackageNameId::Core)) {
|
||||
(!packaging || packaging->names.package_id != PackageNameId::Core ||
|
||||
packaging->names.library_id == StringLiteralValueId::None ||
|
||||
!unit_info.unit->value_stores->string_literal_values()
|
||||
.Get(packaging->names.library_id)
|
||||
.starts_with("prelude"))) {
|
||||
auto prelude_id =
|
||||
unit_info.unit->value_stores->string_literal_values().Add("prelude");
|
||||
// Adding the prelude to the non-prelude parts of Core requires different
|
||||
// semantics because it is not valid to mention the name of the package
|
||||
// for a library import from the same package.
|
||||
auto package_id =
|
||||
(packaging && packaging->names.package_id == PackageNameId::Core)
|
||||
? PackageNameId::None
|
||||
: PackageNameId::Core;
|
||||
TrackImport(api_map, &explicit_import_map, unit_info,
|
||||
{.node_id = Parse::NoneNodeId(),
|
||||
.package_id = PackageNameId::Core,
|
||||
.package_id = package_id,
|
||||
.library_id = prelude_id},
|
||||
options.fuzzing);
|
||||
}
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/none.carbon
|
||||
// ARGS: -v compile --phase=check %s
|
||||
// ARGS: -v compile --phase=check --no-include-carbon-core %s
|
||||
//
|
||||
// Only checks a couple statements in order to minimize manual update churn.
|
||||
// To test this file alone, run:
|
||||
|
||||
+18
-17
@@ -2,6 +2,7 @@
|
||||
// Exceptions. See /LICENSE for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
// EXTRA-ARGS: --include-carbon-core
|
||||
// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/full.carbon
|
||||
//
|
||||
// AUTOUPDATE
|
||||
@@ -29,7 +30,7 @@ fn Main() {
|
||||
// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete]
|
||||
// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete]
|
||||
// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete]
|
||||
// CHECK:STDOUT: %PrintChar.type.7a7: type = fn_type @PrintChar.loc15 [concrete]
|
||||
// CHECK:STDOUT: %PrintChar.type.7a7: type = fn_type @PrintChar.loc16 [concrete]
|
||||
// CHECK:STDOUT: %PrintChar.772: %PrintChar.type.7a7 = struct_value () [concrete]
|
||||
// CHECK:STDOUT: %.75c: Core.CharLiteral = char_value U+0031 [concrete]
|
||||
// CHECK:STDOUT: %ImplicitAs.type.0ff: type = generic_interface_type @ImplicitAs [concrete]
|
||||
@@ -70,23 +71,23 @@ fn Main() {
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Main() {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %PrintChar.ref.loc19: %PrintChar.type.7a7 = name_ref PrintChar, file.%PrintChar.decl [concrete = constants.%PrintChar.772]
|
||||
// CHECK:STDOUT: %.loc19_13.1: Core.CharLiteral = char_value U+0031 [concrete = constants.%.75c]
|
||||
// CHECK:STDOUT: %impl.elem0.loc19: %.1e6 = impl_witness_access constants.%ImplicitAs.impl_witness.780, element0 [concrete = constants.%Core.CharLiteral.as.ImplicitAs.impl.Convert]
|
||||
// CHECK:STDOUT: %bound_method.loc19: <bound method> = bound_method %.loc19_13.1, %impl.elem0.loc19 [concrete = constants.%Core.CharLiteral.as.ImplicitAs.impl.Convert.bound.17b]
|
||||
// CHECK:STDOUT: %Core.CharLiteral.as.ImplicitAs.impl.Convert.call.loc19: init %char = call %bound_method.loc19(%.loc19_13.1) [concrete = constants.%int_49]
|
||||
// CHECK:STDOUT: %.loc19_13.2: %char = value_of_initializer %Core.CharLiteral.as.ImplicitAs.impl.Convert.call.loc19 [concrete = constants.%int_49]
|
||||
// CHECK:STDOUT: %.loc19_13.3: %char = converted %.loc19_13.1, %.loc19_13.2 [concrete = constants.%int_49]
|
||||
// CHECK:STDOUT: %PrintChar.call.loc19: init %i32 = call %PrintChar.ref.loc19(%.loc19_13.3)
|
||||
// CHECK:STDOUT: %Core.ref: <namespace> = name_ref Core, imports.%Core [concrete = imports.%Core]
|
||||
// CHECK:STDOUT: %PrintChar.ref.loc20: %PrintChar.type.b3c = name_ref PrintChar, imports.%Core.PrintChar [concrete = constants.%PrintChar.063]
|
||||
// CHECK:STDOUT: %.loc20_18.1: Core.CharLiteral = char_value U+0032 [concrete = constants.%.f8d]
|
||||
// CHECK:STDOUT: %PrintChar.ref.loc20: %PrintChar.type.7a7 = name_ref PrintChar, file.%PrintChar.decl [concrete = constants.%PrintChar.772]
|
||||
// CHECK:STDOUT: %.loc20_13.1: Core.CharLiteral = char_value U+0031 [concrete = constants.%.75c]
|
||||
// CHECK:STDOUT: %impl.elem0.loc20: %.1e6 = impl_witness_access constants.%ImplicitAs.impl_witness.780, element0 [concrete = constants.%Core.CharLiteral.as.ImplicitAs.impl.Convert]
|
||||
// CHECK:STDOUT: %bound_method.loc20: <bound method> = bound_method %.loc20_18.1, %impl.elem0.loc20 [concrete = constants.%Core.CharLiteral.as.ImplicitAs.impl.Convert.bound.e67]
|
||||
// CHECK:STDOUT: %Core.CharLiteral.as.ImplicitAs.impl.Convert.call.loc20: init %char = call %bound_method.loc20(%.loc20_18.1) [concrete = constants.%int_50]
|
||||
// CHECK:STDOUT: %.loc20_18.2: %char = value_of_initializer %Core.CharLiteral.as.ImplicitAs.impl.Convert.call.loc20 [concrete = constants.%int_50]
|
||||
// CHECK:STDOUT: %.loc20_18.3: %char = converted %.loc20_18.1, %.loc20_18.2 [concrete = constants.%int_50]
|
||||
// CHECK:STDOUT: %PrintChar.call.loc20: init %i32 = call %PrintChar.ref.loc20(%.loc20_18.3)
|
||||
// CHECK:STDOUT: %bound_method.loc20: <bound method> = bound_method %.loc20_13.1, %impl.elem0.loc20 [concrete = constants.%Core.CharLiteral.as.ImplicitAs.impl.Convert.bound.17b]
|
||||
// CHECK:STDOUT: %Core.CharLiteral.as.ImplicitAs.impl.Convert.call.loc20: init %char = call %bound_method.loc20(%.loc20_13.1) [concrete = constants.%int_49]
|
||||
// CHECK:STDOUT: %.loc20_13.2: %char = value_of_initializer %Core.CharLiteral.as.ImplicitAs.impl.Convert.call.loc20 [concrete = constants.%int_49]
|
||||
// CHECK:STDOUT: %.loc20_13.3: %char = converted %.loc20_13.1, %.loc20_13.2 [concrete = constants.%int_49]
|
||||
// CHECK:STDOUT: %PrintChar.call.loc20: init %i32 = call %PrintChar.ref.loc20(%.loc20_13.3)
|
||||
// CHECK:STDOUT: %Core.ref: <namespace> = name_ref Core, imports.%Core [concrete = imports.%Core]
|
||||
// CHECK:STDOUT: %PrintChar.ref.loc21: %PrintChar.type.b3c = name_ref PrintChar, imports.%Core.PrintChar [concrete = constants.%PrintChar.063]
|
||||
// CHECK:STDOUT: %.loc21_18.1: Core.CharLiteral = char_value U+0032 [concrete = constants.%.f8d]
|
||||
// CHECK:STDOUT: %impl.elem0.loc21: %.1e6 = impl_witness_access constants.%ImplicitAs.impl_witness.780, element0 [concrete = constants.%Core.CharLiteral.as.ImplicitAs.impl.Convert]
|
||||
// CHECK:STDOUT: %bound_method.loc21: <bound method> = bound_method %.loc21_18.1, %impl.elem0.loc21 [concrete = constants.%Core.CharLiteral.as.ImplicitAs.impl.Convert.bound.e67]
|
||||
// CHECK:STDOUT: %Core.CharLiteral.as.ImplicitAs.impl.Convert.call.loc21: init %char = call %bound_method.loc21(%.loc21_18.1) [concrete = constants.%int_50]
|
||||
// CHECK:STDOUT: %.loc21_18.2: %char = value_of_initializer %Core.CharLiteral.as.ImplicitAs.impl.Convert.call.loc21 [concrete = constants.%int_50]
|
||||
// CHECK:STDOUT: %.loc21_18.3: %char = converted %.loc21_18.1, %.loc21_18.2 [concrete = constants.%int_50]
|
||||
// CHECK:STDOUT: %PrintChar.call.loc21: init %i32 = call %PrintChar.ref.loc21(%.loc21_18.3)
|
||||
// CHECK:STDOUT: <elided>
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
+20
-19
@@ -2,6 +2,7 @@
|
||||
// Exceptions. See /LICENSE for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
// EXTRA-ARGS: --include-carbon-core
|
||||
// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/full.carbon
|
||||
//
|
||||
// AUTOUPDATE
|
||||
@@ -29,7 +30,7 @@ fn Main() {
|
||||
// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete]
|
||||
// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete]
|
||||
// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete]
|
||||
// CHECK:STDOUT: %Print.type.009: type = fn_type @Print.loc15 [concrete]
|
||||
// CHECK:STDOUT: %Print.type.009: type = fn_type @Print.loc16 [concrete]
|
||||
// CHECK:STDOUT: %Print.9c5: %Print.type.009 = struct_value () [concrete]
|
||||
// CHECK:STDOUT: %int_1.5b8: Core.IntLiteral = int_value 1 [concrete]
|
||||
// CHECK:STDOUT: %ImplicitAs.type.0ff: type = generic_interface_type @ImplicitAs [concrete]
|
||||
@@ -74,27 +75,27 @@ fn Main() {
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Main() {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %Print.ref.loc19: %Print.type.009 = name_ref Print, file.%Print.decl [concrete = constants.%Print.9c5]
|
||||
// CHECK:STDOUT: %Print.ref.loc20: %Print.type.009 = name_ref Print, file.%Print.decl [concrete = constants.%Print.9c5]
|
||||
// CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8]
|
||||
// CHECK:STDOUT: %impl.elem0.loc19: %.1c5 = impl_witness_access constants.%ImplicitAs.impl_witness.a23, element0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.e39]
|
||||
// CHECK:STDOUT: %bound_method.loc19_9.1: <bound method> = bound_method %int_1, %impl.elem0.loc19 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound.094]
|
||||
// CHECK:STDOUT: %specific_fn.loc19: <specific function> = specific_function %impl.elem0.loc19, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn]
|
||||
// CHECK:STDOUT: %bound_method.loc19_9.2: <bound method> = bound_method %int_1, %specific_fn.loc19 [concrete = constants.%bound_method.953]
|
||||
// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc19: init %i32 = call %bound_method.loc19_9.2(%int_1) [concrete = constants.%int_1.0c6]
|
||||
// CHECK:STDOUT: %.loc19_9.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc19 [concrete = constants.%int_1.0c6]
|
||||
// CHECK:STDOUT: %.loc19_9.2: %i32 = converted %int_1, %.loc19_9.1 [concrete = constants.%int_1.0c6]
|
||||
// CHECK:STDOUT: %Print.call.loc19: init %empty_tuple.type = call %Print.ref.loc19(%.loc19_9.2)
|
||||
// CHECK:STDOUT: %Core.ref: <namespace> = name_ref Core, imports.%Core [concrete = imports.%Core]
|
||||
// CHECK:STDOUT: %Print.ref.loc20: %Print.type.4a7 = name_ref Print, imports.%Core.Print [concrete = constants.%Print.d24]
|
||||
// CHECK:STDOUT: %int_2: Core.IntLiteral = int_value 2 [concrete = constants.%int_2.ecc]
|
||||
// CHECK:STDOUT: %impl.elem0.loc20: %.1c5 = impl_witness_access constants.%ImplicitAs.impl_witness.a23, element0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.e39]
|
||||
// CHECK:STDOUT: %bound_method.loc20_14.1: <bound method> = bound_method %int_2, %impl.elem0.loc20 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound.9f3]
|
||||
// CHECK:STDOUT: %bound_method.loc20_9.1: <bound method> = bound_method %int_1, %impl.elem0.loc20 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound.094]
|
||||
// CHECK:STDOUT: %specific_fn.loc20: <specific function> = specific_function %impl.elem0.loc20, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn]
|
||||
// CHECK:STDOUT: %bound_method.loc20_14.2: <bound method> = bound_method %int_2, %specific_fn.loc20 [concrete = constants.%bound_method.3cb]
|
||||
// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc20: init %i32 = call %bound_method.loc20_14.2(%int_2) [concrete = constants.%int_2.295]
|
||||
// CHECK:STDOUT: %.loc20_14.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc20 [concrete = constants.%int_2.295]
|
||||
// CHECK:STDOUT: %.loc20_14.2: %i32 = converted %int_2, %.loc20_14.1 [concrete = constants.%int_2.295]
|
||||
// CHECK:STDOUT: %Print.call.loc20: init %empty_tuple.type = call %Print.ref.loc20(%.loc20_14.2)
|
||||
// CHECK:STDOUT: %bound_method.loc20_9.2: <bound method> = bound_method %int_1, %specific_fn.loc20 [concrete = constants.%bound_method.953]
|
||||
// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc20: init %i32 = call %bound_method.loc20_9.2(%int_1) [concrete = constants.%int_1.0c6]
|
||||
// CHECK:STDOUT: %.loc20_9.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc20 [concrete = constants.%int_1.0c6]
|
||||
// CHECK:STDOUT: %.loc20_9.2: %i32 = converted %int_1, %.loc20_9.1 [concrete = constants.%int_1.0c6]
|
||||
// CHECK:STDOUT: %Print.call.loc20: init %empty_tuple.type = call %Print.ref.loc20(%.loc20_9.2)
|
||||
// CHECK:STDOUT: %Core.ref: <namespace> = name_ref Core, imports.%Core [concrete = imports.%Core]
|
||||
// CHECK:STDOUT: %Print.ref.loc21: %Print.type.4a7 = name_ref Print, imports.%Core.Print [concrete = constants.%Print.d24]
|
||||
// CHECK:STDOUT: %int_2: Core.IntLiteral = int_value 2 [concrete = constants.%int_2.ecc]
|
||||
// CHECK:STDOUT: %impl.elem0.loc21: %.1c5 = impl_witness_access constants.%ImplicitAs.impl_witness.a23, element0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.e39]
|
||||
// CHECK:STDOUT: %bound_method.loc21_14.1: <bound method> = bound_method %int_2, %impl.elem0.loc21 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound.9f3]
|
||||
// CHECK:STDOUT: %specific_fn.loc21: <specific function> = specific_function %impl.elem0.loc21, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn]
|
||||
// CHECK:STDOUT: %bound_method.loc21_14.2: <bound method> = bound_method %int_2, %specific_fn.loc21 [concrete = constants.%bound_method.3cb]
|
||||
// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc21: init %i32 = call %bound_method.loc21_14.2(%int_2) [concrete = constants.%int_2.295]
|
||||
// CHECK:STDOUT: %.loc21_14.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc21 [concrete = constants.%int_2.295]
|
||||
// CHECK:STDOUT: %.loc21_14.2: %i32 = converted %int_2, %.loc21_14.1 [concrete = constants.%int_2.295]
|
||||
// CHECK:STDOUT: %Print.call.loc21: init %empty_tuple.type = call %Print.ref.loc21(%.loc21_14.2)
|
||||
// CHECK:STDOUT: <elided>
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
// Exceptions. See /LICENSE for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
// EXTRA-ARGS: --include-carbon-core
|
||||
// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/full.carbon
|
||||
//
|
||||
// AUTOUPDATE
|
||||
|
||||
@@ -134,10 +134,16 @@ fn InstanceC(a: A) -> C {
|
||||
// CHECK:STDOUT: %assoc0: %ImplicitAs.assoc_type = assoc_entity element0, @ImplicitAs.WithSelf.%ImplicitAs.WithSelf.Convert.decl [symbolic]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: imports {
|
||||
// CHECK:STDOUT: %Core.Destroy = import_ref Core//prelude/parts/destroy, Destroy, unloaded
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: file {
|
||||
// CHECK:STDOUT: package: <namespace> = namespace [concrete] {
|
||||
// CHECK:STDOUT: .Destroy = imports.%Core.Destroy
|
||||
// CHECK:STDOUT: .ImplicitAs = %ImplicitAs.decl
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %default.import = import <none>
|
||||
// CHECK:STDOUT: %ImplicitAs.decl: %ImplicitAs.type.0ff = interface_decl @ImplicitAs [concrete = constants.%ImplicitAs.generic] {
|
||||
// CHECK:STDOUT: %Dest.patt.loc3_26.1: %pattern_type.98f = symbolic_binding_pattern Dest, 0 [symbolic = %Dest.patt.loc3_26.2 (constants.%Dest.patt)]
|
||||
// CHECK:STDOUT: } {
|
||||
|
||||
@@ -84,10 +84,32 @@ fn F() {
|
||||
// CHECK:STDOUT: %complete_type: <witness> = complete_type_witness %empty_struct_type [concrete]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: imports {
|
||||
// CHECK:STDOUT: %Core.UnsafeAs = import_ref Core//prelude/parts/as, UnsafeAs, unloaded
|
||||
// CHECK:STDOUT: %Core.As = import_ref Core//prelude/parts/as, As, unloaded
|
||||
// CHECK:STDOUT: %Core.ImplicitAs = import_ref Core//prelude/parts/as, ImplicitAs, unloaded
|
||||
// CHECK:STDOUT: %Core.BitAndWith = import_ref Core//prelude/parts/as, BitAndWith, unloaded
|
||||
// CHECK:STDOUT: %Core.Copy = import_ref Core//prelude/parts/copy, Copy, unloaded
|
||||
// CHECK:STDOUT: %Core.DefaultOrUnformed = import_ref Core//prelude/parts/default, DefaultOrUnformed, unloaded
|
||||
// CHECK:STDOUT: %Core.Default = import_ref Core//prelude/parts/default, Default, unloaded
|
||||
// CHECK:STDOUT: %Core.Destroy = import_ref Core//prelude/parts/destroy, Destroy, unloaded
|
||||
// CHECK:STDOUT: %Core.Form = import_ref Core//prelude/parts/form, Form, unloaded
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: file {
|
||||
// CHECK:STDOUT: package: <namespace> = namespace [concrete] {
|
||||
// CHECK:STDOUT: .UnsafeAs = imports.%Core.UnsafeAs
|
||||
// CHECK:STDOUT: .As = imports.%Core.As
|
||||
// CHECK:STDOUT: .ImplicitAs = imports.%Core.ImplicitAs
|
||||
// CHECK:STDOUT: .BitAndWith = imports.%Core.BitAndWith
|
||||
// CHECK:STDOUT: .Copy = imports.%Core.Copy
|
||||
// CHECK:STDOUT: .DefaultOrUnformed = imports.%Core.DefaultOrUnformed
|
||||
// CHECK:STDOUT: .Default = imports.%Core.Default
|
||||
// CHECK:STDOUT: .Destroy = imports.%Core.Destroy
|
||||
// CHECK:STDOUT: .Form = imports.%Core.Form
|
||||
// CHECK:STDOUT: .IndexWith = %IndexWith.decl
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %default.import = import <none>
|
||||
// CHECK:STDOUT: %IndexWith.decl: type = class_decl @IndexWith [concrete = constants.%IndexWith] {} {}
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
@@ -210,10 +232,32 @@ fn F() {
|
||||
// CHECK:STDOUT: %assoc0: %IndexWith.assoc_type = assoc_entity element0, @IndexWith.WithSelf.%IndexWith.WithSelf.At.decl [symbolic]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: imports {
|
||||
// CHECK:STDOUT: %Core.UnsafeAs = import_ref Core//prelude/parts/as, UnsafeAs, unloaded
|
||||
// CHECK:STDOUT: %Core.As = import_ref Core//prelude/parts/as, As, unloaded
|
||||
// CHECK:STDOUT: %Core.ImplicitAs = import_ref Core//prelude/parts/as, ImplicitAs, unloaded
|
||||
// CHECK:STDOUT: %Core.BitAndWith = import_ref Core//prelude/parts/as, BitAndWith, unloaded
|
||||
// CHECK:STDOUT: %Core.Copy = import_ref Core//prelude/parts/copy, Copy, unloaded
|
||||
// CHECK:STDOUT: %Core.DefaultOrUnformed = import_ref Core//prelude/parts/default, DefaultOrUnformed, unloaded
|
||||
// CHECK:STDOUT: %Core.Default = import_ref Core//prelude/parts/default, Default, unloaded
|
||||
// CHECK:STDOUT: %Core.Destroy = import_ref Core//prelude/parts/destroy, Destroy, unloaded
|
||||
// CHECK:STDOUT: %Core.Form = import_ref Core//prelude/parts/form, Form, unloaded
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: file {
|
||||
// CHECK:STDOUT: package: <namespace> = namespace [concrete] {
|
||||
// CHECK:STDOUT: .UnsafeAs = imports.%Core.UnsafeAs
|
||||
// CHECK:STDOUT: .As = imports.%Core.As
|
||||
// CHECK:STDOUT: .ImplicitAs = imports.%Core.ImplicitAs
|
||||
// CHECK:STDOUT: .BitAndWith = imports.%Core.BitAndWith
|
||||
// CHECK:STDOUT: .Copy = imports.%Core.Copy
|
||||
// CHECK:STDOUT: .DefaultOrUnformed = imports.%Core.DefaultOrUnformed
|
||||
// CHECK:STDOUT: .Default = imports.%Core.Default
|
||||
// CHECK:STDOUT: .Destroy = imports.%Core.Destroy
|
||||
// CHECK:STDOUT: .Form = imports.%Core.Form
|
||||
// CHECK:STDOUT: .IndexWith = %IndexWith.decl
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %default.import = import <none>
|
||||
// CHECK:STDOUT: %IndexWith.decl: %IndexWith.type.df6 = interface_decl @IndexWith [concrete = constants.%IndexWith.generic] {
|
||||
// CHECK:STDOUT: %SubscriptType.patt.loc4_34.1: %pattern_type.98f = symbolic_binding_pattern SubscriptType, 0 [symbolic = %SubscriptType.patt.loc4_34.2 (constants.%SubscriptType.patt)]
|
||||
// CHECK:STDOUT: %ElementType.patt.loc4_53.1: %pattern_type.98f = symbolic_binding_pattern ElementType, 1 [symbolic = %ElementType.patt.loc4_53.2 (constants.%ElementType.patt)]
|
||||
|
||||
@@ -36,10 +36,12 @@ constexpr Kind UntestedKinds[] = {
|
||||
Kind::BuildPreludeManifestError,
|
||||
Kind::BuildTempDirectoryCreationError,
|
||||
Kind::BuildTempDirectoryDeletionError,
|
||||
Kind::CompileCoreManifestError,
|
||||
Kind::CompilePreludeManifestError,
|
||||
Kind::ConfigFailedToReadDigest,
|
||||
Kind::ConfigFailedToSetupTarget,
|
||||
Kind::DriverInstallInvalid,
|
||||
Kind::LinkCarbonPreludeBuildFailed,
|
||||
|
||||
// These diagnose filesystem issues that are hard to unit test.
|
||||
Kind::ErrorReadingFile,
|
||||
|
||||
@@ -30,6 +30,7 @@ CARBON_DIAGNOSTIC_KIND(BuildOutputFileOpenError)
|
||||
CARBON_DIAGNOSTIC_KIND(BuildPreludeManifestError)
|
||||
CARBON_DIAGNOSTIC_KIND(BuildTempDirectoryCreationError)
|
||||
CARBON_DIAGNOSTIC_KIND(BuildTempDirectoryDeletionError)
|
||||
CARBON_DIAGNOSTIC_KIND(CompileCoreManifestError)
|
||||
CARBON_DIAGNOSTIC_KIND(CompilePhaseFlagConflict)
|
||||
CARBON_DIAGNOSTIC_KIND(CompilePreludeManifestError)
|
||||
CARBON_DIAGNOSTIC_KIND(CompileInputNotRegularFile)
|
||||
@@ -42,6 +43,7 @@ CARBON_DIAGNOSTIC_KIND(FailureBuildingRuntimes)
|
||||
CARBON_DIAGNOSTIC_KIND(FailureRunningClang)
|
||||
CARBON_DIAGNOSTIC_KIND(FailureRunningClangToLink)
|
||||
CARBON_DIAGNOSTIC_KIND(FormatMultipleFilesToOneOutput)
|
||||
CARBON_DIAGNOSTIC_KIND(LinkCarbonPreludeBuildFailed)
|
||||
CARBON_DIAGNOSTIC_KIND(LinkObjectFilesMissing)
|
||||
CARBON_DIAGNOSTIC_KIND(LinkOutputOptionMissing)
|
||||
CARBON_DIAGNOSTIC_KIND(ToolFuzzingDisallowed)
|
||||
|
||||
@@ -184,6 +184,8 @@ cc_library(
|
||||
"build_runtimes_subcommand.h",
|
||||
"build_subcommand.cpp",
|
||||
"build_subcommand.h",
|
||||
"carbon_runtimes.cpp",
|
||||
"carbon_runtimes.h",
|
||||
"clang_subcommand.cpp",
|
||||
"clang_subcommand.h",
|
||||
"compile_subcommand.cpp",
|
||||
@@ -235,6 +237,7 @@ cc_library(
|
||||
"//toolchain/base:clang_invocation",
|
||||
"//toolchain/base:install_paths",
|
||||
"//toolchain/base:llvm_tools",
|
||||
"//toolchain/base:runtimes_build_info",
|
||||
"//toolchain/base:shared_value_stores",
|
||||
"//toolchain/base:timings",
|
||||
"//toolchain/check",
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include "toolchain/driver/build_runtimes_subcommand.h"
|
||||
|
||||
#include "llvm/TargetParser/Triple.h"
|
||||
#include "toolchain/driver/carbon_runtimes.h"
|
||||
#include "toolchain/driver/clang_runner.h"
|
||||
#include "toolchain/driver/clang_runtimes.h"
|
||||
|
||||
@@ -97,6 +98,7 @@ auto BuildRuntimesSubcommand::RunInternal(DriverEnv& driver_env)
|
||||
CARBON_RETURN_IF_ERROR(runtimes.Remove(Runtimes::ClangResourceDir));
|
||||
CARBON_RETURN_IF_ERROR(runtimes.Remove(Runtimes::LibUnwind));
|
||||
CARBON_RETURN_IF_ERROR(runtimes.Remove(Runtimes::Libcxx));
|
||||
CARBON_RETURN_IF_ERROR(runtimes.Remove(Runtimes::CarbonCore));
|
||||
}
|
||||
|
||||
ClangResourceDirBuilder resource_dir_builder(&runner, driver_env.thread_pool,
|
||||
@@ -108,10 +110,13 @@ auto BuildRuntimesSubcommand::RunInternal(DriverEnv& driver_env)
|
||||
ClangArchiveRuntimesBuilder<Runtimes::Libcxx> libcxx_builder(
|
||||
&runner, driver_env.thread_pool, llvm::Triple(features.target),
|
||||
&runtimes);
|
||||
CarbonPreludeBuilder prelude_builder(&driver_env, &runtimes,
|
||||
&options_.codegen_options);
|
||||
|
||||
CARBON_RETURN_IF_ERROR(std::move(resource_dir_builder).Wait());
|
||||
CARBON_RETURN_IF_ERROR(std::move(lib_unwind_builder).Wait());
|
||||
CARBON_RETURN_IF_ERROR(std::move(libcxx_builder).Wait());
|
||||
CARBON_RETURN_IF_ERROR(std::move(prelude_builder).Build());
|
||||
|
||||
return runtimes.base_path();
|
||||
}
|
||||
|
||||
@@ -15,8 +15,8 @@
|
||||
namespace Carbon {
|
||||
|
||||
auto BuildSubcommandOptions::Build(CommandLine::CommandBuilder& b) -> void {
|
||||
compile_options.BuildForBuildSubcommand(b);
|
||||
link_options.BuildForBuildSubcommand(b);
|
||||
compile_options.BuildForBuildSubcommand(b, &codegen_options);
|
||||
link_options.BuildForBuildSubcommand(b, &codegen_options);
|
||||
|
||||
b.AddFlag(
|
||||
{
|
||||
@@ -50,6 +50,8 @@ auto BuildSubcommand::BuildOptions(CommandLine::CommandBuilder& b) -> void {
|
||||
}
|
||||
|
||||
auto BuildSubcommand::Run(DriverEnv& driver_env) -> DriverResult {
|
||||
options_.compile_options.FixupFlags();
|
||||
|
||||
if (driver_env.fuzzing && !options_.compile_options.clang_args.empty()) {
|
||||
// Parsing specific Clang arguments can reach deep into
|
||||
// external libraries that aren't fuzz clean.
|
||||
@@ -72,7 +74,7 @@ auto BuildSubcommand::Run(DriverEnv& driver_env) -> DriverResult {
|
||||
}
|
||||
}
|
||||
|
||||
auto on_exit = llvm::scope_exit([&]() {
|
||||
auto on_exit = llvm::scope_exit([&] {
|
||||
// Clean up the temporary directory created for compile results.
|
||||
if (temp_dir) {
|
||||
auto remove_result = std::move(*temp_dir).Remove();
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#define CARBON_TOOLCHAIN_DRIVER_BUILD_SUBCOMMAND_H_
|
||||
|
||||
#include "common/command_line.h"
|
||||
#include "toolchain/driver/codegen_options.h"
|
||||
#include "toolchain/driver/compile_options.h"
|
||||
#include "toolchain/driver/driver_env.h"
|
||||
#include "toolchain/driver/driver_subcommand.h"
|
||||
@@ -17,6 +18,7 @@ namespace Carbon {
|
||||
struct BuildSubcommandOptions {
|
||||
auto Build(CommandLine::CommandBuilder& b) -> void;
|
||||
|
||||
CodegenOptions codegen_options;
|
||||
CompileOptions compile_options;
|
||||
LinkOptions link_options;
|
||||
bool use_temp_dir;
|
||||
|
||||
@@ -0,0 +1,108 @@
|
||||
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
|
||||
// Exceptions. See /LICENSE for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
|
||||
#include "toolchain/driver/carbon_runtimes.h"
|
||||
|
||||
#include "toolchain/base/install_paths.h"
|
||||
#include "toolchain/base/runtimes_build_info.h"
|
||||
|
||||
namespace Carbon {
|
||||
|
||||
CarbonRuntimesBuilderBase::CarbonRuntimesBuilderBase(
|
||||
DriverEnv* driver_env, const CodegenOptions* codegen_options)
|
||||
: compile_options_(codegen_options),
|
||||
compile_driver_(&compile_options_),
|
||||
driver_env_(driver_env),
|
||||
install_root_(driver_env->installation->root()),
|
||||
result_(Error("Did not finish building the Carbon runtimes!")) {
|
||||
// Each prelude file explicitly imports the other parts of the prelude it
|
||||
// needs.
|
||||
compile_options_.prelude_import = false;
|
||||
// Don't also try and compile the rest of the core when compiling the prelude.
|
||||
compile_options_.include_carbon_core = false;
|
||||
}
|
||||
|
||||
CarbonPreludeBuilder::CarbonPreludeBuilder(
|
||||
DriverEnv* driver_env, Runtimes* runtimes,
|
||||
const CodegenOptions* codegen_options)
|
||||
: CarbonRuntimesBuilderBase(driver_env, codegen_options) {
|
||||
auto build_dir_or_error = runtimes->Build(Runtimes::CarbonCore);
|
||||
if (!build_dir_or_error.ok()) {
|
||||
result_ = std::move(build_dir_or_error).error();
|
||||
return;
|
||||
}
|
||||
auto build_dir = *std::move(build_dir_or_error);
|
||||
if (std::holds_alternative<std::filesystem::path>(build_dir)) {
|
||||
// Reuse cached build.
|
||||
result_ = std::get<std::filesystem::path>(std::move(build_dir));
|
||||
return;
|
||||
}
|
||||
|
||||
runtimes_builder_ = std::get<Runtimes::Builder>(std::move(build_dir));
|
||||
lib_path_ = std::filesystem::path("lib/core") /
|
||||
compile_options_.codegen_options->target.str();
|
||||
}
|
||||
|
||||
auto CarbonPreludeBuilder::Build() && -> ErrorOr<std::filesystem::path> {
|
||||
// If we didn't make a Builder in the constructor we either encountered an
|
||||
// error or an already cached build, return the result.
|
||||
if (!runtimes_builder_) {
|
||||
return std::move(result_);
|
||||
}
|
||||
|
||||
// Create the output directory.
|
||||
auto lib_dir_result = runtimes_builder_->dir().CreateDirectories(lib_path_);
|
||||
if (!lib_dir_result.ok()) {
|
||||
return std::move(lib_dir_result).error();
|
||||
}
|
||||
auto lib_dir = *std::move(lib_dir_result);
|
||||
|
||||
// Gather the absolute paths to the prelude source files into a string list.
|
||||
// This serves as a backing store for the `llvm::StringRef` inputs required to
|
||||
// the `CompileDriver` via `compile_options_`.
|
||||
llvm::SmallVector<std::string> prelude_source_files;
|
||||
llvm::for_each(RuntimesBuildInfo::CarbonCorePreludeSrcs,
|
||||
[&](llvm::StringRef src) -> void {
|
||||
prelude_source_files.emplace_back(
|
||||
(install_root_ / std::filesystem::path(src.str())));
|
||||
compile_options_.input_filenames.emplace_back(
|
||||
llvm::StringRef(prelude_source_files.back()));
|
||||
});
|
||||
|
||||
auto install_root_length = install_root_.string().length();
|
||||
CARBON_CHECK(
|
||||
compile_driver_.Initialize(
|
||||
*driver_env_,
|
||||
[&](llvm::StringRef input_filename) -> std::string {
|
||||
// Make the input path relative to the install_root_ again, and
|
||||
// replace the `.carbon` extension with a `.o`.
|
||||
auto object_path =
|
||||
std::filesystem::path(
|
||||
input_filename.substr(install_root_length).str())
|
||||
.replace_extension(".o");
|
||||
auto output_path =
|
||||
runtimes_builder_->path() / lib_path_ / object_path;
|
||||
// The output path may contain subdirectories that haven't yet been
|
||||
// created, so check for that and create if necessary.
|
||||
if (!std::filesystem::exists(output_path.parent_path())) {
|
||||
CARBON_CHECK(
|
||||
runtimes_builder_->dir()
|
||||
.CreateDirectories(lib_path_ / output_path.parent_path())
|
||||
.ok(),
|
||||
"Failed to make output subdirectory while building Carbon "
|
||||
"prelude.");
|
||||
}
|
||||
llvm::errs() << "mapping: `" << input_filename << "` to: `"
|
||||
<< output_path << "`\n";
|
||||
return output_path.string();
|
||||
}),
|
||||
"Failed to initialize compiler driver for Carbon prelude.");
|
||||
CARBON_CHECK(compile_driver_.Compile(*driver_env_).success,
|
||||
"Failed to compile Carbon prelude.");
|
||||
|
||||
result_ = (*std::move(runtimes_builder_)).Commit();
|
||||
return std::move(result_);
|
||||
}
|
||||
|
||||
} // namespace Carbon
|
||||
@@ -0,0 +1,65 @@
|
||||
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
|
||||
// Exceptions. See /LICENSE for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
|
||||
#ifndef CARBON_TOOLCHAIN_DRIVER_CARBON_RUNTIMES_H_
|
||||
#define CARBON_TOOLCHAIN_DRIVER_CARBON_RUNTIMES_H_
|
||||
|
||||
#include <filesystem>
|
||||
#include <memory>
|
||||
|
||||
#include "common/error.h"
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
#include "llvm/Support/ThreadPool.h"
|
||||
#include "llvm/TargetParser/Triple.h"
|
||||
#include "toolchain/driver/codegen_options.h"
|
||||
#include "toolchain/driver/compile_driver.h"
|
||||
#include "toolchain/driver/compile_options.h"
|
||||
#include "toolchain/driver/driver_env.h"
|
||||
#include "toolchain/driver/runtimes_cache.h"
|
||||
|
||||
namespace Carbon {
|
||||
|
||||
struct CompileOptions;
|
||||
|
||||
// Common code for Carbon runtimes builders.
|
||||
//
|
||||
// Although this class has only a single derivation for building the prelude,
|
||||
// we anticipate wanting to build other parts of Core in the future and so
|
||||
// design for extensibility.
|
||||
// TODO: Build all parts of the Core, not just the prelude.
|
||||
class CarbonRuntimesBuilderBase {
|
||||
protected:
|
||||
CarbonRuntimesBuilderBase(DriverEnv* driver_env,
|
||||
const CodegenOptions* codegen_options);
|
||||
|
||||
// We use protected members as this base is just factoring out common
|
||||
// implementation details of other runners.
|
||||
//
|
||||
// NOLINTBEGIN(misc-non-private-member-variables-in-classes)
|
||||
//
|
||||
CompileOptions compile_options_;
|
||||
CompileDriver compile_driver_;
|
||||
DriverEnv* driver_env_;
|
||||
// Base path for the input source files. The enumerated constant list of
|
||||
// paths is all relative to this base path.
|
||||
std::filesystem::path install_root_;
|
||||
// Output subpath for the built binaries.
|
||||
std::filesystem::path lib_path_;
|
||||
ErrorOr<std::filesystem::path> result_;
|
||||
std::optional<Runtimes::Builder> runtimes_builder_;
|
||||
// NOLINTEND(misc-non-private-member-variables-in-classes)
|
||||
};
|
||||
|
||||
class CarbonPreludeBuilder : public CarbonRuntimesBuilderBase {
|
||||
public:
|
||||
CarbonPreludeBuilder(DriverEnv* driver_env, Runtimes* runtimes,
|
||||
const CodegenOptions* codegen_options);
|
||||
auto Build() && -> ErrorOr<std::filesystem::path>;
|
||||
};
|
||||
|
||||
} // namespace Carbon
|
||||
|
||||
#endif // CARBON_TOOLCHAIN_DRIVER_CARBON_RUNTIMES_H_
|
||||
@@ -105,8 +105,7 @@ class ClangRuntimesBuilderBase::ArchiveBuilder {
|
||||
//
|
||||
// - The `builder` must outlive this object.
|
||||
// - `archive_path` is the _relative_ path of the archive file within the
|
||||
// built
|
||||
// runtimes directory.
|
||||
// built runtimes directory.
|
||||
// - `src_files` is a list of the _absolute_ file paths to build into the
|
||||
// archive.
|
||||
// - `cflags` are the compile flags that should be used for all the compiles
|
||||
|
||||
@@ -481,9 +481,27 @@ auto CompileDriver::Initialize(
|
||||
}
|
||||
}
|
||||
|
||||
// Append the Core library files on request.
|
||||
llvm::SmallVector<std::string> core_library;
|
||||
if (options_->include_carbon_core && !options_->custom_core &&
|
||||
options_->phase >= CompileOptions::Phase::Check) {
|
||||
if (auto find = driver_env.installation->ReadCarbonCoreManifest();
|
||||
!find.ok()) {
|
||||
CARBON_DIAGNOSTIC(CompileCoreManifestError, Error, "{0}", std::string);
|
||||
driver_env.emitter.Emit(CompileCoreManifestError,
|
||||
PrintToString(find.error()));
|
||||
return false;
|
||||
} else {
|
||||
// Note we also compile any .impl files, as we will need to include them
|
||||
// in the subsequent link step.
|
||||
core_library = std::move(*find);
|
||||
}
|
||||
}
|
||||
|
||||
// Prepare CompilationUnits before building scope exit handlers.
|
||||
int unit_index = -1;
|
||||
int total_unit_count = prelude.size() + options_->input_filenames.size();
|
||||
int total_unit_count =
|
||||
prelude.size() + core_library.size() + options_->input_filenames.size();
|
||||
auto unit_builder = [&](llvm::StringRef filename) {
|
||||
++unit_index;
|
||||
return std::make_unique<CompilationUnit>(
|
||||
@@ -491,6 +509,7 @@ auto CompileDriver::Initialize(
|
||||
driver_env.consumer, filename, map_input(filename), target);
|
||||
};
|
||||
llvm::append_range(units_, llvm::map_range(prelude, unit_builder));
|
||||
llvm::append_range(units_, llvm::map_range(core_library, unit_builder));
|
||||
input_filenames_index_ = units_.size();
|
||||
llvm::append_range(units_,
|
||||
llvm::map_range(options_->input_filenames, unit_builder));
|
||||
|
||||
@@ -238,13 +238,13 @@ class CompileDriver {
|
||||
// The `map_input` function maps an input file name to an output static
|
||||
// object name.
|
||||
// Returns `false` on configuration error.
|
||||
auto Initialize(
|
||||
[[nodiscard]] auto Initialize(
|
||||
DriverEnv& driver_env,
|
||||
llvm::function_ref<auto(llvm::StringRef)->std::string> map_input) -> bool;
|
||||
|
||||
// Performs the compilation process on each input specified in the
|
||||
// `CompileOptions` provided at construction time.
|
||||
auto Compile(DriverEnv& driver_env) -> DriverResult;
|
||||
[[nodiscard]] auto Compile(DriverEnv& driver_env) -> DriverResult;
|
||||
|
||||
// Returns the index in the `units()` array of the first input file
|
||||
// specified by the user on the command line. This may not be the first
|
||||
|
||||
@@ -14,8 +14,8 @@ namespace {
|
||||
|
||||
// Provides command-line options common to both `compile` and `link`
|
||||
// subcommands.
|
||||
auto BuildSharedOptions(CommandLine::CommandBuilder& b, CompileOptions* options)
|
||||
-> void {
|
||||
auto BuildSharedOptions(CommandLine::CommandBuilder& b, CompileOptions* options,
|
||||
CodegenOptions* cg_options) -> void {
|
||||
b.AddStringPositionalArg(
|
||||
{
|
||||
.name = "FILE",
|
||||
@@ -82,7 +82,8 @@ Selects the amount of optimization to perform.
|
||||
// Include the common code generation options at this point to render it
|
||||
// after the more common options above, but before the more unusual options
|
||||
// below.
|
||||
options->codegen_options->Build(b);
|
||||
cg_options->Build(b);
|
||||
options->codegen_options = cg_options;
|
||||
|
||||
b.AddFlag(
|
||||
{
|
||||
@@ -121,9 +122,10 @@ Whether to use the implicit prelude import. Enabled by default.
|
||||
|
||||
} // namespace
|
||||
|
||||
auto CompileOptions::BuildForCompileSubcommand(CommandLine::CommandBuilder& b)
|
||||
auto CompileOptions::BuildForCompileSubcommand(CommandLine::CommandBuilder& b,
|
||||
CodegenOptions* cg_options)
|
||||
-> void {
|
||||
BuildSharedOptions(b, this);
|
||||
BuildSharedOptions(b, this, cg_options);
|
||||
|
||||
b.AddOneOfOption(
|
||||
{
|
||||
@@ -386,11 +388,34 @@ Use the string form of the fingerprint from mangling instead of the hash form.
|
||||
)""",
|
||||
},
|
||||
[&](auto& arg_b) { arg_b.Set(&mangle_string_fingerprint); });
|
||||
b.AddFlag(
|
||||
{
|
||||
.name = "include-carbon-core",
|
||||
.help = R"""(
|
||||
Automatically include the Core libraries files in the compilation.
|
||||
|
||||
Note this refers to the Core libraries files other than the prelude, the
|
||||
inclusion of which is currently controlled by the `prelude_import` flag. If
|
||||
the `prelude_import` flag is set to false, this is also silently set to false.
|
||||
)""",
|
||||
},
|
||||
[&](auto& arg_b) {
|
||||
arg_b.Default(true);
|
||||
arg_b.Set(&include_carbon_core);
|
||||
});
|
||||
}
|
||||
|
||||
auto CompileOptions::BuildForBuildSubcommand(CommandLine::CommandBuilder& b)
|
||||
auto CompileOptions::BuildForBuildSubcommand(CommandLine::CommandBuilder& b,
|
||||
CodegenOptions* cg_options)
|
||||
-> void {
|
||||
BuildSharedOptions(b, this);
|
||||
include_carbon_core = true;
|
||||
BuildSharedOptions(b, this, cg_options);
|
||||
}
|
||||
|
||||
auto CompileOptions::FixupFlags() -> void {
|
||||
if (!prelude_import) {
|
||||
include_carbon_core = false;
|
||||
}
|
||||
}
|
||||
|
||||
auto CompileOptions::ValidatePhase(Diagnostics::NoLocEmitter& emitter) const
|
||||
|
||||
@@ -5,8 +5,6 @@
|
||||
#ifndef CARBON_TOOLCHAIN_DRIVER_COMPILE_OPTIONS_H_
|
||||
#define CARBON_TOOLCHAIN_DRIVER_COMPILE_OPTIONS_H_
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "common/command_line.h"
|
||||
#include "common/error.h"
|
||||
#include "common/ostream.h"
|
||||
@@ -31,6 +29,10 @@ namespace Carbon {
|
||||
//
|
||||
// Members are documented in their respective `Build` functions.
|
||||
struct CompileOptions {
|
||||
CompileOptions() = default;
|
||||
explicit CompileOptions(const CodegenOptions* cg_options)
|
||||
: codegen_options(cg_options) {}
|
||||
|
||||
enum class Phase : int8_t {
|
||||
Lex,
|
||||
Parse,
|
||||
@@ -43,8 +45,20 @@ struct CompileOptions {
|
||||
friend auto operator<<(llvm::raw_ostream& out, Phase phase)
|
||||
-> llvm::raw_ostream&;
|
||||
|
||||
auto BuildForCompileSubcommand(CommandLine::CommandBuilder& b) -> void;
|
||||
auto BuildForBuildSubcommand(CommandLine::CommandBuilder& b) -> void;
|
||||
// Will use the provided `cg_options` to initialize the `codegen_options`
|
||||
// member variable. This is provided separately so we can call `Build()`
|
||||
// at a specific time in the initialization sequence for the correct priority
|
||||
// of the Codegen Options build flags and help documentation.
|
||||
auto BuildForCompileSubcommand(CommandLine::CommandBuilder& b,
|
||||
CodegenOptions* cg_options) -> void;
|
||||
auto BuildForBuildSubcommand(CommandLine::CommandBuilder& b,
|
||||
CodegenOptions* cg_options) -> void;
|
||||
|
||||
// It's possible to specify flags that will break the compile. In particular
|
||||
// specifying `--no-prelude-import` and `--include-carbon-core` will cause
|
||||
// the Core compilation to fail. This function quietly disables Carbon Core
|
||||
// inclusion if the prelude import is disabled.
|
||||
auto FixupFlags() -> void;
|
||||
|
||||
// Validate that the compile options make sense for the compilation phase
|
||||
// selected.
|
||||
@@ -66,8 +80,10 @@ struct CompileOptions {
|
||||
-> ErrorOr<std::shared_ptr<clang::CompilerInvocation>>;
|
||||
|
||||
Lower::OptimizationLevel opt_level = Lower::OptimizationLevel::Debug;
|
||||
std::shared_ptr<CodegenOptions> codegen_options =
|
||||
std::make_shared<CodegenOptions>();
|
||||
|
||||
// This pointer is set by `Build*()` functions, in other use cases this
|
||||
// pointer will need to be set manually.
|
||||
const CodegenOptions* codegen_options = nullptr;
|
||||
|
||||
llvm::SmallVector<llvm::StringRef> input_filenames;
|
||||
llvm::SmallVector<llvm::StringRef> clang_args;
|
||||
@@ -97,8 +113,9 @@ struct CompileOptions {
|
||||
bool stream_errors = false;
|
||||
bool preorder_parse_tree = false;
|
||||
bool builtin_sem_ir = false;
|
||||
bool prelude_import = false;
|
||||
bool prelude_import = true;
|
||||
bool output_last_input_only = false;
|
||||
bool include_carbon_core = true;
|
||||
|
||||
llvm::SmallVector<llvm::StringRef> exclude_dump_file_prefixes;
|
||||
|
||||
|
||||
@@ -26,19 +26,21 @@ can be written to standard output as these phases progress.
|
||||
CompileSubcommand::CompileSubcommand() : DriverSubcommand(SubcommandInfo) {}
|
||||
|
||||
auto CompileSubcommand::Run(DriverEnv& driver_env) -> DriverResult {
|
||||
if (driver_env.fuzzing && !options_.clang_args.empty()) {
|
||||
options_.compile_options.FixupFlags();
|
||||
|
||||
if (driver_env.fuzzing && !options_.compile_options.clang_args.empty()) {
|
||||
// Parsing specific Clang arguments can reach deep into
|
||||
// external libraries that aren't fuzz clean.
|
||||
TestAndDiagnoseIfFuzzingExternalLibraries(driver_env, "compile");
|
||||
return {.success = false};
|
||||
}
|
||||
|
||||
auto compile_driver = CompileDriver(&options_);
|
||||
auto compile_driver = CompileDriver(&options_.compile_options);
|
||||
|
||||
if (!compile_driver.Initialize(driver_env,
|
||||
[&](llvm::StringRef) -> std::string {
|
||||
return options_.output_filename.str();
|
||||
})) {
|
||||
if (!compile_driver.Initialize(
|
||||
driver_env, [&](llvm::StringRef) -> std::string {
|
||||
return options_.compile_options.output_filename.str();
|
||||
})) {
|
||||
return {.success = false};
|
||||
}
|
||||
|
||||
|
||||
@@ -12,19 +12,29 @@
|
||||
|
||||
namespace Carbon {
|
||||
|
||||
// Options for the compile subcommand.
|
||||
struct CompileSubcommandOptions {
|
||||
auto Build(CommandLine::CommandBuilder& b) -> void {
|
||||
compile_options.BuildForCompileSubcommand(b, &codegen_options);
|
||||
}
|
||||
|
||||
CodegenOptions codegen_options;
|
||||
CompileOptions compile_options;
|
||||
};
|
||||
|
||||
// Implements the compile subcommand of the driver.
|
||||
class CompileSubcommand : public DriverSubcommand {
|
||||
public:
|
||||
explicit CompileSubcommand();
|
||||
|
||||
auto BuildOptions(CommandLine::CommandBuilder& b) -> void override {
|
||||
options_.BuildForCompileSubcommand(b);
|
||||
options_.Build(b);
|
||||
}
|
||||
|
||||
auto Run(DriverEnv& driver_env) -> DriverResult override;
|
||||
|
||||
private:
|
||||
CompileOptions options_;
|
||||
CompileSubcommandOptions options_;
|
||||
};
|
||||
|
||||
} // namespace Carbon
|
||||
|
||||
@@ -4,10 +4,57 @@
|
||||
|
||||
#include "toolchain/driver/link_driver.h"
|
||||
|
||||
#include "common/filesystem.h"
|
||||
#include "toolchain/base/runtimes_build_info.h"
|
||||
#include "toolchain/driver/carbon_runtimes.h"
|
||||
|
||||
namespace Carbon {
|
||||
|
||||
LinkDriver::LinkDriver(LinkOptions* options) : options_(options) {}
|
||||
|
||||
namespace {
|
||||
|
||||
auto object_search(Filesystem::DirRef base_dir, std::filesystem::path base_path,
|
||||
llvm::SmallVector<std::string>& prelude_paths) -> void {
|
||||
llvm::SmallVector<std::filesystem::path> work_paths({"."});
|
||||
while (!work_paths.empty()) {
|
||||
auto relative_path = work_paths.back();
|
||||
work_paths.pop_back();
|
||||
auto relative_dir = base_dir.OpenDir(relative_path);
|
||||
CARBON_CHECK(relative_dir.ok());
|
||||
llvm::SmallVector<std::filesystem::path> relative_sub_paths;
|
||||
llvm::SmallVector<std::filesystem::path> relative_file_paths;
|
||||
CARBON_CHECK(
|
||||
relative_dir
|
||||
->AppendEntriesIf(relative_sub_paths, relative_file_paths,
|
||||
[&relative_dir](llvm::StringRef name) -> bool {
|
||||
auto path = std::filesystem::path(name.str());
|
||||
auto stat = relative_dir->Stat(path);
|
||||
CARBON_CHECK(stat.ok());
|
||||
if (stat->is_dir()) {
|
||||
return true;
|
||||
}
|
||||
return path.extension() == ".o";
|
||||
})
|
||||
.ok());
|
||||
llvm::append_range(
|
||||
work_paths,
|
||||
llvm::map_range(relative_sub_paths,
|
||||
[relative_path](std::filesystem::path sub_path) {
|
||||
return relative_path / sub_path;
|
||||
}));
|
||||
llvm::append_range(
|
||||
prelude_paths,
|
||||
llvm::map_range(
|
||||
relative_file_paths,
|
||||
[relative_path, base_path](std::filesystem::path file_path) {
|
||||
return (base_path / relative_path / file_path).string();
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
auto LinkDriver::Link(DriverEnv& driver_env) -> DriverResult {
|
||||
// TODO: Currently we use the Clang driver to link. This works well on Unix
|
||||
// OSes but we likely need to directly build logic to invoke `link.exe` on
|
||||
@@ -45,6 +92,51 @@ auto LinkDriver::Link(DriverEnv& driver_env) -> DriverResult {
|
||||
return {.success = false};
|
||||
}
|
||||
|
||||
// Find or build the Carbon Core runtimes for linking the prelude into the
|
||||
// binary.
|
||||
bool include_prelude = false;
|
||||
std::filesystem::path core_path;
|
||||
Filesystem::DirRef runtimes_dir;
|
||||
std::filesystem::path runtimes_path;
|
||||
std::optional<Runtimes> runtimes_cache;
|
||||
if (options_->link_prelude_files) {
|
||||
if (driver_env.prebuilt_runtimes) {
|
||||
auto error_or_path =
|
||||
driver_env.prebuilt_runtimes->Get(Runtimes::CarbonCore);
|
||||
CARBON_CHECK(error_or_path.ok(),
|
||||
"Prebuilt runtimes failed to fetch for Carbon prelude: {}",
|
||||
error_or_path.error().message());
|
||||
core_path = std::move(*error_or_path);
|
||||
runtimes_dir = driver_env.prebuilt_runtimes->base_dir();
|
||||
runtimes_path = driver_env.prebuilt_runtimes->base_path();
|
||||
include_prelude = true;
|
||||
} else if (driver_env.build_runtimes_on_demand) {
|
||||
Runtimes::Cache::Features features = {
|
||||
.target = options_->codegen_options->target.str()};
|
||||
auto runtimes_or_error = driver_env.runtimes_cache.Lookup(features);
|
||||
CARBON_CHECK(runtimes_or_error.ok(), "Runtimes cache lookup failed: {}",
|
||||
runtimes_or_error.error().message());
|
||||
auto runtimes = std::move(*runtimes_or_error);
|
||||
CarbonPreludeBuilder prelude_builder(&driver_env, &runtimes,
|
||||
options_->codegen_options);
|
||||
auto path_or_error = std::move(prelude_builder).Build();
|
||||
if (!path_or_error.ok()) {
|
||||
CARBON_DIAGNOSTIC(LinkCarbonPreludeBuildFailed, Error,
|
||||
"Failed to build Carbon prelude during linking: {0}",
|
||||
std::string);
|
||||
driver_env.emitter.Emit(LinkCarbonPreludeBuildFailed,
|
||||
path_or_error.error().message());
|
||||
return {.success = false};
|
||||
}
|
||||
core_path = std::move(*path_or_error);
|
||||
runtimes_dir = runtimes.base_dir();
|
||||
runtimes_path = runtimes.base_path();
|
||||
// Keep the Runtimes object in scope so we can use it during linking.
|
||||
runtimes_cache = std::move(runtimes);
|
||||
include_prelude = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Note that we append any extra Clang args before our object filenames. This
|
||||
// allows us to propagate object filenames that collide with Clang flags using
|
||||
// `--` before the filenames. While in theory, this could create a problem in
|
||||
@@ -53,6 +145,29 @@ auto LinkDriver::Link(DriverEnv& driver_env) -> DriverResult {
|
||||
clang_args.append(options_->extra_clang_args.begin(),
|
||||
options_->extra_clang_args.end());
|
||||
clang_args.push_back("--");
|
||||
|
||||
// Append the Carbon prelude object files to the link.
|
||||
// TODO: should also be able to link in the rest of the Core object files,
|
||||
// if needed.
|
||||
llvm::SmallVector<std::string> prelude_paths;
|
||||
if (include_prelude) {
|
||||
// Open subdirectory specifically for the object files relative to the
|
||||
// runtimes base path.
|
||||
auto relative_path = core_path.lexically_relative(runtimes_path);
|
||||
auto core_dir_or_error = runtimes_dir.OpenDir(relative_path);
|
||||
CARBON_CHECK(core_dir_or_error.ok(),
|
||||
"Failed to open prelude binaries directory at {}, error: {}",
|
||||
runtimes_path / relative_path, core_dir_or_error.error());
|
||||
auto core_dir = std::move(*core_dir_or_error);
|
||||
object_search(core_dir, core_path, prelude_paths);
|
||||
CARBON_CHECK(!prelude_paths.empty(), "Found no prelude files at {}",
|
||||
runtimes_path / relative_path);
|
||||
llvm::append_range(
|
||||
clang_args, llvm::map_range(prelude_paths, [](const std::string& path) {
|
||||
return llvm::StringRef(path);
|
||||
}));
|
||||
}
|
||||
|
||||
clang_args.append(options_->object_filenames.begin(),
|
||||
options_->object_filenames.end());
|
||||
|
||||
|
||||
@@ -27,8 +27,8 @@ system mixes object files and linker flags.
|
||||
|
||||
} // namespace
|
||||
|
||||
auto LinkOptions::BuildForLinkSubcommand(CommandLine::CommandBuilder& b)
|
||||
-> void {
|
||||
auto LinkOptions::BuildForLinkSubcommand(CommandLine::CommandBuilder& b,
|
||||
CodegenOptions* cg_options) -> void {
|
||||
b.AddStringPositionalArg(
|
||||
{
|
||||
.name = "OBJECT_FILE",
|
||||
@@ -56,14 +56,27 @@ legacy parsing logic.
|
||||
},
|
||||
[&](auto& arg_b) { arg_b.Set(&output_filename); });
|
||||
|
||||
BuildSharedOptions(b, this);
|
||||
b.AddFlag(
|
||||
{
|
||||
.name = "link_prelude_files",
|
||||
.help = R"""(
|
||||
Automatically include the Carbon prelude files in the link.
|
||||
)""",
|
||||
},
|
||||
[&](auto& arg_b) {
|
||||
arg_b.Default(true);
|
||||
arg_b.Set(&link_prelude_files);
|
||||
});
|
||||
|
||||
codegen_options = std::make_shared<CodegenOptions>();
|
||||
codegen_options->Build(b);
|
||||
BuildSharedOptions(b, this);
|
||||
cg_options->Build(b);
|
||||
codegen_options = cg_options;
|
||||
}
|
||||
|
||||
auto LinkOptions::BuildForBuildSubcommand(CommandLine::CommandBuilder& b)
|
||||
-> void {
|
||||
auto LinkOptions::BuildForBuildSubcommand(CommandLine::CommandBuilder& b,
|
||||
CodegenOptions* cg_options) -> void {
|
||||
codegen_options = cg_options;
|
||||
|
||||
b.AddStringOption(
|
||||
{
|
||||
.name = "output",
|
||||
@@ -77,6 +90,9 @@ name of the first provided input file.
|
||||
[&](auto& arg_b) { arg_b.Set(&output_filename); });
|
||||
|
||||
BuildSharedOptions(b, this);
|
||||
// The prelude files have already been built and are part of the input binary
|
||||
// set, so will already be linked through that path.
|
||||
link_prelude_files = false;
|
||||
}
|
||||
|
||||
} // namespace Carbon
|
||||
|
||||
@@ -5,8 +5,6 @@
|
||||
#ifndef CARBON_TOOLCHAIN_DRIVER_LINK_OPTIONS_H_
|
||||
#define CARBON_TOOLCHAIN_DRIVER_LINK_OPTIONS_H_
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "common/command_line.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
@@ -20,11 +18,14 @@ namespace Carbon {
|
||||
//
|
||||
// See the implementation of `link` for documentation on members.
|
||||
struct LinkOptions {
|
||||
auto BuildForLinkSubcommand(CommandLine::CommandBuilder& b) -> void;
|
||||
auto BuildForBuildSubcommand(CommandLine::CommandBuilder& b) -> void;
|
||||
auto BuildForLinkSubcommand(CommandLine::CommandBuilder& b,
|
||||
CodegenOptions* cg_options) -> void;
|
||||
auto BuildForBuildSubcommand(CommandLine::CommandBuilder& b,
|
||||
CodegenOptions* cg_options) -> void;
|
||||
|
||||
std::shared_ptr<CodegenOptions> codegen_options;
|
||||
const CodegenOptions* codegen_options = nullptr;
|
||||
llvm::StringRef output_filename;
|
||||
bool link_prelude_files = true;
|
||||
llvm::SmallVector<llvm::StringRef> object_filenames;
|
||||
|
||||
llvm::SmallVector<llvm::StringRef> extra_clang_args;
|
||||
|
||||
@@ -21,12 +21,13 @@ class LinkSubcommand : public DriverSubcommand {
|
||||
explicit LinkSubcommand();
|
||||
|
||||
auto BuildOptions(CommandLine::CommandBuilder& b) -> void override {
|
||||
options_.BuildForLinkSubcommand(b);
|
||||
options_.BuildForLinkSubcommand(b, &codegen_options);
|
||||
}
|
||||
|
||||
auto Run(DriverEnv& driver_env) -> DriverResult override;
|
||||
|
||||
private:
|
||||
CodegenOptions codegen_options;
|
||||
LinkOptions options_;
|
||||
};
|
||||
|
||||
|
||||
@@ -36,15 +36,13 @@ namespace Carbon {
|
||||
// build of these components into their designated subdirectories, including
|
||||
// synchronizing between different threads or processes trying to build the same
|
||||
// component.
|
||||
//
|
||||
// TODO: Add libc++ to the runtimes tree.
|
||||
// TODO: Add the Core library to the runtimes tree.
|
||||
class Runtimes {
|
||||
public:
|
||||
class Builder;
|
||||
class Cache;
|
||||
|
||||
enum Component {
|
||||
CarbonCore,
|
||||
ClangResourceDir,
|
||||
LibUnwind,
|
||||
Libcxx,
|
||||
@@ -153,6 +151,8 @@ class Runtimes {
|
||||
// This uses `std::string_view` to simply using with paths.
|
||||
static constexpr auto ComponentPath(Component component) -> std::string_view {
|
||||
switch (component) {
|
||||
case CarbonCore:
|
||||
return "core";
|
||||
case ClangResourceDir:
|
||||
return "clang_resource_dir";
|
||||
case LibUnwind:
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
// Exceptions. See /LICENSE for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
// ARGS: compile --optimize=debug foo.carbon --target=x86_64-unknown-linux-gnu --phase=optimize --dump-llvm-ir --exclude-dump-file-prefix=%{core}
|
||||
// ARGS: compile --optimize=debug foo.carbon --target=x86_64-unknown-linux-gnu --phase=optimize --dump-llvm-ir --exclude-dump-file-prefix=%{core} --include-carbon-core
|
||||
//
|
||||
// AUTOUPDATE
|
||||
// TIP: To test this file alone, run:
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
// Exceptions. See /LICENSE for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
// ARGS: compile foo.carbon --target=x86_64-unknown-linux-gnu --phase=optimize --dump-llvm-ir --exclude-dump-file-prefix=%{core}
|
||||
// ARGS: compile foo.carbon --target=x86_64-unknown-linux-gnu --phase=optimize --dump-llvm-ir --exclude-dump-file-prefix=%{core} --include-carbon-core
|
||||
//
|
||||
// AUTOUPDATE
|
||||
// TIP: To test this file alone, run:
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
// Exceptions. See /LICENSE for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
// ARGS: compile --optimize=none foo.carbon --target=x86_64-unknown-linux-gnu --phase=optimize --dump-llvm-ir --exclude-dump-file-prefix=%{core}
|
||||
// ARGS: compile --optimize=none foo.carbon --target=x86_64-unknown-linux-gnu --phase=optimize --dump-llvm-ir --exclude-dump-file-prefix=%{core} --include-carbon-core
|
||||
//
|
||||
// AUTOUPDATE
|
||||
// TIP: To test this file alone, run:
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
// Exceptions. See /LICENSE for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
// ARGS: compile --optimize=size foo.carbon --target=x86_64-unknown-linux-gnu --phase=lower --dump-llvm-ir --exclude-dump-file-prefix=%{core}
|
||||
// ARGS: compile --optimize=size foo.carbon --target=x86_64-unknown-linux-gnu --phase=lower --dump-llvm-ir --exclude-dump-file-prefix=%{core} --include-carbon-core
|
||||
//
|
||||
// AUTOUPDATE
|
||||
// TIP: To test this file alone, run:
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
// Exceptions. See /LICENSE for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
// ARGS: compile --optimize=speed foo.carbon --target=x86_64-unknown-linux-gnu --phase=optimize --dump-llvm-ir --exclude-dump-file-prefix=%{core}
|
||||
// ARGS: compile --optimize=speed foo.carbon --target=x86_64-unknown-linux-gnu --phase=optimize --dump-llvm-ir --exclude-dump-file-prefix=%{core} --include-carbon-core
|
||||
//
|
||||
// AUTOUPDATE
|
||||
// TIP: To test this file alone, run:
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/none.carbon
|
||||
// ARGS: -v compile --phase=codegen --target=x86_64-unknown-linux-gnu --output=%t --output-last-input-only %s
|
||||
// ARGS: -v compile --phase=codegen --target=x86_64-unknown-linux-gnu --output=%t --no-include-carbon-core --output-last-input-only %s
|
||||
//
|
||||
// Verifies that various phases are included in vlog output.
|
||||
//
|
||||
|
||||
@@ -34,6 +34,7 @@ load(
|
||||
load("@llvm-project//libcxx:libcxx_library.bzl", "libcxx_and_abi_copts")
|
||||
load("@llvm-project//libunwind:libunwind_library.bzl", "libunwind_copts")
|
||||
load("@rules_python//python:defs.bzl", "py_test")
|
||||
load("//bazel/carbon_rules:defs.bzl", "carbon_prelude")
|
||||
load("//bazel/cc_rules:defs.bzl", "cc_binary", "cc_library", "cc_test")
|
||||
load(
|
||||
"//bazel/cc_toolchains:carbon_bootstrapping.bzl",
|
||||
@@ -147,6 +148,12 @@ toolchain_files(
|
||||
prefix = "core/",
|
||||
)
|
||||
|
||||
toolchain_files(
|
||||
name = "core_library",
|
||||
srcs = ["//core:core_library"],
|
||||
prefix = "core/",
|
||||
)
|
||||
|
||||
toolchain_files(
|
||||
name = "clang_builtin_hdrs",
|
||||
srcs = ["@llvm-project//clang:builtin_headers_gen"],
|
||||
@@ -367,6 +374,7 @@ filegroup(
|
||||
":builtins_all_srcs",
|
||||
":clang_hdrs",
|
||||
":core",
|
||||
":core_library",
|
||||
":install_marker",
|
||||
":installed_bazel_files",
|
||||
":libc_internal_libcxx_hdrs",
|
||||
@@ -483,6 +491,15 @@ filegroup(
|
||||
output_group = "archive",
|
||||
)
|
||||
|
||||
carbon_prelude(
|
||||
name = "carbon_prelude",
|
||||
srcs = [":core"],
|
||||
target_compatible_with = select({
|
||||
":is_runtimes_build": [],
|
||||
"//conditions:default": ["@platforms//:incompatible"],
|
||||
}),
|
||||
)
|
||||
|
||||
cc_library(
|
||||
name = "libunwind",
|
||||
srcs = [":libunwind_srcs"],
|
||||
@@ -576,6 +593,7 @@ filegroup(
|
||||
carbon_runtimes_config(
|
||||
name = "runtimes_cfg",
|
||||
builtins_archive = ":builtins_archive",
|
||||
carbon_prelude_prebuilt = ":carbon_prelude",
|
||||
clang_hdrs_prefix = "llvm/lib/clang/{0}/include/".format(LLVM_VERSION_MAJOR),
|
||||
crt_copts = crt_copts + [
|
||||
# Disable all sanitizers for CRT objects.
|
||||
|
||||
@@ -135,7 +135,13 @@ class InstallTest(unittest.TestCase):
|
||||
try:
|
||||
obj_file = self.tmpdir / f"{name}.o"
|
||||
subprocess.run(
|
||||
[carbon, "compile", f"--output={obj_file}", src_file],
|
||||
[
|
||||
carbon,
|
||||
"compile",
|
||||
"--no-include-carbon-core",
|
||||
f"--output={obj_file}",
|
||||
src_file,
|
||||
],
|
||||
check=True,
|
||||
capture_output=True,
|
||||
text=True,
|
||||
|
||||
@@ -41,6 +41,7 @@ cc_library(
|
||||
"//toolchain/check",
|
||||
"//toolchain/diagnostics:emitter",
|
||||
"//toolchain/diagnostics:file_diagnostics",
|
||||
"//toolchain/driver:codegen_options",
|
||||
"//toolchain/driver:compile_driver",
|
||||
"//toolchain/lex",
|
||||
"//toolchain/lex:tokenized_buffer",
|
||||
|
||||
@@ -228,11 +228,13 @@ auto Context::File::SetText(Context& context, std::optional<int64_t> version,
|
||||
driver_env.vlog_stream =
|
||||
static_cast<llvm::raw_pwrite_stream*>(context.vlog_stream());
|
||||
|
||||
options_ = CompileOptions();
|
||||
options_.codegen_options->target = options_.codegen_options->host;
|
||||
codegen_options_ = CodegenOptions();
|
||||
options_ = CompileOptions(&codegen_options_);
|
||||
codegen_options_.target = codegen_options_.host;
|
||||
options_.phase = CompileOptions::Phase::Check;
|
||||
options_.prelude_import = context.prelude_import();
|
||||
options_.input_filenames.push_back(filename());
|
||||
options_.FixupFlags();
|
||||
|
||||
compile_driver_ = std::make_unique<CompileDriver>(&options_);
|
||||
auto map_input = [](llvm::StringRef) -> std::string { return ""; };
|
||||
@@ -240,7 +242,10 @@ auto Context::File::SetText(Context& context, std::optional<int64_t> version,
|
||||
context.PublishDiagnostics(consumer.params());
|
||||
return;
|
||||
}
|
||||
compile_driver_->Compile(driver_env);
|
||||
if (!compile_driver_->Compile(driver_env).success) {
|
||||
context.PublishDiagnostics(consumer.params());
|
||||
return;
|
||||
}
|
||||
|
||||
// Note we need to publish diagnostics even when empty.
|
||||
// TODO: Consider caching previously published diagnostics and only publishing
|
||||
|
||||
@@ -15,7 +15,9 @@
|
||||
#include "toolchain/diagnostics/consumer.h"
|
||||
#include "toolchain/diagnostics/emitter.h"
|
||||
#include "toolchain/diagnostics/file_diagnostics.h"
|
||||
#include "toolchain/driver/codegen_options.h"
|
||||
#include "toolchain/driver/compile_driver.h"
|
||||
#include "toolchain/driver/compile_options.h"
|
||||
#include "toolchain/lex/tokenized_buffer.h"
|
||||
#include "toolchain/parse/tree_and_subtrees.h"
|
||||
#include "toolchain/sem_ir/file.h"
|
||||
@@ -29,7 +31,9 @@ class Context {
|
||||
class File {
|
||||
public:
|
||||
explicit File(clang::clangd::URIForFile uri)
|
||||
: uri_(std::move(uri)), filename_(uri_.file().str()) {}
|
||||
: uri_(std::move(uri)),
|
||||
filename_(uri_.file().str()),
|
||||
options_(&codegen_options_) {}
|
||||
|
||||
// Changes the file's text, updating dependent state.
|
||||
auto SetText(Context& context, std::optional<int64_t> version,
|
||||
@@ -51,6 +55,8 @@ class Context {
|
||||
|
||||
// Current file content, and derived values.
|
||||
std::string text_;
|
||||
|
||||
CodegenOptions codegen_options_;
|
||||
CompileOptions options_;
|
||||
std::unique_ptr<CompileDriver> compile_driver_;
|
||||
};
|
||||
|
||||
+17
-16
@@ -2,6 +2,7 @@
|
||||
// Exceptions. See /LICENSE for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
// EXTRA-ARGS: --include-carbon-core
|
||||
// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/full.carbon
|
||||
//
|
||||
// AUTOUPDATE
|
||||
@@ -41,16 +42,16 @@ fn Main() {
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: while.cond: ; preds = %if.else, %entry
|
||||
// CHECK:STDOUT: %ReadChar.call = call i32 @getchar(), !dbg !9
|
||||
// CHECK:STDOUT: %Int.as.EqWith.impl.NotEqual.call.loc22 = icmp ne i32 %ReadChar.call, -1, !dbg !9
|
||||
// CHECK:STDOUT: br i1 %Int.as.EqWith.impl.NotEqual.call.loc22, label %while.body, label %while.done, !dbg !8
|
||||
// CHECK:STDOUT: %Int.as.EqWith.impl.NotEqual.call.loc23 = icmp ne i32 %ReadChar.call, -1, !dbg !9
|
||||
// CHECK:STDOUT: br i1 %Int.as.EqWith.impl.NotEqual.call.loc23, label %while.body, label %while.done, !dbg !8
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: while.body: ; preds = %while.cond
|
||||
// CHECK:STDOUT: %PrintChar.call.loc24 = call i32 @putchar(i32 72), !dbg !10
|
||||
// CHECK:STDOUT: %Int.as.EqWith.impl.NotEqual.call.loc24 = icmp ne i32 %PrintChar.call.loc24, -1, !dbg !10
|
||||
// CHECK:STDOUT: br i1 %Int.as.EqWith.impl.NotEqual.call.loc24, label %if.then, label %if.else, !dbg !11
|
||||
// CHECK:STDOUT: %PrintChar.call.loc25 = call i32 @putchar(i32 72), !dbg !10
|
||||
// CHECK:STDOUT: %Int.as.EqWith.impl.NotEqual.call.loc25 = icmp ne i32 %PrintChar.call.loc25, -1, !dbg !10
|
||||
// CHECK:STDOUT: br i1 %Int.as.EqWith.impl.NotEqual.call.loc25, label %if.then, label %if.else, !dbg !11
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: if.then: ; preds = %while.body
|
||||
// CHECK:STDOUT: %PrintChar.call.loc25 = call i32 @putchar(i32 105), !dbg !12
|
||||
// CHECK:STDOUT: %PrintChar.call.loc26 = call i32 @putchar(i32 105), !dbg !12
|
||||
// CHECK:STDOUT: br label %if.else, !dbg !13
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: if.else: ; preds = %if.then, %while.body
|
||||
@@ -78,16 +79,16 @@ fn Main() {
|
||||
// CHECK:STDOUT: !1 = !DIFile(filename: "print_read.carbon", directory: "")
|
||||
// CHECK:STDOUT: !2 = !{i32 7, !"Dwarf Version", i32 5}
|
||||
// CHECK:STDOUT: !3 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
// CHECK:STDOUT: !4 = distinct !DISubprogram(name: "Main", linkageName: "_CMain.Main", scope: null, file: !1, line: 18, type: !5, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !4 = distinct !DISubprogram(name: "Main", linkageName: "_CMain.Main", scope: null, file: !1, line: 19, type: !5, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !5 = !DISubroutineType(types: !6)
|
||||
// CHECK:STDOUT: !6 = !{null}
|
||||
// CHECK:STDOUT: !7 = !DILocation(line: 19, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !8 = !DILocation(line: 22, column: 9, scope: !4)
|
||||
// CHECK:STDOUT: !9 = !DILocation(line: 22, column: 10, scope: !4)
|
||||
// CHECK:STDOUT: !10 = !DILocation(line: 24, column: 9, scope: !4)
|
||||
// CHECK:STDOUT: !11 = !DILocation(line: 24, column: 8, scope: !4)
|
||||
// CHECK:STDOUT: !12 = !DILocation(line: 25, column: 7, scope: !4)
|
||||
// CHECK:STDOUT: !13 = !DILocation(line: 24, column: 5, scope: !4)
|
||||
// CHECK:STDOUT: !14 = !DILocation(line: 22, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !15 = !DILocation(line: 18, column: 1, scope: !4)
|
||||
// CHECK:STDOUT: !7 = !DILocation(line: 20, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !8 = !DILocation(line: 23, column: 9, scope: !4)
|
||||
// CHECK:STDOUT: !9 = !DILocation(line: 23, column: 10, scope: !4)
|
||||
// CHECK:STDOUT: !10 = !DILocation(line: 25, column: 9, scope: !4)
|
||||
// CHECK:STDOUT: !11 = !DILocation(line: 25, column: 8, scope: !4)
|
||||
// CHECK:STDOUT: !12 = !DILocation(line: 26, column: 7, scope: !4)
|
||||
// CHECK:STDOUT: !13 = !DILocation(line: 25, column: 5, scope: !4)
|
||||
// CHECK:STDOUT: !14 = !DILocation(line: 23, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !15 = !DILocation(line: 19, column: 1, scope: !4)
|
||||
// CHECK:STDOUT:
|
||||
|
||||
+65
-64
@@ -2,6 +2,7 @@
|
||||
// Exceptions. See /LICENSE for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
// EXTRA-ARGS: --include-carbon-core
|
||||
// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/full.carbon
|
||||
//
|
||||
// AUTOUPDATE
|
||||
@@ -37,47 +38,47 @@ fn For() {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CFor.Main() #0 !dbg !4 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.loc20_32.1.temp = alloca { i32, i32 }, align 4, !dbg !7
|
||||
// CHECK:STDOUT: %.loc21_32.1.temp = alloca { i32, i32 }, align 4, !dbg !7
|
||||
// CHECK:STDOUT: %var = alloca i32, align 4, !dbg !8
|
||||
// CHECK:STDOUT: %.loc20_33.1.temp = alloca <{ i32, i1 }>, align 4, !dbg !8
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc20_32.1.temp), !dbg !7
|
||||
// CHECK:STDOUT: call void @_CRange.Core(ptr %.loc20_32.1.temp, i32 100), !dbg !7
|
||||
// CHECK:STDOUT: %IntRange.as.Iterate.impl.NewCursor.call = call i32 @"_CNewCursor.IntRange.9452f4c51951679b.Core:Iterate.Core.be1e879c1ad406d8"(ptr %.loc20_32.1.temp), !dbg !8
|
||||
// CHECK:STDOUT: %.loc21_33.1.temp = alloca <{ i32, i1 }>, align 4, !dbg !8
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc21_32.1.temp), !dbg !7
|
||||
// CHECK:STDOUT: call void @_CRange.Core(ptr %.loc21_32.1.temp, i32 100), !dbg !7
|
||||
// CHECK:STDOUT: %IntRange.as.Iterate.impl.NewCursor.call = call i32 @"_CNewCursor.IntRange.9452f4c51951679b.Core:Iterate.Core.be1e879c1ad406d8"(ptr %.loc21_32.1.temp), !dbg !8
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %var), !dbg !8
|
||||
// CHECK:STDOUT: store i32 %IntRange.as.Iterate.impl.NewCursor.call, ptr %var, align 4, !dbg !8
|
||||
// CHECK:STDOUT: br label %for.next, !dbg !8
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: for.next: ; preds = %if.else.loc22, %if.then.loc22, %entry
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc20_33.1.temp), !dbg !8
|
||||
// CHECK:STDOUT: call void @"_CNext.IntRange.9452f4c51951679b.Core:Iterate.Core.be1e879c1ad406d8"(ptr %.loc20_33.1.temp, ptr %.loc20_32.1.temp, ptr %var), !dbg !8
|
||||
// CHECK:STDOUT: %Optional.HasValue.call = call i1 @_CHasValue.Optional.Core.329ac87584bc77f7(ptr %.loc20_33.1.temp), !dbg !8
|
||||
// CHECK:STDOUT: for.next: ; preds = %if.else.loc23, %if.then.loc23, %entry
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc21_33.1.temp), !dbg !8
|
||||
// CHECK:STDOUT: call void @"_CNext.IntRange.9452f4c51951679b.Core:Iterate.Core.be1e879c1ad406d8"(ptr %.loc21_33.1.temp, ptr %.loc21_32.1.temp, ptr %var), !dbg !8
|
||||
// CHECK:STDOUT: %Optional.HasValue.call = call i1 @_CHasValue.Optional.Core.329ac87584bc77f7(ptr %.loc21_33.1.temp), !dbg !8
|
||||
// CHECK:STDOUT: br i1 %Optional.HasValue.call, label %for.body, label %for.done, !dbg !8
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: for.body: ; preds = %for.next
|
||||
// CHECK:STDOUT: %Optional.Get.call = call i32 @_CGet.Optional.Core.329ac87584bc77f7(ptr %.loc20_33.1.temp), !dbg !8
|
||||
// CHECK:STDOUT: %Optional.Get.call = call i32 @_CGet.Optional.Core.329ac87584bc77f7(ptr %.loc21_33.1.temp), !dbg !8
|
||||
// CHECK:STDOUT: %F.call = call i1 @_CF.Main(), !dbg !9
|
||||
// CHECK:STDOUT: br i1 %F.call, label %if.then.loc21, label %if.else.loc21, !dbg !10
|
||||
// CHECK:STDOUT: br i1 %F.call, label %if.then.loc22, label %if.else.loc22, !dbg !10
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: if.then.loc21: ; preds = %for.body
|
||||
// CHECK:STDOUT: if.then.loc22: ; preds = %for.body
|
||||
// CHECK:STDOUT: br label %for.done, !dbg !11
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: if.else.loc21: ; preds = %for.body
|
||||
// CHECK:STDOUT: if.else.loc22: ; preds = %for.body
|
||||
// CHECK:STDOUT: %G.call = call i1 @_CG.Main(), !dbg !12
|
||||
// CHECK:STDOUT: br i1 %G.call, label %if.then.loc22, label %if.else.loc22, !dbg !13
|
||||
// CHECK:STDOUT: br i1 %G.call, label %if.then.loc23, label %if.else.loc23, !dbg !13
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: if.then.loc22: ; preds = %if.else.loc21
|
||||
// CHECK:STDOUT: call void @"_COp.f9d363db90f1ff8b:core.Destroy.Core"(ptr %.loc20_33.1.temp), !dbg !8
|
||||
// CHECK:STDOUT: if.then.loc23: ; preds = %if.else.loc22
|
||||
// CHECK:STDOUT: call void @"_COp.f9d363db90f1ff8b:core.Destroy.Core"(ptr %.loc21_33.1.temp), !dbg !8
|
||||
// CHECK:STDOUT: br label %for.next, !dbg !14
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: if.else.loc22: ; preds = %if.else.loc21
|
||||
// CHECK:STDOUT: if.else.loc23: ; preds = %if.else.loc22
|
||||
// CHECK:STDOUT: call void @_CH.Main(), !dbg !15
|
||||
// CHECK:STDOUT: call void @"_COp.f9d363db90f1ff8b:core.Destroy.Core"(ptr %.loc20_33.1.temp), !dbg !8
|
||||
// CHECK:STDOUT: call void @"_COp.f9d363db90f1ff8b:core.Destroy.Core"(ptr %.loc21_33.1.temp), !dbg !8
|
||||
// CHECK:STDOUT: br label %for.next, !dbg !16
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: for.done: ; preds = %if.then.loc21, %for.next
|
||||
// CHECK:STDOUT: call void @"_COp.f9d363db90f1ff8b:core.Destroy.Core"(ptr %.loc20_33.1.temp), !dbg !8
|
||||
// CHECK:STDOUT: for.done: ; preds = %if.then.loc22, %for.next
|
||||
// CHECK:STDOUT: call void @"_COp.f9d363db90f1ff8b:core.Destroy.Core"(ptr %.loc21_33.1.temp), !dbg !8
|
||||
// CHECK:STDOUT: call void @"_COp.5e27612b9dd31a14:core.Destroy.Core"(ptr %var), !dbg !8
|
||||
// CHECK:STDOUT: call void @"_COp.0d5da2659ce22e5f:core.Destroy.Core"(ptr %.loc20_32.1.temp), !dbg !7
|
||||
// CHECK:STDOUT: call void @"_COp.0d5da2659ce22e5f:core.Destroy.Core"(ptr %.loc21_32.1.temp), !dbg !7
|
||||
// CHECK:STDOUT: ret void, !dbg !17
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
@@ -268,83 +269,83 @@ fn For() {
|
||||
// CHECK:STDOUT: !1 = !DIFile(filename: "break_continue.carbon", directory: "")
|
||||
// CHECK:STDOUT: !2 = !{i32 7, !"Dwarf Version", i32 5}
|
||||
// CHECK:STDOUT: !3 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
// CHECK:STDOUT: !4 = distinct !DISubprogram(name: "For", linkageName: "_CFor.Main", scope: null, file: !1, line: 19, type: !5, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !4 = distinct !DISubprogram(name: "For", linkageName: "_CFor.Main", scope: null, file: !1, line: 20, type: !5, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !5 = !DISubroutineType(types: !6)
|
||||
// CHECK:STDOUT: !6 = !{null}
|
||||
// CHECK:STDOUT: !7 = !DILocation(line: 20, column: 18, scope: !4)
|
||||
// CHECK:STDOUT: !8 = !DILocation(line: 20, column: 7, scope: !4)
|
||||
// CHECK:STDOUT: !9 = !DILocation(line: 21, column: 9, scope: !4)
|
||||
// CHECK:STDOUT: !10 = !DILocation(line: 21, column: 8, scope: !4)
|
||||
// CHECK:STDOUT: !11 = !DILocation(line: 21, column: 16, scope: !4)
|
||||
// CHECK:STDOUT: !12 = !DILocation(line: 22, column: 9, scope: !4)
|
||||
// CHECK:STDOUT: !13 = !DILocation(line: 22, column: 8, scope: !4)
|
||||
// CHECK:STDOUT: !14 = !DILocation(line: 22, column: 16, scope: !4)
|
||||
// CHECK:STDOUT: !15 = !DILocation(line: 23, column: 5, scope: !4)
|
||||
// CHECK:STDOUT: !16 = !DILocation(line: 20, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !17 = !DILocation(line: 19, column: 1, scope: !4)
|
||||
// CHECK:STDOUT: !18 = distinct !DISubprogram(name: "Op", linkageName: "_COp.5e27612b9dd31a14:core.Destroy.Core", scope: null, file: !19, line: 24, type: !20, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !23)
|
||||
// CHECK:STDOUT: !7 = !DILocation(line: 21, column: 18, scope: !4)
|
||||
// CHECK:STDOUT: !8 = !DILocation(line: 21, column: 7, scope: !4)
|
||||
// CHECK:STDOUT: !9 = !DILocation(line: 22, column: 9, scope: !4)
|
||||
// CHECK:STDOUT: !10 = !DILocation(line: 22, column: 8, scope: !4)
|
||||
// CHECK:STDOUT: !11 = !DILocation(line: 22, column: 16, scope: !4)
|
||||
// CHECK:STDOUT: !12 = !DILocation(line: 23, column: 9, scope: !4)
|
||||
// CHECK:STDOUT: !13 = !DILocation(line: 23, column: 8, scope: !4)
|
||||
// CHECK:STDOUT: !14 = !DILocation(line: 23, column: 16, scope: !4)
|
||||
// CHECK:STDOUT: !15 = !DILocation(line: 24, column: 5, scope: !4)
|
||||
// CHECK:STDOUT: !16 = !DILocation(line: 21, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !17 = !DILocation(line: 20, column: 1, scope: !4)
|
||||
// CHECK:STDOUT: !18 = distinct !DISubprogram(name: "Op", linkageName: "_COp.5e27612b9dd31a14:core.Destroy.Core", scope: null, file: !19, line: 15, type: !20, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !23)
|
||||
// CHECK:STDOUT: !19 = !DIFile(filename: "{{.*}}/range.carbon", directory: "")
|
||||
// CHECK:STDOUT: !20 = !DISubroutineType(types: !21)
|
||||
// CHECK:STDOUT: !21 = !{null, !22}
|
||||
// CHECK:STDOUT: !22 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
|
||||
// CHECK:STDOUT: !23 = !{!24}
|
||||
// CHECK:STDOUT: !24 = !DILocalVariable(arg: 1, scope: !18, type: !22)
|
||||
// CHECK:STDOUT: !25 = !DILocation(line: 24, column: 39, scope: !18)
|
||||
// CHECK:STDOUT: !26 = distinct !DISubprogram(name: "Op", linkageName: "_COp.94ba1c30d421702e:core.Destroy.Core", scope: null, file: !1, line: 20, type: !27, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !30)
|
||||
// CHECK:STDOUT: !25 = !DILocation(line: 15, column: 39, scope: !18)
|
||||
// CHECK:STDOUT: !26 = distinct !DISubprogram(name: "Op", linkageName: "_COp.94ba1c30d421702e:core.Destroy.Core", scope: null, file: !1, line: 21, type: !27, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !30)
|
||||
// CHECK:STDOUT: !27 = !DISubroutineType(types: !28)
|
||||
// CHECK:STDOUT: !28 = !{null, !29}
|
||||
// CHECK:STDOUT: !29 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: null, size: 64)
|
||||
// CHECK:STDOUT: !30 = !{!31}
|
||||
// CHECK:STDOUT: !31 = !DILocalVariable(arg: 1, scope: !26, type: !29)
|
||||
// CHECK:STDOUT: !32 = !DILocation(line: 20, column: 7, scope: !26)
|
||||
// CHECK:STDOUT: !33 = distinct !DISubprogram(name: "Op", linkageName: "_COp.0fc9634857315db2:core.Destroy.Core", scope: null, file: !1, line: 20, type: !20, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !34)
|
||||
// CHECK:STDOUT: !32 = !DILocation(line: 21, column: 7, scope: !26)
|
||||
// CHECK:STDOUT: !33 = distinct !DISubprogram(name: "Op", linkageName: "_COp.0fc9634857315db2:core.Destroy.Core", scope: null, file: !1, line: 21, type: !20, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !34)
|
||||
// CHECK:STDOUT: !34 = !{!35}
|
||||
// CHECK:STDOUT: !35 = !DILocalVariable(arg: 1, scope: !33, type: !22)
|
||||
// CHECK:STDOUT: !36 = !DILocation(line: 20, column: 7, scope: !33)
|
||||
// CHECK:STDOUT: !37 = distinct !DISubprogram(name: "Op", linkageName: "_COp.69700c1fc1b2744c:core.Destroy.Core", scope: null, file: !1, line: 20, type: !27, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !38)
|
||||
// CHECK:STDOUT: !36 = !DILocation(line: 21, column: 7, scope: !33)
|
||||
// CHECK:STDOUT: !37 = distinct !DISubprogram(name: "Op", linkageName: "_COp.69700c1fc1b2744c:core.Destroy.Core", scope: null, file: !1, line: 21, type: !27, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !38)
|
||||
// CHECK:STDOUT: !38 = !{!39}
|
||||
// CHECK:STDOUT: !39 = !DILocalVariable(arg: 1, scope: !37, type: !29)
|
||||
// CHECK:STDOUT: !40 = !DILocation(line: 20, column: 7, scope: !37)
|
||||
// CHECK:STDOUT: !41 = distinct !DISubprogram(name: "Op", linkageName: "_COp.278d9a31079e7ff2:core.Destroy.Core", scope: null, file: !1, line: 20, type: !27, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !42)
|
||||
// CHECK:STDOUT: !40 = !DILocation(line: 21, column: 7, scope: !37)
|
||||
// CHECK:STDOUT: !41 = distinct !DISubprogram(name: "Op", linkageName: "_COp.278d9a31079e7ff2:core.Destroy.Core", scope: null, file: !1, line: 21, type: !27, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !42)
|
||||
// CHECK:STDOUT: !42 = !{!43}
|
||||
// CHECK:STDOUT: !43 = !DILocalVariable(arg: 1, scope: !41, type: !29)
|
||||
// CHECK:STDOUT: !44 = !DILocation(line: 20, column: 7, scope: !41)
|
||||
// CHECK:STDOUT: !45 = distinct !DISubprogram(name: "Op", linkageName: "_COp.f9d363db90f1ff8b:core.Destroy.Core", scope: null, file: !1, line: 20, type: !27, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !46)
|
||||
// CHECK:STDOUT: !44 = !DILocation(line: 21, column: 7, scope: !41)
|
||||
// CHECK:STDOUT: !45 = distinct !DISubprogram(name: "Op", linkageName: "_COp.f9d363db90f1ff8b:core.Destroy.Core", scope: null, file: !1, line: 21, type: !27, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !46)
|
||||
// CHECK:STDOUT: !46 = !{!47}
|
||||
// CHECK:STDOUT: !47 = !DILocalVariable(arg: 1, scope: !45, type: !29)
|
||||
// CHECK:STDOUT: !48 = !DILocation(line: 20, column: 7, scope: !45)
|
||||
// CHECK:STDOUT: !49 = distinct !DISubprogram(name: "Op", linkageName: "_COp.db43fa38232c28dd:core.Destroy.Core", scope: null, file: !1, line: 20, type: !27, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !50)
|
||||
// CHECK:STDOUT: !48 = !DILocation(line: 21, column: 7, scope: !45)
|
||||
// CHECK:STDOUT: !49 = distinct !DISubprogram(name: "Op", linkageName: "_COp.db43fa38232c28dd:core.Destroy.Core", scope: null, file: !1, line: 21, type: !27, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !50)
|
||||
// CHECK:STDOUT: !50 = !{!51}
|
||||
// CHECK:STDOUT: !51 = !DILocalVariable(arg: 1, scope: !49, type: !29)
|
||||
// CHECK:STDOUT: !52 = !DILocation(line: 20, column: 18, scope: !49)
|
||||
// CHECK:STDOUT: !53 = distinct !DISubprogram(name: "Op", linkageName: "_COp.0d5da2659ce22e5f:core.Destroy.Core", scope: null, file: !1, line: 20, type: !27, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !54)
|
||||
// CHECK:STDOUT: !52 = !DILocation(line: 21, column: 18, scope: !49)
|
||||
// CHECK:STDOUT: !53 = distinct !DISubprogram(name: "Op", linkageName: "_COp.0d5da2659ce22e5f:core.Destroy.Core", scope: null, file: !1, line: 21, type: !27, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !54)
|
||||
// CHECK:STDOUT: !54 = !{!55}
|
||||
// CHECK:STDOUT: !55 = !DILocalVariable(arg: 1, scope: !53, type: !29)
|
||||
// CHECK:STDOUT: !56 = !DILocation(line: 20, column: 18, scope: !53)
|
||||
// CHECK:STDOUT: !57 = distinct !DISubprogram(name: "NewCursor", linkageName: "_CNewCursor.IntRange.9452f4c51951679b.Core:Iterate.Core.be1e879c1ad406d8", scope: null, file: !19, line: 25, type: !58, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !60)
|
||||
// CHECK:STDOUT: !56 = !DILocation(line: 21, column: 18, scope: !53)
|
||||
// CHECK:STDOUT: !57 = distinct !DISubprogram(name: "NewCursor", linkageName: "_CNewCursor.IntRange.9452f4c51951679b.Core:Iterate.Core.be1e879c1ad406d8", scope: null, file: !19, line: 16, type: !58, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !60)
|
||||
// CHECK:STDOUT: !58 = !DISubroutineType(types: !59)
|
||||
// CHECK:STDOUT: !59 = !{!22, !29}
|
||||
// CHECK:STDOUT: !60 = !{!61}
|
||||
// CHECK:STDOUT: !61 = !DILocalVariable(arg: 1, scope: !57, type: !29)
|
||||
// CHECK:STDOUT: !62 = !DILocation(line: 25, column: 43, scope: !57)
|
||||
// CHECK:STDOUT: !63 = !DILocation(line: 25, column: 36, scope: !57)
|
||||
// CHECK:STDOUT: !64 = distinct !DISubprogram(name: "Next", linkageName: "_CNext.IntRange.9452f4c51951679b.Core:Iterate.Core.be1e879c1ad406d8", scope: null, file: !19, line: 26, type: !65, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !67)
|
||||
// CHECK:STDOUT: !62 = !DILocation(line: 16, column: 43, scope: !57)
|
||||
// CHECK:STDOUT: !63 = !DILocation(line: 16, column: 36, scope: !57)
|
||||
// CHECK:STDOUT: !64 = distinct !DISubprogram(name: "Next", linkageName: "_CNext.IntRange.9452f4c51951679b.Core:Iterate.Core.be1e879c1ad406d8", scope: null, file: !19, line: 17, type: !65, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !67)
|
||||
// CHECK:STDOUT: !65 = !DISubroutineType(types: !66)
|
||||
// CHECK:STDOUT: !66 = !{!29, !29, !29}
|
||||
// CHECK:STDOUT: !67 = !{!68, !69}
|
||||
// CHECK:STDOUT: !68 = !DILocalVariable(arg: 1, scope: !64, type: !29)
|
||||
// CHECK:STDOUT: !69 = !DILocalVariable(arg: 2, scope: !64, type: !29)
|
||||
// CHECK:STDOUT: !70 = !DILocation(line: 27, column: 7, scope: !64)
|
||||
// CHECK:STDOUT: !71 = !DILocation(line: 27, column: 27, scope: !64)
|
||||
// CHECK:STDOUT: !72 = !DILocation(line: 28, column: 19, scope: !64)
|
||||
// CHECK:STDOUT: !73 = !DILocation(line: 28, column: 11, scope: !64)
|
||||
// CHECK:STDOUT: !74 = !DILocation(line: 28, column: 10, scope: !64)
|
||||
// CHECK:STDOUT: !75 = !DILocation(line: 29, column: 9, scope: !64)
|
||||
// CHECK:STDOUT: !76 = !DILocation(line: 30, column: 38, scope: !64)
|
||||
// CHECK:STDOUT: !77 = !DILocation(line: 30, column: 16, scope: !64)
|
||||
// CHECK:STDOUT: !78 = !DILocation(line: 30, column: 9, scope: !64)
|
||||
// CHECK:STDOUT: !79 = !DILocation(line: 32, column: 16, scope: !64)
|
||||
// CHECK:STDOUT: !80 = !DILocation(line: 32, column: 9, scope: !64)
|
||||
// CHECK:STDOUT: !70 = !DILocation(line: 18, column: 7, scope: !64)
|
||||
// CHECK:STDOUT: !71 = !DILocation(line: 18, column: 27, scope: !64)
|
||||
// CHECK:STDOUT: !72 = !DILocation(line: 19, column: 19, scope: !64)
|
||||
// CHECK:STDOUT: !73 = !DILocation(line: 19, column: 11, scope: !64)
|
||||
// CHECK:STDOUT: !74 = !DILocation(line: 19, column: 10, scope: !64)
|
||||
// CHECK:STDOUT: !75 = !DILocation(line: 20, column: 9, scope: !64)
|
||||
// CHECK:STDOUT: !76 = !DILocation(line: 21, column: 38, scope: !64)
|
||||
// CHECK:STDOUT: !77 = !DILocation(line: 21, column: 16, scope: !64)
|
||||
// CHECK:STDOUT: !78 = !DILocation(line: 21, column: 9, scope: !64)
|
||||
// CHECK:STDOUT: !79 = !DILocation(line: 23, column: 16, scope: !64)
|
||||
// CHECK:STDOUT: !80 = !DILocation(line: 23, column: 9, scope: !64)
|
||||
// CHECK:STDOUT: !81 = distinct !DISubprogram(name: "HasValue", linkageName: "_CHasValue.Optional.Core.329ac87584bc77f7", scope: null, file: !82, line: 36, type: !83, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !85)
|
||||
// CHECK:STDOUT: !82 = !DIFile(filename: "{{.*}}/prelude/types/optional.carbon", directory: "")
|
||||
// CHECK:STDOUT: !83 = !DISubroutineType(types: !84)
|
||||
|
||||
+52
-51
@@ -2,6 +2,7 @@
|
||||
// Exceptions. See /LICENSE for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
// EXTRA-ARGS: --include-carbon-core
|
||||
// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/full.carbon
|
||||
//
|
||||
// AUTOUPDATE
|
||||
@@ -37,33 +38,33 @@ fn For() {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CFor.Main() #0 !dbg !4 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.loc21_32.1.temp = alloca { i32, i32 }, align 4, !dbg !7
|
||||
// CHECK:STDOUT: %.loc22_32.1.temp = alloca { i32, i32 }, align 4, !dbg !7
|
||||
// CHECK:STDOUT: %var = alloca i32, align 4, !dbg !8
|
||||
// CHECK:STDOUT: %.loc21_33.1.temp = alloca <{ i32, i1 }>, align 4, !dbg !8
|
||||
// CHECK:STDOUT: %.loc22_33.1.temp = alloca <{ i32, i1 }>, align 4, !dbg !8
|
||||
// CHECK:STDOUT: call void @_CF.Main(), !dbg !9
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc21_32.1.temp), !dbg !7
|
||||
// CHECK:STDOUT: call void @_CRange.Core(ptr %.loc21_32.1.temp, i32 100), !dbg !7
|
||||
// CHECK:STDOUT: %IntRange.as.Iterate.impl.NewCursor.call = call i32 @"_CNewCursor.IntRange.9452f4c51951679b.Core:Iterate.Core.be1e879c1ad406d8"(ptr %.loc21_32.1.temp), !dbg !8
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc22_32.1.temp), !dbg !7
|
||||
// CHECK:STDOUT: call void @_CRange.Core(ptr %.loc22_32.1.temp, i32 100), !dbg !7
|
||||
// CHECK:STDOUT: %IntRange.as.Iterate.impl.NewCursor.call = call i32 @"_CNewCursor.IntRange.9452f4c51951679b.Core:Iterate.Core.be1e879c1ad406d8"(ptr %.loc22_32.1.temp), !dbg !8
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %var), !dbg !8
|
||||
// CHECK:STDOUT: store i32 %IntRange.as.Iterate.impl.NewCursor.call, ptr %var, align 4, !dbg !8
|
||||
// CHECK:STDOUT: br label %for.next, !dbg !8
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: for.next: ; preds = %for.body, %entry
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc21_33.1.temp), !dbg !8
|
||||
// CHECK:STDOUT: call void @"_CNext.IntRange.9452f4c51951679b.Core:Iterate.Core.be1e879c1ad406d8"(ptr %.loc21_33.1.temp, ptr %.loc21_32.1.temp, ptr %var), !dbg !8
|
||||
// CHECK:STDOUT: %Optional.HasValue.call = call i1 @_CHasValue.Optional.Core.329ac87584bc77f7(ptr %.loc21_33.1.temp), !dbg !8
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc22_33.1.temp), !dbg !8
|
||||
// CHECK:STDOUT: call void @"_CNext.IntRange.9452f4c51951679b.Core:Iterate.Core.be1e879c1ad406d8"(ptr %.loc22_33.1.temp, ptr %.loc22_32.1.temp, ptr %var), !dbg !8
|
||||
// CHECK:STDOUT: %Optional.HasValue.call = call i1 @_CHasValue.Optional.Core.329ac87584bc77f7(ptr %.loc22_33.1.temp), !dbg !8
|
||||
// CHECK:STDOUT: br i1 %Optional.HasValue.call, label %for.body, label %for.done, !dbg !8
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: for.body: ; preds = %for.next
|
||||
// CHECK:STDOUT: %Optional.Get.call = call i32 @_CGet.Optional.Core.329ac87584bc77f7(ptr %.loc21_33.1.temp), !dbg !8
|
||||
// CHECK:STDOUT: %Optional.Get.call = call i32 @_CGet.Optional.Core.329ac87584bc77f7(ptr %.loc22_33.1.temp), !dbg !8
|
||||
// CHECK:STDOUT: call void @_CG.Main(), !dbg !10
|
||||
// CHECK:STDOUT: call void @"_COp.f9d363db90f1ff8b:core.Destroy.Core"(ptr %.loc21_33.1.temp), !dbg !8
|
||||
// CHECK:STDOUT: call void @"_COp.f9d363db90f1ff8b:core.Destroy.Core"(ptr %.loc22_33.1.temp), !dbg !8
|
||||
// CHECK:STDOUT: br label %for.next, !dbg !11
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: for.done: ; preds = %for.next
|
||||
// CHECK:STDOUT: call void @"_COp.f9d363db90f1ff8b:core.Destroy.Core"(ptr %.loc21_33.1.temp), !dbg !8
|
||||
// CHECK:STDOUT: call void @"_COp.f9d363db90f1ff8b:core.Destroy.Core"(ptr %.loc22_33.1.temp), !dbg !8
|
||||
// CHECK:STDOUT: call void @"_COp.5e27612b9dd31a14:core.Destroy.Core"(ptr %var), !dbg !8
|
||||
// CHECK:STDOUT: call void @"_COp.0d5da2659ce22e5f:core.Destroy.Core"(ptr %.loc21_32.1.temp), !dbg !7
|
||||
// CHECK:STDOUT: call void @"_COp.0d5da2659ce22e5f:core.Destroy.Core"(ptr %.loc22_32.1.temp), !dbg !7
|
||||
// CHECK:STDOUT: call void @_CH.Main(), !dbg !12
|
||||
// CHECK:STDOUT: ret void, !dbg !13
|
||||
// CHECK:STDOUT: }
|
||||
@@ -255,79 +256,79 @@ fn For() {
|
||||
// CHECK:STDOUT: !1 = !DIFile(filename: "for.carbon", directory: "")
|
||||
// CHECK:STDOUT: !2 = !{i32 7, !"Dwarf Version", i32 5}
|
||||
// CHECK:STDOUT: !3 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
// CHECK:STDOUT: !4 = distinct !DISubprogram(name: "For", linkageName: "_CFor.Main", scope: null, file: !1, line: 19, type: !5, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !4 = distinct !DISubprogram(name: "For", linkageName: "_CFor.Main", scope: null, file: !1, line: 20, type: !5, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !5 = !DISubroutineType(types: !6)
|
||||
// CHECK:STDOUT: !6 = !{null}
|
||||
// CHECK:STDOUT: !7 = !DILocation(line: 21, column: 18, scope: !4)
|
||||
// CHECK:STDOUT: !8 = !DILocation(line: 21, column: 7, scope: !4)
|
||||
// CHECK:STDOUT: !9 = !DILocation(line: 20, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !10 = !DILocation(line: 22, column: 5, scope: !4)
|
||||
// CHECK:STDOUT: !11 = !DILocation(line: 21, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !12 = !DILocation(line: 24, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !13 = !DILocation(line: 19, column: 1, scope: !4)
|
||||
// CHECK:STDOUT: !14 = distinct !DISubprogram(name: "Op", linkageName: "_COp.5e27612b9dd31a14:core.Destroy.Core", scope: null, file: !15, line: 24, type: !16, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !19)
|
||||
// CHECK:STDOUT: !7 = !DILocation(line: 22, column: 18, scope: !4)
|
||||
// CHECK:STDOUT: !8 = !DILocation(line: 22, column: 7, scope: !4)
|
||||
// CHECK:STDOUT: !9 = !DILocation(line: 21, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !10 = !DILocation(line: 23, column: 5, scope: !4)
|
||||
// CHECK:STDOUT: !11 = !DILocation(line: 22, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !12 = !DILocation(line: 25, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !13 = !DILocation(line: 20, column: 1, scope: !4)
|
||||
// CHECK:STDOUT: !14 = distinct !DISubprogram(name: "Op", linkageName: "_COp.5e27612b9dd31a14:core.Destroy.Core", scope: null, file: !15, line: 15, type: !16, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !19)
|
||||
// CHECK:STDOUT: !15 = !DIFile(filename: "{{.*}}/range.carbon", directory: "")
|
||||
// CHECK:STDOUT: !16 = !DISubroutineType(types: !17)
|
||||
// CHECK:STDOUT: !17 = !{null, !18}
|
||||
// CHECK:STDOUT: !18 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
|
||||
// CHECK:STDOUT: !19 = !{!20}
|
||||
// CHECK:STDOUT: !20 = !DILocalVariable(arg: 1, scope: !14, type: !18)
|
||||
// CHECK:STDOUT: !21 = !DILocation(line: 24, column: 39, scope: !14)
|
||||
// CHECK:STDOUT: !22 = distinct !DISubprogram(name: "Op", linkageName: "_COp.94ba1c30d421702e:core.Destroy.Core", scope: null, file: !1, line: 21, type: !23, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !26)
|
||||
// CHECK:STDOUT: !21 = !DILocation(line: 15, column: 39, scope: !14)
|
||||
// CHECK:STDOUT: !22 = distinct !DISubprogram(name: "Op", linkageName: "_COp.94ba1c30d421702e:core.Destroy.Core", scope: null, file: !1, line: 22, type: !23, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !26)
|
||||
// CHECK:STDOUT: !23 = !DISubroutineType(types: !24)
|
||||
// CHECK:STDOUT: !24 = !{null, !25}
|
||||
// CHECK:STDOUT: !25 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: null, size: 64)
|
||||
// CHECK:STDOUT: !26 = !{!27}
|
||||
// CHECK:STDOUT: !27 = !DILocalVariable(arg: 1, scope: !22, type: !25)
|
||||
// CHECK:STDOUT: !28 = !DILocation(line: 21, column: 7, scope: !22)
|
||||
// CHECK:STDOUT: !29 = distinct !DISubprogram(name: "Op", linkageName: "_COp.0fc9634857315db2:core.Destroy.Core", scope: null, file: !1, line: 21, type: !16, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !30)
|
||||
// CHECK:STDOUT: !28 = !DILocation(line: 22, column: 7, scope: !22)
|
||||
// CHECK:STDOUT: !29 = distinct !DISubprogram(name: "Op", linkageName: "_COp.0fc9634857315db2:core.Destroy.Core", scope: null, file: !1, line: 22, type: !16, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !30)
|
||||
// CHECK:STDOUT: !30 = !{!31}
|
||||
// CHECK:STDOUT: !31 = !DILocalVariable(arg: 1, scope: !29, type: !18)
|
||||
// CHECK:STDOUT: !32 = !DILocation(line: 21, column: 7, scope: !29)
|
||||
// CHECK:STDOUT: !33 = distinct !DISubprogram(name: "Op", linkageName: "_COp.69700c1fc1b2744c:core.Destroy.Core", scope: null, file: !1, line: 21, type: !23, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !34)
|
||||
// CHECK:STDOUT: !32 = !DILocation(line: 22, column: 7, scope: !29)
|
||||
// CHECK:STDOUT: !33 = distinct !DISubprogram(name: "Op", linkageName: "_COp.69700c1fc1b2744c:core.Destroy.Core", scope: null, file: !1, line: 22, type: !23, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !34)
|
||||
// CHECK:STDOUT: !34 = !{!35}
|
||||
// CHECK:STDOUT: !35 = !DILocalVariable(arg: 1, scope: !33, type: !25)
|
||||
// CHECK:STDOUT: !36 = !DILocation(line: 21, column: 7, scope: !33)
|
||||
// CHECK:STDOUT: !37 = distinct !DISubprogram(name: "Op", linkageName: "_COp.278d9a31079e7ff2:core.Destroy.Core", scope: null, file: !1, line: 21, type: !23, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !38)
|
||||
// CHECK:STDOUT: !36 = !DILocation(line: 22, column: 7, scope: !33)
|
||||
// CHECK:STDOUT: !37 = distinct !DISubprogram(name: "Op", linkageName: "_COp.278d9a31079e7ff2:core.Destroy.Core", scope: null, file: !1, line: 22, type: !23, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !38)
|
||||
// CHECK:STDOUT: !38 = !{!39}
|
||||
// CHECK:STDOUT: !39 = !DILocalVariable(arg: 1, scope: !37, type: !25)
|
||||
// CHECK:STDOUT: !40 = !DILocation(line: 21, column: 7, scope: !37)
|
||||
// CHECK:STDOUT: !41 = distinct !DISubprogram(name: "Op", linkageName: "_COp.f9d363db90f1ff8b:core.Destroy.Core", scope: null, file: !1, line: 21, type: !23, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !42)
|
||||
// CHECK:STDOUT: !40 = !DILocation(line: 22, column: 7, scope: !37)
|
||||
// CHECK:STDOUT: !41 = distinct !DISubprogram(name: "Op", linkageName: "_COp.f9d363db90f1ff8b:core.Destroy.Core", scope: null, file: !1, line: 22, type: !23, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !42)
|
||||
// CHECK:STDOUT: !42 = !{!43}
|
||||
// CHECK:STDOUT: !43 = !DILocalVariable(arg: 1, scope: !41, type: !25)
|
||||
// CHECK:STDOUT: !44 = !DILocation(line: 21, column: 7, scope: !41)
|
||||
// CHECK:STDOUT: !45 = distinct !DISubprogram(name: "Op", linkageName: "_COp.db43fa38232c28dd:core.Destroy.Core", scope: null, file: !1, line: 21, type: !23, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !46)
|
||||
// CHECK:STDOUT: !44 = !DILocation(line: 22, column: 7, scope: !41)
|
||||
// CHECK:STDOUT: !45 = distinct !DISubprogram(name: "Op", linkageName: "_COp.db43fa38232c28dd:core.Destroy.Core", scope: null, file: !1, line: 22, type: !23, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !46)
|
||||
// CHECK:STDOUT: !46 = !{!47}
|
||||
// CHECK:STDOUT: !47 = !DILocalVariable(arg: 1, scope: !45, type: !25)
|
||||
// CHECK:STDOUT: !48 = !DILocation(line: 21, column: 18, scope: !45)
|
||||
// CHECK:STDOUT: !49 = distinct !DISubprogram(name: "Op", linkageName: "_COp.0d5da2659ce22e5f:core.Destroy.Core", scope: null, file: !1, line: 21, type: !23, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !50)
|
||||
// CHECK:STDOUT: !48 = !DILocation(line: 22, column: 18, scope: !45)
|
||||
// CHECK:STDOUT: !49 = distinct !DISubprogram(name: "Op", linkageName: "_COp.0d5da2659ce22e5f:core.Destroy.Core", scope: null, file: !1, line: 22, type: !23, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !50)
|
||||
// CHECK:STDOUT: !50 = !{!51}
|
||||
// CHECK:STDOUT: !51 = !DILocalVariable(arg: 1, scope: !49, type: !25)
|
||||
// CHECK:STDOUT: !52 = !DILocation(line: 21, column: 18, scope: !49)
|
||||
// CHECK:STDOUT: !53 = distinct !DISubprogram(name: "NewCursor", linkageName: "_CNewCursor.IntRange.9452f4c51951679b.Core:Iterate.Core.be1e879c1ad406d8", scope: null, file: !15, line: 25, type: !54, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !56)
|
||||
// CHECK:STDOUT: !52 = !DILocation(line: 22, column: 18, scope: !49)
|
||||
// CHECK:STDOUT: !53 = distinct !DISubprogram(name: "NewCursor", linkageName: "_CNewCursor.IntRange.9452f4c51951679b.Core:Iterate.Core.be1e879c1ad406d8", scope: null, file: !15, line: 16, type: !54, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !56)
|
||||
// CHECK:STDOUT: !54 = !DISubroutineType(types: !55)
|
||||
// CHECK:STDOUT: !55 = !{!18, !25}
|
||||
// CHECK:STDOUT: !56 = !{!57}
|
||||
// CHECK:STDOUT: !57 = !DILocalVariable(arg: 1, scope: !53, type: !25)
|
||||
// CHECK:STDOUT: !58 = !DILocation(line: 25, column: 43, scope: !53)
|
||||
// CHECK:STDOUT: !59 = !DILocation(line: 25, column: 36, scope: !53)
|
||||
// CHECK:STDOUT: !60 = distinct !DISubprogram(name: "Next", linkageName: "_CNext.IntRange.9452f4c51951679b.Core:Iterate.Core.be1e879c1ad406d8", scope: null, file: !15, line: 26, type: !61, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !63)
|
||||
// CHECK:STDOUT: !58 = !DILocation(line: 16, column: 43, scope: !53)
|
||||
// CHECK:STDOUT: !59 = !DILocation(line: 16, column: 36, scope: !53)
|
||||
// CHECK:STDOUT: !60 = distinct !DISubprogram(name: "Next", linkageName: "_CNext.IntRange.9452f4c51951679b.Core:Iterate.Core.be1e879c1ad406d8", scope: null, file: !15, line: 17, type: !61, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !63)
|
||||
// CHECK:STDOUT: !61 = !DISubroutineType(types: !62)
|
||||
// CHECK:STDOUT: !62 = !{!25, !25, !25}
|
||||
// CHECK:STDOUT: !63 = !{!64, !65}
|
||||
// CHECK:STDOUT: !64 = !DILocalVariable(arg: 1, scope: !60, type: !25)
|
||||
// CHECK:STDOUT: !65 = !DILocalVariable(arg: 2, scope: !60, type: !25)
|
||||
// CHECK:STDOUT: !66 = !DILocation(line: 27, column: 7, scope: !60)
|
||||
// CHECK:STDOUT: !67 = !DILocation(line: 27, column: 27, scope: !60)
|
||||
// CHECK:STDOUT: !68 = !DILocation(line: 28, column: 19, scope: !60)
|
||||
// CHECK:STDOUT: !69 = !DILocation(line: 28, column: 11, scope: !60)
|
||||
// CHECK:STDOUT: !70 = !DILocation(line: 28, column: 10, scope: !60)
|
||||
// CHECK:STDOUT: !71 = !DILocation(line: 29, column: 9, scope: !60)
|
||||
// CHECK:STDOUT: !72 = !DILocation(line: 30, column: 38, scope: !60)
|
||||
// CHECK:STDOUT: !73 = !DILocation(line: 30, column: 16, scope: !60)
|
||||
// CHECK:STDOUT: !74 = !DILocation(line: 30, column: 9, scope: !60)
|
||||
// CHECK:STDOUT: !75 = !DILocation(line: 32, column: 16, scope: !60)
|
||||
// CHECK:STDOUT: !76 = !DILocation(line: 32, column: 9, scope: !60)
|
||||
// CHECK:STDOUT: !66 = !DILocation(line: 18, column: 7, scope: !60)
|
||||
// CHECK:STDOUT: !67 = !DILocation(line: 18, column: 27, scope: !60)
|
||||
// CHECK:STDOUT: !68 = !DILocation(line: 19, column: 19, scope: !60)
|
||||
// CHECK:STDOUT: !69 = !DILocation(line: 19, column: 11, scope: !60)
|
||||
// CHECK:STDOUT: !70 = !DILocation(line: 19, column: 10, scope: !60)
|
||||
// CHECK:STDOUT: !71 = !DILocation(line: 20, column: 9, scope: !60)
|
||||
// CHECK:STDOUT: !72 = !DILocation(line: 21, column: 38, scope: !60)
|
||||
// CHECK:STDOUT: !73 = !DILocation(line: 21, column: 16, scope: !60)
|
||||
// CHECK:STDOUT: !74 = !DILocation(line: 21, column: 9, scope: !60)
|
||||
// CHECK:STDOUT: !75 = !DILocation(line: 23, column: 16, scope: !60)
|
||||
// CHECK:STDOUT: !76 = !DILocation(line: 23, column: 9, scope: !60)
|
||||
// CHECK:STDOUT: !77 = distinct !DISubprogram(name: "HasValue", linkageName: "_CHasValue.Optional.Core.329ac87584bc77f7", scope: null, file: !78, line: 36, type: !79, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !81)
|
||||
// CHECK:STDOUT: !78 = !DIFile(filename: "{{.*}}/prelude/types/optional.carbon", directory: "")
|
||||
// CHECK:STDOUT: !79 = !DISubroutineType(types: !80)
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
// Exceptions. See /LICENSE for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
// EXTRA-ARGS: --include-carbon-core
|
||||
// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/full.carbon
|
||||
//
|
||||
// AUTOUPDATE
|
||||
@@ -89,25 +90,25 @@ fn Run() {
|
||||
// CHECK:STDOUT: !1 = !DIFile(filename: "call_different_impls.carbon", directory: "")
|
||||
// CHECK:STDOUT: !2 = !{i32 7, !"Dwarf Version", i32 5}
|
||||
// CHECK:STDOUT: !3 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
// CHECK:STDOUT: !4 = distinct !DISubprogram(name: "F", linkageName: "_CF.X.Main:I.Main", scope: null, file: !1, line: 20, type: !5, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !4 = distinct !DISubprogram(name: "F", linkageName: "_CF.X.Main:I.Main", scope: null, file: !1, line: 21, type: !5, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !5 = !DISubroutineType(types: !6)
|
||||
// CHECK:STDOUT: !6 = !{null}
|
||||
// CHECK:STDOUT: !7 = !DILocation(line: 20, column: 12, scope: !4)
|
||||
// CHECK:STDOUT: !8 = !DILocation(line: 20, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !9 = distinct !DISubprogram(name: "F", linkageName: "_CF.Y.Main:I.Main", scope: null, file: !1, line: 24, type: !5, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !10 = !DILocation(line: 24, column: 12, scope: !9)
|
||||
// CHECK:STDOUT: !11 = !DILocation(line: 24, column: 3, scope: !9)
|
||||
// CHECK:STDOUT: !12 = distinct !DISubprogram(name: "Run", linkageName: "main", scope: null, file: !1, line: 31, type: !13, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !7 = !DILocation(line: 21, column: 12, scope: !4)
|
||||
// CHECK:STDOUT: !8 = !DILocation(line: 21, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !9 = distinct !DISubprogram(name: "F", linkageName: "_CF.Y.Main:I.Main", scope: null, file: !1, line: 25, type: !5, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !10 = !DILocation(line: 25, column: 12, scope: !9)
|
||||
// CHECK:STDOUT: !11 = !DILocation(line: 25, column: 3, scope: !9)
|
||||
// CHECK:STDOUT: !12 = distinct !DISubprogram(name: "Run", linkageName: "main", scope: null, file: !1, line: 32, type: !13, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !13 = !DISubroutineType(types: !14)
|
||||
// CHECK:STDOUT: !14 = !{!15}
|
||||
// CHECK:STDOUT: !15 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
|
||||
// CHECK:STDOUT: !16 = !DILocation(line: 32, column: 3, scope: !12)
|
||||
// CHECK:STDOUT: !17 = !DILocation(line: 33, column: 3, scope: !12)
|
||||
// CHECK:STDOUT: !18 = !DILocation(line: 31, column: 1, scope: !12)
|
||||
// CHECK:STDOUT: !19 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.c81631f865470482", scope: null, file: !1, line: 29, type: !5, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !20 = !DILocation(line: 29, column: 22, scope: !19)
|
||||
// CHECK:STDOUT: !21 = !DILocation(line: 29, column: 1, scope: !19)
|
||||
// CHECK:STDOUT: !22 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.0b241ec84a68877b", scope: null, file: !1, line: 29, type: !5, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !23 = !DILocation(line: 29, column: 22, scope: !22)
|
||||
// CHECK:STDOUT: !24 = !DILocation(line: 29, column: 1, scope: !22)
|
||||
// CHECK:STDOUT: !16 = !DILocation(line: 33, column: 3, scope: !12)
|
||||
// CHECK:STDOUT: !17 = !DILocation(line: 34, column: 3, scope: !12)
|
||||
// CHECK:STDOUT: !18 = !DILocation(line: 32, column: 1, scope: !12)
|
||||
// CHECK:STDOUT: !19 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.c81631f865470482", scope: null, file: !1, line: 30, type: !5, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !20 = !DILocation(line: 30, column: 22, scope: !19)
|
||||
// CHECK:STDOUT: !21 = !DILocation(line: 30, column: 1, scope: !19)
|
||||
// CHECK:STDOUT: !22 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.0b241ec84a68877b", scope: null, file: !1, line: 30, type: !5, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !23 = !DILocation(line: 30, column: 22, scope: !22)
|
||||
// CHECK:STDOUT: !24 = !DILocation(line: 30, column: 1, scope: !22)
|
||||
// CHECK:STDOUT:
|
||||
|
||||
+30
-29
@@ -2,6 +2,7 @@
|
||||
// Exceptions. See /LICENSE for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
// EXTRA-ARGS: --include-carbon-core
|
||||
// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/full.carbon
|
||||
//
|
||||
// AUTOUPDATE
|
||||
@@ -81,25 +82,25 @@ fn Run() {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define linkonce_odr void @_CG.Main.e2c7a58ecf9ad23e() #0 !dbg !26 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.loc37_20.1.temp = alloca i1, align 1, !dbg !29
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc37_20.1.temp), !dbg !29
|
||||
// CHECK:STDOUT: %.loc38_20.1.temp = alloca i1, align 1, !dbg !29
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc38_20.1.temp), !dbg !29
|
||||
// CHECK:STDOUT: %I.WithSelf.F.call = call i1 @"_CF.X.Main:I.Main"(), !dbg !29
|
||||
// CHECK:STDOUT: %.loc37_20.2 = zext i1 %I.WithSelf.F.call to i8, !dbg !29
|
||||
// CHECK:STDOUT: store i8 %.loc37_20.2, ptr %.loc37_20.1.temp, align 1, !dbg !29
|
||||
// CHECK:STDOUT: %.loc37_20.3 = load i8, ptr %.loc37_20.1.temp, align 1, !dbg !29
|
||||
// CHECK:STDOUT: %.loc37_20.31 = trunc i8 %.loc37_20.3 to i1, !dbg !29
|
||||
// CHECK:STDOUT: %.loc38_20.2 = zext i1 %I.WithSelf.F.call to i8, !dbg !29
|
||||
// CHECK:STDOUT: store i8 %.loc38_20.2, ptr %.loc38_20.1.temp, align 1, !dbg !29
|
||||
// CHECK:STDOUT: %.loc38_20.3 = load i8, ptr %.loc38_20.1.temp, align 1, !dbg !29
|
||||
// CHECK:STDOUT: %.loc38_20.31 = trunc i8 %.loc38_20.3 to i1, !dbg !29
|
||||
// CHECK:STDOUT: ret void, !dbg !30
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define linkonce_odr void @_CG.Main.01a101e5421592ac() #0 !dbg !31 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.loc37_20.1.temp = alloca i32, align 4, !dbg !32
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc37_20.1.temp), !dbg !32
|
||||
// CHECK:STDOUT: %.loc38_20.1.temp = alloca i32, align 4, !dbg !32
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc38_20.1.temp), !dbg !32
|
||||
// CHECK:STDOUT: %I.WithSelf.F.call = call i32 @"_CF.Y.Main:I.Main"(), !dbg !32
|
||||
// CHECK:STDOUT: store i32 %I.WithSelf.F.call, ptr %.loc37_20.1.temp, align 4, !dbg !32
|
||||
// CHECK:STDOUT: %.loc37_20.3 = load i32, ptr %.loc37_20.1.temp, align 4, !dbg !32
|
||||
// CHECK:STDOUT: call void @"_COp.5e27612b9dd31a14:core.Destroy.Core"(ptr %.loc37_20.1.temp), !dbg !32
|
||||
// CHECK:STDOUT: store i32 %I.WithSelf.F.call, ptr %.loc38_20.1.temp, align 4, !dbg !32
|
||||
// CHECK:STDOUT: %.loc38_20.3 = load i32, ptr %.loc38_20.1.temp, align 4, !dbg !32
|
||||
// CHECK:STDOUT: call void @"_COp.5e27612b9dd31a14:core.Destroy.Core"(ptr %.loc38_20.1.temp), !dbg !32
|
||||
// CHECK:STDOUT: ret void, !dbg !33
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
@@ -120,34 +121,34 @@ fn Run() {
|
||||
// CHECK:STDOUT: !1 = !DIFile(filename: "call_different_impls_with_const.carbon", directory: "")
|
||||
// CHECK:STDOUT: !2 = !{i32 7, !"Dwarf Version", i32 5}
|
||||
// CHECK:STDOUT: !3 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
// CHECK:STDOUT: !4 = distinct !DISubprogram(name: "F", linkageName: "_CF.X.Main:I.Main", scope: null, file: !1, line: 21, type: !5, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !4 = distinct !DISubprogram(name: "F", linkageName: "_CF.X.Main:I.Main", scope: null, file: !1, line: 22, type: !5, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !5 = !DISubroutineType(types: !6)
|
||||
// CHECK:STDOUT: !6 = !{!7}
|
||||
// CHECK:STDOUT: !7 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: null, size: 64)
|
||||
// CHECK:STDOUT: !8 = !DILocation(line: 22, column: 5, scope: !4)
|
||||
// CHECK:STDOUT: !9 = !DILocation(line: 23, column: 5, scope: !4)
|
||||
// CHECK:STDOUT: !10 = distinct !DISubprogram(name: "Op", linkageName: "_COp.5e27612b9dd31a14:core.Destroy.Core", scope: null, file: !1, line: 27, type: !11, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !14)
|
||||
// CHECK:STDOUT: !8 = !DILocation(line: 23, column: 5, scope: !4)
|
||||
// CHECK:STDOUT: !9 = !DILocation(line: 24, column: 5, scope: !4)
|
||||
// CHECK:STDOUT: !10 = distinct !DISubprogram(name: "Op", linkageName: "_COp.5e27612b9dd31a14:core.Destroy.Core", scope: null, file: !1, line: 28, type: !11, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !14)
|
||||
// CHECK:STDOUT: !11 = !DISubroutineType(types: !12)
|
||||
// CHECK:STDOUT: !12 = !{null, !13}
|
||||
// CHECK:STDOUT: !13 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
|
||||
// CHECK:STDOUT: !14 = !{!15}
|
||||
// CHECK:STDOUT: !15 = !DILocalVariable(arg: 1, scope: !10, type: !13)
|
||||
// CHECK:STDOUT: !16 = !DILocation(line: 27, column: 24, scope: !10)
|
||||
// CHECK:STDOUT: !17 = distinct !DISubprogram(name: "F", linkageName: "_CF.Y.Main:I.Main", scope: null, file: !1, line: 28, type: !18, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !16 = !DILocation(line: 28, column: 24, scope: !10)
|
||||
// CHECK:STDOUT: !17 = distinct !DISubprogram(name: "F", linkageName: "_CF.Y.Main:I.Main", scope: null, file: !1, line: 29, type: !18, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !18 = !DISubroutineType(types: !19)
|
||||
// CHECK:STDOUT: !19 = !{!13}
|
||||
// CHECK:STDOUT: !20 = !DILocation(line: 29, column: 5, scope: !17)
|
||||
// CHECK:STDOUT: !21 = !DILocation(line: 30, column: 5, scope: !17)
|
||||
// CHECK:STDOUT: !22 = distinct !DISubprogram(name: "Run", linkageName: "main", scope: null, file: !1, line: 40, type: !18, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !23 = !DILocation(line: 41, column: 3, scope: !22)
|
||||
// CHECK:STDOUT: !24 = !DILocation(line: 42, column: 3, scope: !22)
|
||||
// CHECK:STDOUT: !25 = !DILocation(line: 40, column: 1, scope: !22)
|
||||
// CHECK:STDOUT: !26 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.e2c7a58ecf9ad23e", scope: null, file: !1, line: 36, type: !27, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !20 = !DILocation(line: 30, column: 5, scope: !17)
|
||||
// CHECK:STDOUT: !21 = !DILocation(line: 31, column: 5, scope: !17)
|
||||
// CHECK:STDOUT: !22 = distinct !DISubprogram(name: "Run", linkageName: "main", scope: null, file: !1, line: 41, type: !18, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !23 = !DILocation(line: 42, column: 3, scope: !22)
|
||||
// CHECK:STDOUT: !24 = !DILocation(line: 43, column: 3, scope: !22)
|
||||
// CHECK:STDOUT: !25 = !DILocation(line: 41, column: 1, scope: !22)
|
||||
// CHECK:STDOUT: !26 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.e2c7a58ecf9ad23e", scope: null, file: !1, line: 37, type: !27, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !27 = !DISubroutineType(types: !28)
|
||||
// CHECK:STDOUT: !28 = !{null}
|
||||
// CHECK:STDOUT: !29 = !DILocation(line: 37, column: 16, scope: !26)
|
||||
// CHECK:STDOUT: !30 = !DILocation(line: 36, column: 1, scope: !26)
|
||||
// CHECK:STDOUT: !31 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.01a101e5421592ac", scope: null, file: !1, line: 36, type: !27, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !32 = !DILocation(line: 37, column: 16, scope: !31)
|
||||
// CHECK:STDOUT: !33 = !DILocation(line: 36, column: 1, scope: !31)
|
||||
// CHECK:STDOUT: !29 = !DILocation(line: 38, column: 16, scope: !26)
|
||||
// CHECK:STDOUT: !30 = !DILocation(line: 37, column: 1, scope: !26)
|
||||
// CHECK:STDOUT: !31 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.01a101e5421592ac", scope: null, file: !1, line: 37, type: !27, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !32 = !DILocation(line: 38, column: 16, scope: !31)
|
||||
// CHECK:STDOUT: !33 = !DILocation(line: 37, column: 1, scope: !31)
|
||||
// CHECK:STDOUT:
|
||||
|
||||
+111
-110
@@ -2,6 +2,7 @@
|
||||
// Exceptions. See /LICENSE for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
// EXTRA-ARGS: --include-carbon-core
|
||||
// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/full.carbon
|
||||
//
|
||||
// AUTOUPDATE
|
||||
@@ -77,14 +78,14 @@ fn M() {
|
||||
// CHECK:STDOUT: store ptr %n.var, ptr %ptr_i32.var, align 8, !dbg !9
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %ptr_f64.var), !dbg !10
|
||||
// CHECK:STDOUT: store ptr %m.var, ptr %ptr_f64.var, align 8, !dbg !10
|
||||
// CHECK:STDOUT: %.loc53_5 = load i32, ptr %n.var, align 4, !dbg !11
|
||||
// CHECK:STDOUT: %A.call.loc53 = call i32 @_CA.Main.5bd8d5767580997a(i32 %.loc53_5, i32 0), !dbg !12
|
||||
// CHECK:STDOUT: %.loc54_5 = load double, ptr %m.var, align 8, !dbg !13
|
||||
// CHECK:STDOUT: %A.call.loc54 = call double @_CA.Main.c27b765f2159c9a0(double %.loc54_5, i32 0), !dbg !14
|
||||
// CHECK:STDOUT: %.loc55_5 = load ptr, ptr %ptr_i32.var, align 8, !dbg !15
|
||||
// CHECK:STDOUT: %A.call.loc55 = call ptr @_CA.Main.2621742a01881e29(ptr %.loc55_5, i32 0), !dbg !16
|
||||
// CHECK:STDOUT: %.loc56_5 = load ptr, ptr %ptr_f64.var, align 8, !dbg !17
|
||||
// CHECK:STDOUT: %A.call.loc56 = call ptr @_CA.Main.2621742a01881e29(ptr %.loc56_5, i32 0), !dbg !18
|
||||
// CHECK:STDOUT: %.loc54_5 = load i32, ptr %n.var, align 4, !dbg !11
|
||||
// CHECK:STDOUT: %A.call.loc54 = call i32 @_CA.Main.5bd8d5767580997a(i32 %.loc54_5, i32 0), !dbg !12
|
||||
// CHECK:STDOUT: %.loc55_5 = load double, ptr %m.var, align 8, !dbg !13
|
||||
// CHECK:STDOUT: %A.call.loc55 = call double @_CA.Main.c27b765f2159c9a0(double %.loc55_5, i32 0), !dbg !14
|
||||
// CHECK:STDOUT: %.loc56_5 = load ptr, ptr %ptr_i32.var, align 8, !dbg !15
|
||||
// CHECK:STDOUT: %A.call.loc56 = call ptr @_CA.Main.2621742a01881e29(ptr %.loc56_5, i32 0), !dbg !16
|
||||
// CHECK:STDOUT: %.loc57_5 = load ptr, ptr %ptr_f64.var, align 8, !dbg !17
|
||||
// CHECK:STDOUT: %A.call.loc57 = call ptr @_CA.Main.2621742a01881e29(ptr %.loc57_5, i32 0), !dbg !18
|
||||
// CHECK:STDOUT: call void @"_COp.30d8007fdcc57f83:core.Destroy.Core"(ptr %m.var), !dbg !8
|
||||
// CHECK:STDOUT: call void @"_COp.5e27612b9dd31a14:core.Destroy.Core"(ptr %n.var), !dbg !7
|
||||
// CHECK:STDOUT: ret void, !dbg !19
|
||||
@@ -109,21 +110,21 @@ fn M() {
|
||||
// CHECK:STDOUT: define linkonce_odr i32 @_CA.Main.5bd8d5767580997a(i32 %x, i32 %count) #0 !dbg !34 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %Int.as.OrderedWith.impl.Greater.call = icmp sgt i32 %count, 4, !dbg !40
|
||||
// CHECK:STDOUT: br i1 %Int.as.OrderedWith.impl.Greater.call, label %if.then.loc22, label %if.else.loc22, !dbg !41
|
||||
// CHECK:STDOUT: br i1 %Int.as.OrderedWith.impl.Greater.call, label %if.then.loc23, label %if.else.loc23, !dbg !41
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: if.then.loc22: ; preds = %entry
|
||||
// CHECK:STDOUT: if.then.loc23: ; preds = %entry
|
||||
// CHECK:STDOUT: ret i32 %x, !dbg !42
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: if.else.loc22: ; preds = %entry
|
||||
// CHECK:STDOUT: if.else.loc23: ; preds = %entry
|
||||
// CHECK:STDOUT: %Int.as.ModWith.impl.Op.call = srem i32 %count, 2, !dbg !43
|
||||
// CHECK:STDOUT: %Int.as.EqWith.impl.Equal.call = icmp eq i32 %Int.as.ModWith.impl.Op.call, 0, !dbg !43
|
||||
// CHECK:STDOUT: br i1 %Int.as.EqWith.impl.Equal.call, label %if.then.loc25, label %if.else.loc25, !dbg !44
|
||||
// CHECK:STDOUT: br i1 %Int.as.EqWith.impl.Equal.call, label %if.then.loc26, label %if.else.loc26, !dbg !44
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: if.then.loc25: ; preds = %if.else.loc22
|
||||
// CHECK:STDOUT: if.then.loc26: ; preds = %if.else.loc23
|
||||
// CHECK:STDOUT: %B.call = call i32 @_CB.Main.5bd8d5767580997a(i32 %x, i32 %count), !dbg !45
|
||||
// CHECK:STDOUT: ret i32 %B.call, !dbg !46
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: if.else.loc25: ; preds = %if.else.loc22
|
||||
// CHECK:STDOUT: if.else.loc26: ; preds = %if.else.loc23
|
||||
// CHECK:STDOUT: %C.call = call i32 @_CC.Main.5bd8d5767580997a(i32 %x, i32 %count), !dbg !47
|
||||
// CHECK:STDOUT: ret i32 %C.call, !dbg !48
|
||||
// CHECK:STDOUT: }
|
||||
@@ -132,21 +133,21 @@ fn M() {
|
||||
// CHECK:STDOUT: define linkonce_odr double @_CA.Main.c27b765f2159c9a0(double %x, i32 %count) #0 !dbg !49 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %Int.as.OrderedWith.impl.Greater.call = icmp sgt i32 %count, 4, !dbg !55
|
||||
// CHECK:STDOUT: br i1 %Int.as.OrderedWith.impl.Greater.call, label %if.then.loc22, label %if.else.loc22, !dbg !56
|
||||
// CHECK:STDOUT: br i1 %Int.as.OrderedWith.impl.Greater.call, label %if.then.loc23, label %if.else.loc23, !dbg !56
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: if.then.loc22: ; preds = %entry
|
||||
// CHECK:STDOUT: if.then.loc23: ; preds = %entry
|
||||
// CHECK:STDOUT: ret double %x, !dbg !57
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: if.else.loc22: ; preds = %entry
|
||||
// CHECK:STDOUT: if.else.loc23: ; preds = %entry
|
||||
// CHECK:STDOUT: %Int.as.ModWith.impl.Op.call = srem i32 %count, 2, !dbg !58
|
||||
// CHECK:STDOUT: %Int.as.EqWith.impl.Equal.call = icmp eq i32 %Int.as.ModWith.impl.Op.call, 0, !dbg !58
|
||||
// CHECK:STDOUT: br i1 %Int.as.EqWith.impl.Equal.call, label %if.then.loc25, label %if.else.loc25, !dbg !59
|
||||
// CHECK:STDOUT: br i1 %Int.as.EqWith.impl.Equal.call, label %if.then.loc26, label %if.else.loc26, !dbg !59
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: if.then.loc25: ; preds = %if.else.loc22
|
||||
// CHECK:STDOUT: if.then.loc26: ; preds = %if.else.loc23
|
||||
// CHECK:STDOUT: %B.call = call double @_CB.Main.c27b765f2159c9a0(double %x, i32 %count), !dbg !60
|
||||
// CHECK:STDOUT: ret double %B.call, !dbg !61
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: if.else.loc25: ; preds = %if.else.loc22
|
||||
// CHECK:STDOUT: if.else.loc26: ; preds = %if.else.loc23
|
||||
// CHECK:STDOUT: %C.call = call double @_CC.Main.c27b765f2159c9a0(double %x, i32 %count), !dbg !62
|
||||
// CHECK:STDOUT: ret double %C.call, !dbg !63
|
||||
// CHECK:STDOUT: }
|
||||
@@ -155,21 +156,21 @@ fn M() {
|
||||
// CHECK:STDOUT: define linkonce_odr ptr @_CA.Main.2621742a01881e29(ptr %x, i32 %count) #0 !dbg !64 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %Int.as.OrderedWith.impl.Greater.call = icmp sgt i32 %count, 4, !dbg !68
|
||||
// CHECK:STDOUT: br i1 %Int.as.OrderedWith.impl.Greater.call, label %if.then.loc22, label %if.else.loc22, !dbg !69
|
||||
// CHECK:STDOUT: br i1 %Int.as.OrderedWith.impl.Greater.call, label %if.then.loc23, label %if.else.loc23, !dbg !69
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: if.then.loc22: ; preds = %entry
|
||||
// CHECK:STDOUT: if.then.loc23: ; preds = %entry
|
||||
// CHECK:STDOUT: ret ptr %x, !dbg !70
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: if.else.loc22: ; preds = %entry
|
||||
// CHECK:STDOUT: if.else.loc23: ; preds = %entry
|
||||
// CHECK:STDOUT: %Int.as.ModWith.impl.Op.call = srem i32 %count, 2, !dbg !71
|
||||
// CHECK:STDOUT: %Int.as.EqWith.impl.Equal.call = icmp eq i32 %Int.as.ModWith.impl.Op.call, 0, !dbg !71
|
||||
// CHECK:STDOUT: br i1 %Int.as.EqWith.impl.Equal.call, label %if.then.loc25, label %if.else.loc25, !dbg !72
|
||||
// CHECK:STDOUT: br i1 %Int.as.EqWith.impl.Equal.call, label %if.then.loc26, label %if.else.loc26, !dbg !72
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: if.then.loc25: ; preds = %if.else.loc22
|
||||
// CHECK:STDOUT: if.then.loc26: ; preds = %if.else.loc23
|
||||
// CHECK:STDOUT: %B.call = call ptr @_CB.Main.2621742a01881e29(ptr %x, i32 %count), !dbg !73
|
||||
// CHECK:STDOUT: ret ptr %B.call, !dbg !74
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: if.else.loc25: ; preds = %if.else.loc22
|
||||
// CHECK:STDOUT: if.else.loc26: ; preds = %if.else.loc23
|
||||
// CHECK:STDOUT: %C.call = call ptr @_CC.Main.2621742a01881e29(ptr %x, i32 %count), !dbg !75
|
||||
// CHECK:STDOUT: ret ptr %C.call, !dbg !76
|
||||
// CHECK:STDOUT: }
|
||||
@@ -266,140 +267,140 @@ fn M() {
|
||||
// CHECK:STDOUT: !1 = !DIFile(filename: "call_recursive_diamond.carbon", directory: "")
|
||||
// CHECK:STDOUT: !2 = !{i32 7, !"Dwarf Version", i32 5}
|
||||
// CHECK:STDOUT: !3 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
// CHECK:STDOUT: !4 = distinct !DISubprogram(name: "M", linkageName: "_CM.Main", scope: null, file: !1, line: 47, type: !5, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !4 = distinct !DISubprogram(name: "M", linkageName: "_CM.Main", scope: null, file: !1, line: 48, type: !5, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !5 = !DISubroutineType(types: !6)
|
||||
// CHECK:STDOUT: !6 = !{null}
|
||||
// CHECK:STDOUT: !7 = !DILocation(line: 48, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !8 = !DILocation(line: 49, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !9 = !DILocation(line: 50, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !10 = !DILocation(line: 51, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !11 = !DILocation(line: 53, column: 5, scope: !4)
|
||||
// CHECK:STDOUT: !12 = !DILocation(line: 53, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !13 = !DILocation(line: 54, column: 5, scope: !4)
|
||||
// CHECK:STDOUT: !14 = !DILocation(line: 54, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !15 = !DILocation(line: 55, column: 5, scope: !4)
|
||||
// CHECK:STDOUT: !16 = !DILocation(line: 55, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !17 = !DILocation(line: 56, column: 5, scope: !4)
|
||||
// CHECK:STDOUT: !18 = !DILocation(line: 56, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !19 = !DILocation(line: 47, column: 1, scope: !4)
|
||||
// CHECK:STDOUT: !20 = distinct !DISubprogram(name: "Op", linkageName: "_COp.30d8007fdcc57f83:core.Destroy.Core", scope: null, file: !1, line: 49, type: !21, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !24)
|
||||
// CHECK:STDOUT: !7 = !DILocation(line: 49, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !8 = !DILocation(line: 50, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !9 = !DILocation(line: 51, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !10 = !DILocation(line: 52, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !11 = !DILocation(line: 54, column: 5, scope: !4)
|
||||
// CHECK:STDOUT: !12 = !DILocation(line: 54, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !13 = !DILocation(line: 55, column: 5, scope: !4)
|
||||
// CHECK:STDOUT: !14 = !DILocation(line: 55, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !15 = !DILocation(line: 56, column: 5, scope: !4)
|
||||
// CHECK:STDOUT: !16 = !DILocation(line: 56, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !17 = !DILocation(line: 57, column: 5, scope: !4)
|
||||
// CHECK:STDOUT: !18 = !DILocation(line: 57, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !19 = !DILocation(line: 48, column: 1, scope: !4)
|
||||
// CHECK:STDOUT: !20 = distinct !DISubprogram(name: "Op", linkageName: "_COp.30d8007fdcc57f83:core.Destroy.Core", scope: null, file: !1, line: 50, type: !21, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !24)
|
||||
// CHECK:STDOUT: !21 = !DISubroutineType(types: !22)
|
||||
// CHECK:STDOUT: !22 = !{null, !23}
|
||||
// CHECK:STDOUT: !23 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: null, size: 64)
|
||||
// CHECK:STDOUT: !24 = !{!25}
|
||||
// CHECK:STDOUT: !25 = !DILocalVariable(arg: 1, scope: !20, type: !23)
|
||||
// CHECK:STDOUT: !26 = !DILocation(line: 49, column: 3, scope: !20)
|
||||
// CHECK:STDOUT: !27 = distinct !DISubprogram(name: "Op", linkageName: "_COp.5e27612b9dd31a14:core.Destroy.Core", scope: null, file: !1, line: 48, type: !28, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !31)
|
||||
// CHECK:STDOUT: !26 = !DILocation(line: 50, column: 3, scope: !20)
|
||||
// CHECK:STDOUT: !27 = distinct !DISubprogram(name: "Op", linkageName: "_COp.5e27612b9dd31a14:core.Destroy.Core", scope: null, file: !1, line: 49, type: !28, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !31)
|
||||
// CHECK:STDOUT: !28 = !DISubroutineType(types: !29)
|
||||
// CHECK:STDOUT: !29 = !{null, !30}
|
||||
// CHECK:STDOUT: !30 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
|
||||
// CHECK:STDOUT: !31 = !{!32}
|
||||
// CHECK:STDOUT: !32 = !DILocalVariable(arg: 1, scope: !27, type: !30)
|
||||
// CHECK:STDOUT: !33 = !DILocation(line: 48, column: 3, scope: !27)
|
||||
// CHECK:STDOUT: !34 = distinct !DISubprogram(name: "A", linkageName: "_CA.Main.5bd8d5767580997a", scope: null, file: !1, line: 21, type: !35, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !37)
|
||||
// CHECK:STDOUT: !33 = !DILocation(line: 49, column: 3, scope: !27)
|
||||
// CHECK:STDOUT: !34 = distinct !DISubprogram(name: "A", linkageName: "_CA.Main.5bd8d5767580997a", scope: null, file: !1, line: 22, type: !35, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !37)
|
||||
// CHECK:STDOUT: !35 = !DISubroutineType(types: !36)
|
||||
// CHECK:STDOUT: !36 = !{!30, !30, !30}
|
||||
// CHECK:STDOUT: !37 = !{!38, !39}
|
||||
// CHECK:STDOUT: !38 = !DILocalVariable(arg: 1, scope: !34, type: !30)
|
||||
// CHECK:STDOUT: !39 = !DILocalVariable(arg: 2, scope: !34, type: !30)
|
||||
// CHECK:STDOUT: !40 = !DILocation(line: 22, column: 7, scope: !34)
|
||||
// CHECK:STDOUT: !41 = !DILocation(line: 22, column: 6, scope: !34)
|
||||
// CHECK:STDOUT: !42 = !DILocation(line: 23, column: 5, scope: !34)
|
||||
// CHECK:STDOUT: !43 = !DILocation(line: 25, column: 7, scope: !34)
|
||||
// CHECK:STDOUT: !44 = !DILocation(line: 25, column: 6, scope: !34)
|
||||
// CHECK:STDOUT: !45 = !DILocation(line: 26, column: 12, scope: !34)
|
||||
// CHECK:STDOUT: !46 = !DILocation(line: 26, column: 5, scope: !34)
|
||||
// CHECK:STDOUT: !47 = !DILocation(line: 28, column: 12, scope: !34)
|
||||
// CHECK:STDOUT: !48 = !DILocation(line: 28, column: 5, scope: !34)
|
||||
// CHECK:STDOUT: !49 = distinct !DISubprogram(name: "A", linkageName: "_CA.Main.c27b765f2159c9a0", scope: null, file: !1, line: 21, type: !50, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !52)
|
||||
// CHECK:STDOUT: !40 = !DILocation(line: 23, column: 7, scope: !34)
|
||||
// CHECK:STDOUT: !41 = !DILocation(line: 23, column: 6, scope: !34)
|
||||
// CHECK:STDOUT: !42 = !DILocation(line: 24, column: 5, scope: !34)
|
||||
// CHECK:STDOUT: !43 = !DILocation(line: 26, column: 7, scope: !34)
|
||||
// CHECK:STDOUT: !44 = !DILocation(line: 26, column: 6, scope: !34)
|
||||
// CHECK:STDOUT: !45 = !DILocation(line: 27, column: 12, scope: !34)
|
||||
// CHECK:STDOUT: !46 = !DILocation(line: 27, column: 5, scope: !34)
|
||||
// CHECK:STDOUT: !47 = !DILocation(line: 29, column: 12, scope: !34)
|
||||
// CHECK:STDOUT: !48 = !DILocation(line: 29, column: 5, scope: !34)
|
||||
// CHECK:STDOUT: !49 = distinct !DISubprogram(name: "A", linkageName: "_CA.Main.c27b765f2159c9a0", scope: null, file: !1, line: 22, type: !50, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !52)
|
||||
// CHECK:STDOUT: !50 = !DISubroutineType(types: !51)
|
||||
// CHECK:STDOUT: !51 = !{!23, !23, !30}
|
||||
// CHECK:STDOUT: !52 = !{!53, !54}
|
||||
// CHECK:STDOUT: !53 = !DILocalVariable(arg: 1, scope: !49, type: !23)
|
||||
// CHECK:STDOUT: !54 = !DILocalVariable(arg: 2, scope: !49, type: !30)
|
||||
// CHECK:STDOUT: !55 = !DILocation(line: 22, column: 7, scope: !49)
|
||||
// CHECK:STDOUT: !56 = !DILocation(line: 22, column: 6, scope: !49)
|
||||
// CHECK:STDOUT: !57 = !DILocation(line: 23, column: 5, scope: !49)
|
||||
// CHECK:STDOUT: !58 = !DILocation(line: 25, column: 7, scope: !49)
|
||||
// CHECK:STDOUT: !59 = !DILocation(line: 25, column: 6, scope: !49)
|
||||
// CHECK:STDOUT: !60 = !DILocation(line: 26, column: 12, scope: !49)
|
||||
// CHECK:STDOUT: !61 = !DILocation(line: 26, column: 5, scope: !49)
|
||||
// CHECK:STDOUT: !62 = !DILocation(line: 28, column: 12, scope: !49)
|
||||
// CHECK:STDOUT: !63 = !DILocation(line: 28, column: 5, scope: !49)
|
||||
// CHECK:STDOUT: !64 = distinct !DISubprogram(name: "A", linkageName: "_CA.Main.2621742a01881e29", scope: null, file: !1, line: 21, type: !50, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !65)
|
||||
// CHECK:STDOUT: !55 = !DILocation(line: 23, column: 7, scope: !49)
|
||||
// CHECK:STDOUT: !56 = !DILocation(line: 23, column: 6, scope: !49)
|
||||
// CHECK:STDOUT: !57 = !DILocation(line: 24, column: 5, scope: !49)
|
||||
// CHECK:STDOUT: !58 = !DILocation(line: 26, column: 7, scope: !49)
|
||||
// CHECK:STDOUT: !59 = !DILocation(line: 26, column: 6, scope: !49)
|
||||
// CHECK:STDOUT: !60 = !DILocation(line: 27, column: 12, scope: !49)
|
||||
// CHECK:STDOUT: !61 = !DILocation(line: 27, column: 5, scope: !49)
|
||||
// CHECK:STDOUT: !62 = !DILocation(line: 29, column: 12, scope: !49)
|
||||
// CHECK:STDOUT: !63 = !DILocation(line: 29, column: 5, scope: !49)
|
||||
// CHECK:STDOUT: !64 = distinct !DISubprogram(name: "A", linkageName: "_CA.Main.2621742a01881e29", scope: null, file: !1, line: 22, type: !50, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !65)
|
||||
// CHECK:STDOUT: !65 = !{!66, !67}
|
||||
// CHECK:STDOUT: !66 = !DILocalVariable(arg: 1, scope: !64, type: !23)
|
||||
// CHECK:STDOUT: !67 = !DILocalVariable(arg: 2, scope: !64, type: !30)
|
||||
// CHECK:STDOUT: !68 = !DILocation(line: 22, column: 7, scope: !64)
|
||||
// CHECK:STDOUT: !69 = !DILocation(line: 22, column: 6, scope: !64)
|
||||
// CHECK:STDOUT: !70 = !DILocation(line: 23, column: 5, scope: !64)
|
||||
// CHECK:STDOUT: !71 = !DILocation(line: 25, column: 7, scope: !64)
|
||||
// CHECK:STDOUT: !72 = !DILocation(line: 25, column: 6, scope: !64)
|
||||
// CHECK:STDOUT: !73 = !DILocation(line: 26, column: 12, scope: !64)
|
||||
// CHECK:STDOUT: !74 = !DILocation(line: 26, column: 5, scope: !64)
|
||||
// CHECK:STDOUT: !75 = !DILocation(line: 28, column: 12, scope: !64)
|
||||
// CHECK:STDOUT: !76 = !DILocation(line: 28, column: 5, scope: !64)
|
||||
// CHECK:STDOUT: !77 = distinct !DISubprogram(name: "B", linkageName: "_CB.Main.5bd8d5767580997a", scope: null, file: !1, line: 33, type: !35, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !78)
|
||||
// CHECK:STDOUT: !68 = !DILocation(line: 23, column: 7, scope: !64)
|
||||
// CHECK:STDOUT: !69 = !DILocation(line: 23, column: 6, scope: !64)
|
||||
// CHECK:STDOUT: !70 = !DILocation(line: 24, column: 5, scope: !64)
|
||||
// CHECK:STDOUT: !71 = !DILocation(line: 26, column: 7, scope: !64)
|
||||
// CHECK:STDOUT: !72 = !DILocation(line: 26, column: 6, scope: !64)
|
||||
// CHECK:STDOUT: !73 = !DILocation(line: 27, column: 12, scope: !64)
|
||||
// CHECK:STDOUT: !74 = !DILocation(line: 27, column: 5, scope: !64)
|
||||
// CHECK:STDOUT: !75 = !DILocation(line: 29, column: 12, scope: !64)
|
||||
// CHECK:STDOUT: !76 = !DILocation(line: 29, column: 5, scope: !64)
|
||||
// CHECK:STDOUT: !77 = distinct !DISubprogram(name: "B", linkageName: "_CB.Main.5bd8d5767580997a", scope: null, file: !1, line: 34, type: !35, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !78)
|
||||
// CHECK:STDOUT: !78 = !{!79, !80}
|
||||
// CHECK:STDOUT: !79 = !DILocalVariable(arg: 1, scope: !77, type: !30)
|
||||
// CHECK:STDOUT: !80 = !DILocalVariable(arg: 2, scope: !77, type: !30)
|
||||
// CHECK:STDOUT: !81 = !DILocation(line: 34, column: 3, scope: !77)
|
||||
// CHECK:STDOUT: !82 = !DILocation(line: 35, column: 10, scope: !77)
|
||||
// CHECK:STDOUT: !83 = !DILocation(line: 35, column: 3, scope: !77)
|
||||
// CHECK:STDOUT: !84 = distinct !DISubprogram(name: "C", linkageName: "_CC.Main.5bd8d5767580997a", scope: null, file: !1, line: 38, type: !35, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !85)
|
||||
// CHECK:STDOUT: !81 = !DILocation(line: 35, column: 3, scope: !77)
|
||||
// CHECK:STDOUT: !82 = !DILocation(line: 36, column: 10, scope: !77)
|
||||
// CHECK:STDOUT: !83 = !DILocation(line: 36, column: 3, scope: !77)
|
||||
// CHECK:STDOUT: !84 = distinct !DISubprogram(name: "C", linkageName: "_CC.Main.5bd8d5767580997a", scope: null, file: !1, line: 39, type: !35, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !85)
|
||||
// CHECK:STDOUT: !85 = !{!86, !87}
|
||||
// CHECK:STDOUT: !86 = !DILocalVariable(arg: 1, scope: !84, type: !30)
|
||||
// CHECK:STDOUT: !87 = !DILocalVariable(arg: 2, scope: !84, type: !30)
|
||||
// CHECK:STDOUT: !88 = !DILocation(line: 39, column: 3, scope: !84)
|
||||
// CHECK:STDOUT: !89 = !DILocation(line: 40, column: 10, scope: !84)
|
||||
// CHECK:STDOUT: !90 = !DILocation(line: 40, column: 3, scope: !84)
|
||||
// CHECK:STDOUT: !91 = distinct !DISubprogram(name: "B", linkageName: "_CB.Main.c27b765f2159c9a0", scope: null, file: !1, line: 33, type: !50, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !92)
|
||||
// CHECK:STDOUT: !88 = !DILocation(line: 40, column: 3, scope: !84)
|
||||
// CHECK:STDOUT: !89 = !DILocation(line: 41, column: 10, scope: !84)
|
||||
// CHECK:STDOUT: !90 = !DILocation(line: 41, column: 3, scope: !84)
|
||||
// CHECK:STDOUT: !91 = distinct !DISubprogram(name: "B", linkageName: "_CB.Main.c27b765f2159c9a0", scope: null, file: !1, line: 34, type: !50, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !92)
|
||||
// CHECK:STDOUT: !92 = !{!93, !94}
|
||||
// CHECK:STDOUT: !93 = !DILocalVariable(arg: 1, scope: !91, type: !23)
|
||||
// CHECK:STDOUT: !94 = !DILocalVariable(arg: 2, scope: !91, type: !30)
|
||||
// CHECK:STDOUT: !95 = !DILocation(line: 34, column: 3, scope: !91)
|
||||
// CHECK:STDOUT: !96 = !DILocation(line: 35, column: 10, scope: !91)
|
||||
// CHECK:STDOUT: !97 = !DILocation(line: 35, column: 3, scope: !91)
|
||||
// CHECK:STDOUT: !98 = distinct !DISubprogram(name: "C", linkageName: "_CC.Main.c27b765f2159c9a0", scope: null, file: !1, line: 38, type: !50, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !99)
|
||||
// CHECK:STDOUT: !95 = !DILocation(line: 35, column: 3, scope: !91)
|
||||
// CHECK:STDOUT: !96 = !DILocation(line: 36, column: 10, scope: !91)
|
||||
// CHECK:STDOUT: !97 = !DILocation(line: 36, column: 3, scope: !91)
|
||||
// CHECK:STDOUT: !98 = distinct !DISubprogram(name: "C", linkageName: "_CC.Main.c27b765f2159c9a0", scope: null, file: !1, line: 39, type: !50, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !99)
|
||||
// CHECK:STDOUT: !99 = !{!100, !101}
|
||||
// CHECK:STDOUT: !100 = !DILocalVariable(arg: 1, scope: !98, type: !23)
|
||||
// CHECK:STDOUT: !101 = !DILocalVariable(arg: 2, scope: !98, type: !30)
|
||||
// CHECK:STDOUT: !102 = !DILocation(line: 39, column: 3, scope: !98)
|
||||
// CHECK:STDOUT: !103 = !DILocation(line: 40, column: 10, scope: !98)
|
||||
// CHECK:STDOUT: !104 = !DILocation(line: 40, column: 3, scope: !98)
|
||||
// CHECK:STDOUT: !105 = distinct !DISubprogram(name: "B", linkageName: "_CB.Main.2621742a01881e29", scope: null, file: !1, line: 33, type: !50, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !106)
|
||||
// CHECK:STDOUT: !102 = !DILocation(line: 40, column: 3, scope: !98)
|
||||
// CHECK:STDOUT: !103 = !DILocation(line: 41, column: 10, scope: !98)
|
||||
// CHECK:STDOUT: !104 = !DILocation(line: 41, column: 3, scope: !98)
|
||||
// CHECK:STDOUT: !105 = distinct !DISubprogram(name: "B", linkageName: "_CB.Main.2621742a01881e29", scope: null, file: !1, line: 34, type: !50, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !106)
|
||||
// CHECK:STDOUT: !106 = !{!107, !108}
|
||||
// CHECK:STDOUT: !107 = !DILocalVariable(arg: 1, scope: !105, type: !23)
|
||||
// CHECK:STDOUT: !108 = !DILocalVariable(arg: 2, scope: !105, type: !30)
|
||||
// CHECK:STDOUT: !109 = !DILocation(line: 34, column: 3, scope: !105)
|
||||
// CHECK:STDOUT: !110 = !DILocation(line: 35, column: 10, scope: !105)
|
||||
// CHECK:STDOUT: !111 = !DILocation(line: 35, column: 3, scope: !105)
|
||||
// CHECK:STDOUT: !112 = distinct !DISubprogram(name: "C", linkageName: "_CC.Main.2621742a01881e29", scope: null, file: !1, line: 38, type: !50, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !113)
|
||||
// CHECK:STDOUT: !109 = !DILocation(line: 35, column: 3, scope: !105)
|
||||
// CHECK:STDOUT: !110 = !DILocation(line: 36, column: 10, scope: !105)
|
||||
// CHECK:STDOUT: !111 = !DILocation(line: 36, column: 3, scope: !105)
|
||||
// CHECK:STDOUT: !112 = distinct !DISubprogram(name: "C", linkageName: "_CC.Main.2621742a01881e29", scope: null, file: !1, line: 39, type: !50, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !113)
|
||||
// CHECK:STDOUT: !113 = !{!114, !115}
|
||||
// CHECK:STDOUT: !114 = !DILocalVariable(arg: 1, scope: !112, type: !23)
|
||||
// CHECK:STDOUT: !115 = !DILocalVariable(arg: 2, scope: !112, type: !30)
|
||||
// CHECK:STDOUT: !116 = !DILocation(line: 39, column: 3, scope: !112)
|
||||
// CHECK:STDOUT: !117 = !DILocation(line: 40, column: 10, scope: !112)
|
||||
// CHECK:STDOUT: !118 = !DILocation(line: 40, column: 3, scope: !112)
|
||||
// CHECK:STDOUT: !119 = distinct !DISubprogram(name: "D", linkageName: "_CD.Main.5bd8d5767580997a", scope: null, file: !1, line: 43, type: !35, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !120)
|
||||
// CHECK:STDOUT: !116 = !DILocation(line: 40, column: 3, scope: !112)
|
||||
// CHECK:STDOUT: !117 = !DILocation(line: 41, column: 10, scope: !112)
|
||||
// CHECK:STDOUT: !118 = !DILocation(line: 41, column: 3, scope: !112)
|
||||
// CHECK:STDOUT: !119 = distinct !DISubprogram(name: "D", linkageName: "_CD.Main.5bd8d5767580997a", scope: null, file: !1, line: 44, type: !35, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !120)
|
||||
// CHECK:STDOUT: !120 = !{!121, !122}
|
||||
// CHECK:STDOUT: !121 = !DILocalVariable(arg: 1, scope: !119, type: !30)
|
||||
// CHECK:STDOUT: !122 = !DILocalVariable(arg: 2, scope: !119, type: !30)
|
||||
// CHECK:STDOUT: !123 = !DILocation(line: 44, column: 15, scope: !119)
|
||||
// CHECK:STDOUT: !124 = !DILocation(line: 44, column: 10, scope: !119)
|
||||
// CHECK:STDOUT: !125 = !DILocation(line: 44, column: 3, scope: !119)
|
||||
// CHECK:STDOUT: !126 = distinct !DISubprogram(name: "D", linkageName: "_CD.Main.c27b765f2159c9a0", scope: null, file: !1, line: 43, type: !50, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !127)
|
||||
// CHECK:STDOUT: !123 = !DILocation(line: 45, column: 15, scope: !119)
|
||||
// CHECK:STDOUT: !124 = !DILocation(line: 45, column: 10, scope: !119)
|
||||
// CHECK:STDOUT: !125 = !DILocation(line: 45, column: 3, scope: !119)
|
||||
// CHECK:STDOUT: !126 = distinct !DISubprogram(name: "D", linkageName: "_CD.Main.c27b765f2159c9a0", scope: null, file: !1, line: 44, type: !50, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !127)
|
||||
// CHECK:STDOUT: !127 = !{!128, !129}
|
||||
// CHECK:STDOUT: !128 = !DILocalVariable(arg: 1, scope: !126, type: !23)
|
||||
// CHECK:STDOUT: !129 = !DILocalVariable(arg: 2, scope: !126, type: !30)
|
||||
// CHECK:STDOUT: !130 = !DILocation(line: 44, column: 15, scope: !126)
|
||||
// CHECK:STDOUT: !131 = !DILocation(line: 44, column: 10, scope: !126)
|
||||
// CHECK:STDOUT: !132 = !DILocation(line: 44, column: 3, scope: !126)
|
||||
// CHECK:STDOUT: !133 = distinct !DISubprogram(name: "D", linkageName: "_CD.Main.2621742a01881e29", scope: null, file: !1, line: 43, type: !50, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !134)
|
||||
// CHECK:STDOUT: !130 = !DILocation(line: 45, column: 15, scope: !126)
|
||||
// CHECK:STDOUT: !131 = !DILocation(line: 45, column: 10, scope: !126)
|
||||
// CHECK:STDOUT: !132 = !DILocation(line: 45, column: 3, scope: !126)
|
||||
// CHECK:STDOUT: !133 = distinct !DISubprogram(name: "D", linkageName: "_CD.Main.2621742a01881e29", scope: null, file: !1, line: 44, type: !50, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !134)
|
||||
// CHECK:STDOUT: !134 = !{!135, !136}
|
||||
// CHECK:STDOUT: !135 = !DILocalVariable(arg: 1, scope: !133, type: !23)
|
||||
// CHECK:STDOUT: !136 = !DILocalVariable(arg: 2, scope: !133, type: !30)
|
||||
// CHECK:STDOUT: !137 = !DILocation(line: 44, column: 15, scope: !133)
|
||||
// CHECK:STDOUT: !138 = !DILocation(line: 44, column: 10, scope: !133)
|
||||
// CHECK:STDOUT: !139 = !DILocation(line: 44, column: 3, scope: !133)
|
||||
// CHECK:STDOUT: !137 = !DILocation(line: 45, column: 15, scope: !133)
|
||||
// CHECK:STDOUT: !138 = !DILocation(line: 45, column: 10, scope: !133)
|
||||
// CHECK:STDOUT: !139 = !DILocation(line: 45, column: 3, scope: !133)
|
||||
// CHECK:STDOUT:
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
// Exceptions. See /LICENSE for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
// EXTRA-ARGS: --include-carbon-core
|
||||
// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/full.carbon
|
||||
//
|
||||
// AUTOUPDATE
|
||||
@@ -64,8 +65,8 @@ fn Run() {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define i32 @main() #0 !dbg !12 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %G.call.loc40 = call i32 @_CG.Main.c81631f865470482(i32 0), !dbg !16
|
||||
// CHECK:STDOUT: %G.call.loc41 = call i32 @_CG.Main.0b241ec84a68877b(i32 0), !dbg !17
|
||||
// CHECK:STDOUT: %G.call.loc41 = call i32 @_CG.Main.c81631f865470482(i32 0), !dbg !16
|
||||
// CHECK:STDOUT: %G.call.loc42 = call i32 @_CG.Main.0b241ec84a68877b(i32 0), !dbg !17
|
||||
// CHECK:STDOUT: ret i32 0, !dbg !18
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
@@ -115,41 +116,41 @@ fn Run() {
|
||||
// CHECK:STDOUT: !1 = !DIFile(filename: "call_recursive_impl.carbon", directory: "")
|
||||
// CHECK:STDOUT: !2 = !{i32 7, !"Dwarf Version", i32 5}
|
||||
// CHECK:STDOUT: !3 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
// CHECK:STDOUT: !4 = distinct !DISubprogram(name: "F", linkageName: "_CF.X.Main:I.Main", scope: null, file: !1, line: 20, type: !5, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !4 = distinct !DISubprogram(name: "F", linkageName: "_CF.X.Main:I.Main", scope: null, file: !1, line: 21, type: !5, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !5 = !DISubroutineType(types: !6)
|
||||
// CHECK:STDOUT: !6 = !{null}
|
||||
// CHECK:STDOUT: !7 = !DILocation(line: 20, column: 12, scope: !4)
|
||||
// CHECK:STDOUT: !8 = !DILocation(line: 20, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !9 = distinct !DISubprogram(name: "F", linkageName: "_CF.Y.Main:I.Main", scope: null, file: !1, line: 24, type: !5, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !10 = !DILocation(line: 24, column: 12, scope: !9)
|
||||
// CHECK:STDOUT: !11 = !DILocation(line: 24, column: 3, scope: !9)
|
||||
// CHECK:STDOUT: !12 = distinct !DISubprogram(name: "Run", linkageName: "main", scope: null, file: !1, line: 39, type: !13, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !7 = !DILocation(line: 21, column: 12, scope: !4)
|
||||
// CHECK:STDOUT: !8 = !DILocation(line: 21, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !9 = distinct !DISubprogram(name: "F", linkageName: "_CF.Y.Main:I.Main", scope: null, file: !1, line: 25, type: !5, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !10 = !DILocation(line: 25, column: 12, scope: !9)
|
||||
// CHECK:STDOUT: !11 = !DILocation(line: 25, column: 3, scope: !9)
|
||||
// CHECK:STDOUT: !12 = distinct !DISubprogram(name: "Run", linkageName: "main", scope: null, file: !1, line: 40, type: !13, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !13 = !DISubroutineType(types: !14)
|
||||
// CHECK:STDOUT: !14 = !{!15}
|
||||
// CHECK:STDOUT: !15 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
|
||||
// CHECK:STDOUT: !16 = !DILocation(line: 40, column: 3, scope: !12)
|
||||
// CHECK:STDOUT: !17 = !DILocation(line: 41, column: 3, scope: !12)
|
||||
// CHECK:STDOUT: !18 = !DILocation(line: 39, column: 1, scope: !12)
|
||||
// CHECK:STDOUT: !19 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.c81631f865470482", scope: null, file: !1, line: 30, type: !20, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !22)
|
||||
// CHECK:STDOUT: !16 = !DILocation(line: 41, column: 3, scope: !12)
|
||||
// CHECK:STDOUT: !17 = !DILocation(line: 42, column: 3, scope: !12)
|
||||
// CHECK:STDOUT: !18 = !DILocation(line: 40, column: 1, scope: !12)
|
||||
// CHECK:STDOUT: !19 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.c81631f865470482", scope: null, file: !1, line: 31, type: !20, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !22)
|
||||
// CHECK:STDOUT: !20 = !DISubroutineType(types: !21)
|
||||
// CHECK:STDOUT: !21 = !{!15, !15}
|
||||
// CHECK:STDOUT: !22 = !{!23}
|
||||
// CHECK:STDOUT: !23 = !DILocalVariable(arg: 1, scope: !19, type: !15)
|
||||
// CHECK:STDOUT: !24 = !DILocation(line: 31, column: 3, scope: !19)
|
||||
// CHECK:STDOUT: !25 = !DILocation(line: 33, column: 7, scope: !19)
|
||||
// CHECK:STDOUT: !26 = !DILocation(line: 33, column: 6, scope: !19)
|
||||
// CHECK:STDOUT: !27 = !DILocation(line: 34, column: 5, scope: !19)
|
||||
// CHECK:STDOUT: !28 = !DILocation(line: 36, column: 15, scope: !19)
|
||||
// CHECK:STDOUT: !29 = !DILocation(line: 36, column: 10, scope: !19)
|
||||
// CHECK:STDOUT: !30 = !DILocation(line: 36, column: 3, scope: !19)
|
||||
// CHECK:STDOUT: !31 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.0b241ec84a68877b", scope: null, file: !1, line: 30, type: !20, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !32)
|
||||
// CHECK:STDOUT: !24 = !DILocation(line: 32, column: 3, scope: !19)
|
||||
// CHECK:STDOUT: !25 = !DILocation(line: 34, column: 7, scope: !19)
|
||||
// CHECK:STDOUT: !26 = !DILocation(line: 34, column: 6, scope: !19)
|
||||
// CHECK:STDOUT: !27 = !DILocation(line: 35, column: 5, scope: !19)
|
||||
// CHECK:STDOUT: !28 = !DILocation(line: 37, column: 15, scope: !19)
|
||||
// CHECK:STDOUT: !29 = !DILocation(line: 37, column: 10, scope: !19)
|
||||
// CHECK:STDOUT: !30 = !DILocation(line: 37, column: 3, scope: !19)
|
||||
// CHECK:STDOUT: !31 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.0b241ec84a68877b", scope: null, file: !1, line: 31, type: !20, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !32)
|
||||
// CHECK:STDOUT: !32 = !{!33}
|
||||
// CHECK:STDOUT: !33 = !DILocalVariable(arg: 1, scope: !31, type: !15)
|
||||
// CHECK:STDOUT: !34 = !DILocation(line: 31, column: 3, scope: !31)
|
||||
// CHECK:STDOUT: !35 = !DILocation(line: 33, column: 7, scope: !31)
|
||||
// CHECK:STDOUT: !36 = !DILocation(line: 33, column: 6, scope: !31)
|
||||
// CHECK:STDOUT: !37 = !DILocation(line: 34, column: 5, scope: !31)
|
||||
// CHECK:STDOUT: !38 = !DILocation(line: 36, column: 15, scope: !31)
|
||||
// CHECK:STDOUT: !39 = !DILocation(line: 36, column: 10, scope: !31)
|
||||
// CHECK:STDOUT: !40 = !DILocation(line: 36, column: 3, scope: !31)
|
||||
// CHECK:STDOUT: !34 = !DILocation(line: 32, column: 3, scope: !31)
|
||||
// CHECK:STDOUT: !35 = !DILocation(line: 34, column: 7, scope: !31)
|
||||
// CHECK:STDOUT: !36 = !DILocation(line: 34, column: 6, scope: !31)
|
||||
// CHECK:STDOUT: !37 = !DILocation(line: 35, column: 5, scope: !31)
|
||||
// CHECK:STDOUT: !38 = !DILocation(line: 37, column: 15, scope: !31)
|
||||
// CHECK:STDOUT: !39 = !DILocation(line: 37, column: 10, scope: !31)
|
||||
// CHECK:STDOUT: !40 = !DILocation(line: 37, column: 3, scope: !31)
|
||||
// CHECK:STDOUT:
|
||||
|
||||
+150
-149
@@ -2,6 +2,7 @@
|
||||
// Exceptions. See /LICENSE for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
// EXTRA-ARGS: --include-carbon-core
|
||||
// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/full.carbon
|
||||
//
|
||||
// AUTOUPDATE
|
||||
@@ -103,14 +104,14 @@ fn M() {
|
||||
// CHECK:STDOUT: store ptr %n.var, ptr %ptr_i32.var, align 8, !dbg !9
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %ptr_f64.var), !dbg !10
|
||||
// CHECK:STDOUT: store ptr %m.var, ptr %ptr_f64.var, align 8, !dbg !10
|
||||
// CHECK:STDOUT: %.loc79_5 = load i32, ptr %n.var, align 4, !dbg !11
|
||||
// CHECK:STDOUT: %A.call.loc79 = call i32 @_CA.Main.5bd8d5767580997a(i32 %.loc79_5, i32 0), !dbg !12
|
||||
// CHECK:STDOUT: %.loc80_5 = load double, ptr %m.var, align 8, !dbg !13
|
||||
// CHECK:STDOUT: %A.call.loc80 = call double @_CA.Main.c27b765f2159c9a0(double %.loc80_5, i32 0), !dbg !14
|
||||
// CHECK:STDOUT: %.loc81_5 = load ptr, ptr %ptr_i32.var, align 8, !dbg !15
|
||||
// CHECK:STDOUT: %A.call.loc81 = call ptr @_CA.Main.2621742a01881e29(ptr %.loc81_5, i32 0), !dbg !16
|
||||
// CHECK:STDOUT: %.loc82_5 = load ptr, ptr %ptr_f64.var, align 8, !dbg !17
|
||||
// CHECK:STDOUT: %A.call.loc82 = call ptr @_CA.Main.2621742a01881e29(ptr %.loc82_5, i32 0), !dbg !18
|
||||
// CHECK:STDOUT: %.loc80_5 = load i32, ptr %n.var, align 4, !dbg !11
|
||||
// CHECK:STDOUT: %A.call.loc80 = call i32 @_CA.Main.5bd8d5767580997a(i32 %.loc80_5, i32 0), !dbg !12
|
||||
// CHECK:STDOUT: %.loc81_5 = load double, ptr %m.var, align 8, !dbg !13
|
||||
// CHECK:STDOUT: %A.call.loc81 = call double @_CA.Main.c27b765f2159c9a0(double %.loc81_5, i32 0), !dbg !14
|
||||
// CHECK:STDOUT: %.loc82_5 = load ptr, ptr %ptr_i32.var, align 8, !dbg !15
|
||||
// CHECK:STDOUT: %A.call.loc82 = call ptr @_CA.Main.2621742a01881e29(ptr %.loc82_5, i32 0), !dbg !16
|
||||
// CHECK:STDOUT: %.loc83_5 = load ptr, ptr %ptr_f64.var, align 8, !dbg !17
|
||||
// CHECK:STDOUT: %A.call.loc83 = call ptr @_CA.Main.2621742a01881e29(ptr %.loc83_5, i32 0), !dbg !18
|
||||
// CHECK:STDOUT: call void @"_COp.30d8007fdcc57f83:core.Destroy.Core"(ptr %m.var), !dbg !8
|
||||
// CHECK:STDOUT: call void @"_COp.5e27612b9dd31a14:core.Destroy.Core"(ptr %n.var), !dbg !7
|
||||
// CHECK:STDOUT: ret void, !dbg !19
|
||||
@@ -166,21 +167,21 @@ fn M() {
|
||||
// CHECK:STDOUT: define linkonce_odr i32 @_CD.Main.5bd8d5767580997a(i32 %x, i32 %count) #0 !dbg !67 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %Int.as.OrderedWith.impl.Greater.call = icmp sgt i32 %count, 4, !dbg !71
|
||||
// CHECK:STDOUT: br i1 %Int.as.OrderedWith.impl.Greater.call, label %if.then.loc48, label %if.else.loc48, !dbg !72
|
||||
// CHECK:STDOUT: br i1 %Int.as.OrderedWith.impl.Greater.call, label %if.then.loc49, label %if.else.loc49, !dbg !72
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: if.then.loc48: ; preds = %entry
|
||||
// CHECK:STDOUT: if.then.loc49: ; preds = %entry
|
||||
// CHECK:STDOUT: ret i32 %x, !dbg !73
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: if.else.loc48: ; preds = %entry
|
||||
// CHECK:STDOUT: if.else.loc49: ; preds = %entry
|
||||
// CHECK:STDOUT: %Int.as.ModWith.impl.Op.call = srem i32 %count, 2, !dbg !74
|
||||
// CHECK:STDOUT: %Int.as.EqWith.impl.Equal.call = icmp eq i32 %Int.as.ModWith.impl.Op.call, 0, !dbg !74
|
||||
// CHECK:STDOUT: br i1 %Int.as.EqWith.impl.Equal.call, label %if.then.loc51, label %if.else.loc51, !dbg !75
|
||||
// CHECK:STDOUT: br i1 %Int.as.EqWith.impl.Equal.call, label %if.then.loc52, label %if.else.loc52, !dbg !75
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: if.then.loc51: ; preds = %if.else.loc48
|
||||
// CHECK:STDOUT: if.then.loc52: ; preds = %if.else.loc49
|
||||
// CHECK:STDOUT: %E.call = call i32 @_CE.Main.5bd8d5767580997a(i32 %x, i32 %count), !dbg !76
|
||||
// CHECK:STDOUT: ret i32 %E.call, !dbg !77
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: if.else.loc51: ; preds = %if.else.loc48
|
||||
// CHECK:STDOUT: if.else.loc52: ; preds = %if.else.loc49
|
||||
// CHECK:STDOUT: %F.call = call i32 @_CF.Main.5bd8d5767580997a(i32 %x, i32 %count), !dbg !78
|
||||
// CHECK:STDOUT: ret i32 %F.call, !dbg !79
|
||||
// CHECK:STDOUT: }
|
||||
@@ -196,21 +197,21 @@ fn M() {
|
||||
// CHECK:STDOUT: define linkonce_odr double @_CD.Main.c27b765f2159c9a0(double %x, i32 %count) #0 !dbg !88 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %Int.as.OrderedWith.impl.Greater.call = icmp sgt i32 %count, 4, !dbg !92
|
||||
// CHECK:STDOUT: br i1 %Int.as.OrderedWith.impl.Greater.call, label %if.then.loc48, label %if.else.loc48, !dbg !93
|
||||
// CHECK:STDOUT: br i1 %Int.as.OrderedWith.impl.Greater.call, label %if.then.loc49, label %if.else.loc49, !dbg !93
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: if.then.loc48: ; preds = %entry
|
||||
// CHECK:STDOUT: if.then.loc49: ; preds = %entry
|
||||
// CHECK:STDOUT: ret double %x, !dbg !94
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: if.else.loc48: ; preds = %entry
|
||||
// CHECK:STDOUT: if.else.loc49: ; preds = %entry
|
||||
// CHECK:STDOUT: %Int.as.ModWith.impl.Op.call = srem i32 %count, 2, !dbg !95
|
||||
// CHECK:STDOUT: %Int.as.EqWith.impl.Equal.call = icmp eq i32 %Int.as.ModWith.impl.Op.call, 0, !dbg !95
|
||||
// CHECK:STDOUT: br i1 %Int.as.EqWith.impl.Equal.call, label %if.then.loc51, label %if.else.loc51, !dbg !96
|
||||
// CHECK:STDOUT: br i1 %Int.as.EqWith.impl.Equal.call, label %if.then.loc52, label %if.else.loc52, !dbg !96
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: if.then.loc51: ; preds = %if.else.loc48
|
||||
// CHECK:STDOUT: if.then.loc52: ; preds = %if.else.loc49
|
||||
// CHECK:STDOUT: %E.call = call double @_CE.Main.c27b765f2159c9a0(double %x, i32 %count), !dbg !97
|
||||
// CHECK:STDOUT: ret double %E.call, !dbg !98
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: if.else.loc51: ; preds = %if.else.loc48
|
||||
// CHECK:STDOUT: if.else.loc52: ; preds = %if.else.loc49
|
||||
// CHECK:STDOUT: %F.call = call double @_CF.Main.c27b765f2159c9a0(double %x, i32 %count), !dbg !99
|
||||
// CHECK:STDOUT: ret double %F.call, !dbg !100
|
||||
// CHECK:STDOUT: }
|
||||
@@ -226,21 +227,21 @@ fn M() {
|
||||
// CHECK:STDOUT: define linkonce_odr ptr @_CD.Main.2621742a01881e29(ptr %x, i32 %count) #0 !dbg !107 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %Int.as.OrderedWith.impl.Greater.call = icmp sgt i32 %count, 4, !dbg !111
|
||||
// CHECK:STDOUT: br i1 %Int.as.OrderedWith.impl.Greater.call, label %if.then.loc48, label %if.else.loc48, !dbg !112
|
||||
// CHECK:STDOUT: br i1 %Int.as.OrderedWith.impl.Greater.call, label %if.then.loc49, label %if.else.loc49, !dbg !112
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: if.then.loc48: ; preds = %entry
|
||||
// CHECK:STDOUT: if.then.loc49: ; preds = %entry
|
||||
// CHECK:STDOUT: ret ptr %x, !dbg !113
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: if.else.loc48: ; preds = %entry
|
||||
// CHECK:STDOUT: if.else.loc49: ; preds = %entry
|
||||
// CHECK:STDOUT: %Int.as.ModWith.impl.Op.call = srem i32 %count, 2, !dbg !114
|
||||
// CHECK:STDOUT: %Int.as.EqWith.impl.Equal.call = icmp eq i32 %Int.as.ModWith.impl.Op.call, 0, !dbg !114
|
||||
// CHECK:STDOUT: br i1 %Int.as.EqWith.impl.Equal.call, label %if.then.loc51, label %if.else.loc51, !dbg !115
|
||||
// CHECK:STDOUT: br i1 %Int.as.EqWith.impl.Equal.call, label %if.then.loc52, label %if.else.loc52, !dbg !115
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: if.then.loc51: ; preds = %if.else.loc48
|
||||
// CHECK:STDOUT: if.then.loc52: ; preds = %if.else.loc49
|
||||
// CHECK:STDOUT: %E.call = call ptr @_CE.Main.2621742a01881e29(ptr %x, i32 %count), !dbg !116
|
||||
// CHECK:STDOUT: ret ptr %E.call, !dbg !117
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: if.else.loc51: ; preds = %if.else.loc48
|
||||
// CHECK:STDOUT: if.else.loc52: ; preds = %if.else.loc49
|
||||
// CHECK:STDOUT: %F.call = call ptr @_CF.Main.2621742a01881e29(ptr %x, i32 %count), !dbg !118
|
||||
// CHECK:STDOUT: ret ptr %F.call, !dbg !119
|
||||
// CHECK:STDOUT: }
|
||||
@@ -379,210 +380,210 @@ fn M() {
|
||||
// CHECK:STDOUT: !1 = !DIFile(filename: "call_recursive_sccs_deep.carbon", directory: "")
|
||||
// CHECK:STDOUT: !2 = !{i32 7, !"Dwarf Version", i32 5}
|
||||
// CHECK:STDOUT: !3 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
// CHECK:STDOUT: !4 = distinct !DISubprogram(name: "M", linkageName: "_CM.Main", scope: null, file: !1, line: 73, type: !5, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !4 = distinct !DISubprogram(name: "M", linkageName: "_CM.Main", scope: null, file: !1, line: 74, type: !5, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !5 = !DISubroutineType(types: !6)
|
||||
// CHECK:STDOUT: !6 = !{null}
|
||||
// CHECK:STDOUT: !7 = !DILocation(line: 74, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !8 = !DILocation(line: 75, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !9 = !DILocation(line: 76, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !10 = !DILocation(line: 77, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !11 = !DILocation(line: 79, column: 5, scope: !4)
|
||||
// CHECK:STDOUT: !12 = !DILocation(line: 79, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !13 = !DILocation(line: 80, column: 5, scope: !4)
|
||||
// CHECK:STDOUT: !14 = !DILocation(line: 80, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !15 = !DILocation(line: 81, column: 5, scope: !4)
|
||||
// CHECK:STDOUT: !16 = !DILocation(line: 81, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !17 = !DILocation(line: 82, column: 5, scope: !4)
|
||||
// CHECK:STDOUT: !18 = !DILocation(line: 82, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !19 = !DILocation(line: 73, column: 1, scope: !4)
|
||||
// CHECK:STDOUT: !20 = distinct !DISubprogram(name: "Op", linkageName: "_COp.30d8007fdcc57f83:core.Destroy.Core", scope: null, file: !1, line: 75, type: !21, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !24)
|
||||
// CHECK:STDOUT: !7 = !DILocation(line: 75, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !8 = !DILocation(line: 76, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !9 = !DILocation(line: 77, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !10 = !DILocation(line: 78, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !11 = !DILocation(line: 80, column: 5, scope: !4)
|
||||
// CHECK:STDOUT: !12 = !DILocation(line: 80, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !13 = !DILocation(line: 81, column: 5, scope: !4)
|
||||
// CHECK:STDOUT: !14 = !DILocation(line: 81, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !15 = !DILocation(line: 82, column: 5, scope: !4)
|
||||
// CHECK:STDOUT: !16 = !DILocation(line: 82, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !17 = !DILocation(line: 83, column: 5, scope: !4)
|
||||
// CHECK:STDOUT: !18 = !DILocation(line: 83, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !19 = !DILocation(line: 74, column: 1, scope: !4)
|
||||
// CHECK:STDOUT: !20 = distinct !DISubprogram(name: "Op", linkageName: "_COp.30d8007fdcc57f83:core.Destroy.Core", scope: null, file: !1, line: 76, type: !21, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !24)
|
||||
// CHECK:STDOUT: !21 = !DISubroutineType(types: !22)
|
||||
// CHECK:STDOUT: !22 = !{null, !23}
|
||||
// CHECK:STDOUT: !23 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: null, size: 64)
|
||||
// CHECK:STDOUT: !24 = !{!25}
|
||||
// CHECK:STDOUT: !25 = !DILocalVariable(arg: 1, scope: !20, type: !23)
|
||||
// CHECK:STDOUT: !26 = !DILocation(line: 75, column: 3, scope: !20)
|
||||
// CHECK:STDOUT: !27 = distinct !DISubprogram(name: "Op", linkageName: "_COp.5e27612b9dd31a14:core.Destroy.Core", scope: null, file: !1, line: 74, type: !28, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !31)
|
||||
// CHECK:STDOUT: !26 = !DILocation(line: 76, column: 3, scope: !20)
|
||||
// CHECK:STDOUT: !27 = distinct !DISubprogram(name: "Op", linkageName: "_COp.5e27612b9dd31a14:core.Destroy.Core", scope: null, file: !1, line: 75, type: !28, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !31)
|
||||
// CHECK:STDOUT: !28 = !DISubroutineType(types: !29)
|
||||
// CHECK:STDOUT: !29 = !{null, !30}
|
||||
// CHECK:STDOUT: !30 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
|
||||
// CHECK:STDOUT: !31 = !{!32}
|
||||
// CHECK:STDOUT: !32 = !DILocalVariable(arg: 1, scope: !27, type: !30)
|
||||
// CHECK:STDOUT: !33 = !DILocation(line: 74, column: 3, scope: !27)
|
||||
// CHECK:STDOUT: !34 = distinct !DISubprogram(name: "A", linkageName: "_CA.Main.5bd8d5767580997a", scope: null, file: !1, line: 31, type: !35, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !37)
|
||||
// CHECK:STDOUT: !33 = !DILocation(line: 75, column: 3, scope: !27)
|
||||
// CHECK:STDOUT: !34 = distinct !DISubprogram(name: "A", linkageName: "_CA.Main.5bd8d5767580997a", scope: null, file: !1, line: 32, type: !35, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !37)
|
||||
// CHECK:STDOUT: !35 = !DISubroutineType(types: !36)
|
||||
// CHECK:STDOUT: !36 = !{!30, !30, !30}
|
||||
// CHECK:STDOUT: !37 = !{!38, !39}
|
||||
// CHECK:STDOUT: !38 = !DILocalVariable(arg: 1, scope: !34, type: !30)
|
||||
// CHECK:STDOUT: !39 = !DILocalVariable(arg: 2, scope: !34, type: !30)
|
||||
// CHECK:STDOUT: !40 = !DILocation(line: 32, column: 3, scope: !34)
|
||||
// CHECK:STDOUT: !41 = !DILocation(line: 33, column: 10, scope: !34)
|
||||
// CHECK:STDOUT: !42 = !DILocation(line: 33, column: 3, scope: !34)
|
||||
// CHECK:STDOUT: !43 = distinct !DISubprogram(name: "A", linkageName: "_CA.Main.c27b765f2159c9a0", scope: null, file: !1, line: 31, type: !44, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !46)
|
||||
// CHECK:STDOUT: !40 = !DILocation(line: 33, column: 3, scope: !34)
|
||||
// CHECK:STDOUT: !41 = !DILocation(line: 34, column: 10, scope: !34)
|
||||
// CHECK:STDOUT: !42 = !DILocation(line: 34, column: 3, scope: !34)
|
||||
// CHECK:STDOUT: !43 = distinct !DISubprogram(name: "A", linkageName: "_CA.Main.c27b765f2159c9a0", scope: null, file: !1, line: 32, type: !44, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !46)
|
||||
// CHECK:STDOUT: !44 = !DISubroutineType(types: !45)
|
||||
// CHECK:STDOUT: !45 = !{!23, !23, !30}
|
||||
// CHECK:STDOUT: !46 = !{!47, !48}
|
||||
// CHECK:STDOUT: !47 = !DILocalVariable(arg: 1, scope: !43, type: !23)
|
||||
// CHECK:STDOUT: !48 = !DILocalVariable(arg: 2, scope: !43, type: !30)
|
||||
// CHECK:STDOUT: !49 = !DILocation(line: 32, column: 3, scope: !43)
|
||||
// CHECK:STDOUT: !50 = !DILocation(line: 33, column: 10, scope: !43)
|
||||
// CHECK:STDOUT: !51 = !DILocation(line: 33, column: 3, scope: !43)
|
||||
// CHECK:STDOUT: !52 = distinct !DISubprogram(name: "A", linkageName: "_CA.Main.2621742a01881e29", scope: null, file: !1, line: 31, type: !44, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !53)
|
||||
// CHECK:STDOUT: !49 = !DILocation(line: 33, column: 3, scope: !43)
|
||||
// CHECK:STDOUT: !50 = !DILocation(line: 34, column: 10, scope: !43)
|
||||
// CHECK:STDOUT: !51 = !DILocation(line: 34, column: 3, scope: !43)
|
||||
// CHECK:STDOUT: !52 = distinct !DISubprogram(name: "A", linkageName: "_CA.Main.2621742a01881e29", scope: null, file: !1, line: 32, type: !44, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !53)
|
||||
// CHECK:STDOUT: !53 = !{!54, !55}
|
||||
// CHECK:STDOUT: !54 = !DILocalVariable(arg: 1, scope: !52, type: !23)
|
||||
// CHECK:STDOUT: !55 = !DILocalVariable(arg: 2, scope: !52, type: !30)
|
||||
// CHECK:STDOUT: !56 = !DILocation(line: 32, column: 3, scope: !52)
|
||||
// CHECK:STDOUT: !57 = !DILocation(line: 33, column: 10, scope: !52)
|
||||
// CHECK:STDOUT: !58 = !DILocation(line: 33, column: 3, scope: !52)
|
||||
// CHECK:STDOUT: !59 = distinct !DISubprogram(name: "B", linkageName: "_CB.Main.5bd8d5767580997a", scope: null, file: !1, line: 36, type: !60, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !62)
|
||||
// CHECK:STDOUT: !56 = !DILocation(line: 33, column: 3, scope: !52)
|
||||
// CHECK:STDOUT: !57 = !DILocation(line: 34, column: 10, scope: !52)
|
||||
// CHECK:STDOUT: !58 = !DILocation(line: 34, column: 3, scope: !52)
|
||||
// CHECK:STDOUT: !59 = distinct !DISubprogram(name: "B", linkageName: "_CB.Main.5bd8d5767580997a", scope: null, file: !1, line: 37, type: !60, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !62)
|
||||
// CHECK:STDOUT: !60 = !DISubroutineType(types: !61)
|
||||
// CHECK:STDOUT: !61 = !{null, !30, !30}
|
||||
// CHECK:STDOUT: !62 = !{!63, !64}
|
||||
// CHECK:STDOUT: !63 = !DILocalVariable(arg: 1, scope: !59, type: !30)
|
||||
// CHECK:STDOUT: !64 = !DILocalVariable(arg: 2, scope: !59, type: !30)
|
||||
// CHECK:STDOUT: !65 = !DILocation(line: 37, column: 3, scope: !59)
|
||||
// CHECK:STDOUT: !66 = !DILocation(line: 36, column: 1, scope: !59)
|
||||
// CHECK:STDOUT: !67 = distinct !DISubprogram(name: "D", linkageName: "_CD.Main.5bd8d5767580997a", scope: null, file: !1, line: 47, type: !35, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !68)
|
||||
// CHECK:STDOUT: !65 = !DILocation(line: 38, column: 3, scope: !59)
|
||||
// CHECK:STDOUT: !66 = !DILocation(line: 37, column: 1, scope: !59)
|
||||
// CHECK:STDOUT: !67 = distinct !DISubprogram(name: "D", linkageName: "_CD.Main.5bd8d5767580997a", scope: null, file: !1, line: 48, type: !35, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !68)
|
||||
// CHECK:STDOUT: !68 = !{!69, !70}
|
||||
// CHECK:STDOUT: !69 = !DILocalVariable(arg: 1, scope: !67, type: !30)
|
||||
// CHECK:STDOUT: !70 = !DILocalVariable(arg: 2, scope: !67, type: !30)
|
||||
// CHECK:STDOUT: !71 = !DILocation(line: 48, column: 7, scope: !67)
|
||||
// CHECK:STDOUT: !72 = !DILocation(line: 48, column: 6, scope: !67)
|
||||
// CHECK:STDOUT: !73 = !DILocation(line: 49, column: 5, scope: !67)
|
||||
// CHECK:STDOUT: !74 = !DILocation(line: 51, column: 7, scope: !67)
|
||||
// CHECK:STDOUT: !75 = !DILocation(line: 51, column: 6, scope: !67)
|
||||
// CHECK:STDOUT: !76 = !DILocation(line: 52, column: 12, scope: !67)
|
||||
// CHECK:STDOUT: !77 = !DILocation(line: 52, column: 5, scope: !67)
|
||||
// CHECK:STDOUT: !78 = !DILocation(line: 54, column: 12, scope: !67)
|
||||
// CHECK:STDOUT: !79 = !DILocation(line: 54, column: 5, scope: !67)
|
||||
// CHECK:STDOUT: !80 = distinct !DISubprogram(name: "B", linkageName: "_CB.Main.c27b765f2159c9a0", scope: null, file: !1, line: 36, type: !81, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !83)
|
||||
// CHECK:STDOUT: !71 = !DILocation(line: 49, column: 7, scope: !67)
|
||||
// CHECK:STDOUT: !72 = !DILocation(line: 49, column: 6, scope: !67)
|
||||
// CHECK:STDOUT: !73 = !DILocation(line: 50, column: 5, scope: !67)
|
||||
// CHECK:STDOUT: !74 = !DILocation(line: 52, column: 7, scope: !67)
|
||||
// CHECK:STDOUT: !75 = !DILocation(line: 52, column: 6, scope: !67)
|
||||
// CHECK:STDOUT: !76 = !DILocation(line: 53, column: 12, scope: !67)
|
||||
// CHECK:STDOUT: !77 = !DILocation(line: 53, column: 5, scope: !67)
|
||||
// CHECK:STDOUT: !78 = !DILocation(line: 55, column: 12, scope: !67)
|
||||
// CHECK:STDOUT: !79 = !DILocation(line: 55, column: 5, scope: !67)
|
||||
// CHECK:STDOUT: !80 = distinct !DISubprogram(name: "B", linkageName: "_CB.Main.c27b765f2159c9a0", scope: null, file: !1, line: 37, type: !81, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !83)
|
||||
// CHECK:STDOUT: !81 = !DISubroutineType(types: !82)
|
||||
// CHECK:STDOUT: !82 = !{null, !23, !30}
|
||||
// CHECK:STDOUT: !83 = !{!84, !85}
|
||||
// CHECK:STDOUT: !84 = !DILocalVariable(arg: 1, scope: !80, type: !23)
|
||||
// CHECK:STDOUT: !85 = !DILocalVariable(arg: 2, scope: !80, type: !30)
|
||||
// CHECK:STDOUT: !86 = !DILocation(line: 37, column: 3, scope: !80)
|
||||
// CHECK:STDOUT: !87 = !DILocation(line: 36, column: 1, scope: !80)
|
||||
// CHECK:STDOUT: !88 = distinct !DISubprogram(name: "D", linkageName: "_CD.Main.c27b765f2159c9a0", scope: null, file: !1, line: 47, type: !44, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !89)
|
||||
// CHECK:STDOUT: !86 = !DILocation(line: 38, column: 3, scope: !80)
|
||||
// CHECK:STDOUT: !87 = !DILocation(line: 37, column: 1, scope: !80)
|
||||
// CHECK:STDOUT: !88 = distinct !DISubprogram(name: "D", linkageName: "_CD.Main.c27b765f2159c9a0", scope: null, file: !1, line: 48, type: !44, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !89)
|
||||
// CHECK:STDOUT: !89 = !{!90, !91}
|
||||
// CHECK:STDOUT: !90 = !DILocalVariable(arg: 1, scope: !88, type: !23)
|
||||
// CHECK:STDOUT: !91 = !DILocalVariable(arg: 2, scope: !88, type: !30)
|
||||
// CHECK:STDOUT: !92 = !DILocation(line: 48, column: 7, scope: !88)
|
||||
// CHECK:STDOUT: !93 = !DILocation(line: 48, column: 6, scope: !88)
|
||||
// CHECK:STDOUT: !94 = !DILocation(line: 49, column: 5, scope: !88)
|
||||
// CHECK:STDOUT: !95 = !DILocation(line: 51, column: 7, scope: !88)
|
||||
// CHECK:STDOUT: !96 = !DILocation(line: 51, column: 6, scope: !88)
|
||||
// CHECK:STDOUT: !97 = !DILocation(line: 52, column: 12, scope: !88)
|
||||
// CHECK:STDOUT: !98 = !DILocation(line: 52, column: 5, scope: !88)
|
||||
// CHECK:STDOUT: !99 = !DILocation(line: 54, column: 12, scope: !88)
|
||||
// CHECK:STDOUT: !100 = !DILocation(line: 54, column: 5, scope: !88)
|
||||
// CHECK:STDOUT: !101 = distinct !DISubprogram(name: "B", linkageName: "_CB.Main.2621742a01881e29", scope: null, file: !1, line: 36, type: !81, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !102)
|
||||
// CHECK:STDOUT: !92 = !DILocation(line: 49, column: 7, scope: !88)
|
||||
// CHECK:STDOUT: !93 = !DILocation(line: 49, column: 6, scope: !88)
|
||||
// CHECK:STDOUT: !94 = !DILocation(line: 50, column: 5, scope: !88)
|
||||
// CHECK:STDOUT: !95 = !DILocation(line: 52, column: 7, scope: !88)
|
||||
// CHECK:STDOUT: !96 = !DILocation(line: 52, column: 6, scope: !88)
|
||||
// CHECK:STDOUT: !97 = !DILocation(line: 53, column: 12, scope: !88)
|
||||
// CHECK:STDOUT: !98 = !DILocation(line: 53, column: 5, scope: !88)
|
||||
// CHECK:STDOUT: !99 = !DILocation(line: 55, column: 12, scope: !88)
|
||||
// CHECK:STDOUT: !100 = !DILocation(line: 55, column: 5, scope: !88)
|
||||
// CHECK:STDOUT: !101 = distinct !DISubprogram(name: "B", linkageName: "_CB.Main.2621742a01881e29", scope: null, file: !1, line: 37, type: !81, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !102)
|
||||
// CHECK:STDOUT: !102 = !{!103, !104}
|
||||
// CHECK:STDOUT: !103 = !DILocalVariable(arg: 1, scope: !101, type: !23)
|
||||
// CHECK:STDOUT: !104 = !DILocalVariable(arg: 2, scope: !101, type: !30)
|
||||
// CHECK:STDOUT: !105 = !DILocation(line: 37, column: 3, scope: !101)
|
||||
// CHECK:STDOUT: !106 = !DILocation(line: 36, column: 1, scope: !101)
|
||||
// CHECK:STDOUT: !107 = distinct !DISubprogram(name: "D", linkageName: "_CD.Main.2621742a01881e29", scope: null, file: !1, line: 47, type: !44, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !108)
|
||||
// CHECK:STDOUT: !105 = !DILocation(line: 38, column: 3, scope: !101)
|
||||
// CHECK:STDOUT: !106 = !DILocation(line: 37, column: 1, scope: !101)
|
||||
// CHECK:STDOUT: !107 = distinct !DISubprogram(name: "D", linkageName: "_CD.Main.2621742a01881e29", scope: null, file: !1, line: 48, type: !44, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !108)
|
||||
// CHECK:STDOUT: !108 = !{!109, !110}
|
||||
// CHECK:STDOUT: !109 = !DILocalVariable(arg: 1, scope: !107, type: !23)
|
||||
// CHECK:STDOUT: !110 = !DILocalVariable(arg: 2, scope: !107, type: !30)
|
||||
// CHECK:STDOUT: !111 = !DILocation(line: 48, column: 7, scope: !107)
|
||||
// CHECK:STDOUT: !112 = !DILocation(line: 48, column: 6, scope: !107)
|
||||
// CHECK:STDOUT: !113 = !DILocation(line: 49, column: 5, scope: !107)
|
||||
// CHECK:STDOUT: !114 = !DILocation(line: 51, column: 7, scope: !107)
|
||||
// CHECK:STDOUT: !115 = !DILocation(line: 51, column: 6, scope: !107)
|
||||
// CHECK:STDOUT: !116 = !DILocation(line: 52, column: 12, scope: !107)
|
||||
// CHECK:STDOUT: !117 = !DILocation(line: 52, column: 5, scope: !107)
|
||||
// CHECK:STDOUT: !118 = !DILocation(line: 54, column: 12, scope: !107)
|
||||
// CHECK:STDOUT: !119 = !DILocation(line: 54, column: 5, scope: !107)
|
||||
// CHECK:STDOUT: !120 = distinct !DISubprogram(name: "C", linkageName: "_CC.Main.5bd8d5767580997a", scope: null, file: !1, line: 40, type: !60, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !121)
|
||||
// CHECK:STDOUT: !111 = !DILocation(line: 49, column: 7, scope: !107)
|
||||
// CHECK:STDOUT: !112 = !DILocation(line: 49, column: 6, scope: !107)
|
||||
// CHECK:STDOUT: !113 = !DILocation(line: 50, column: 5, scope: !107)
|
||||
// CHECK:STDOUT: !114 = !DILocation(line: 52, column: 7, scope: !107)
|
||||
// CHECK:STDOUT: !115 = !DILocation(line: 52, column: 6, scope: !107)
|
||||
// CHECK:STDOUT: !116 = !DILocation(line: 53, column: 12, scope: !107)
|
||||
// CHECK:STDOUT: !117 = !DILocation(line: 53, column: 5, scope: !107)
|
||||
// CHECK:STDOUT: !118 = !DILocation(line: 55, column: 12, scope: !107)
|
||||
// CHECK:STDOUT: !119 = !DILocation(line: 55, column: 5, scope: !107)
|
||||
// CHECK:STDOUT: !120 = distinct !DISubprogram(name: "C", linkageName: "_CC.Main.5bd8d5767580997a", scope: null, file: !1, line: 41, type: !60, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !121)
|
||||
// CHECK:STDOUT: !121 = !{!122, !123}
|
||||
// CHECK:STDOUT: !122 = !DILocalVariable(arg: 1, scope: !120, type: !30)
|
||||
// CHECK:STDOUT: !123 = !DILocalVariable(arg: 2, scope: !120, type: !30)
|
||||
// CHECK:STDOUT: !124 = !DILocation(line: 41, column: 7, scope: !120)
|
||||
// CHECK:STDOUT: !125 = !DILocation(line: 41, column: 6, scope: !120)
|
||||
// CHECK:STDOUT: !126 = !DILocation(line: 42, column: 5, scope: !120)
|
||||
// CHECK:STDOUT: !127 = !DILocation(line: 43, column: 10, scope: !120)
|
||||
// CHECK:STDOUT: !128 = !DILocation(line: 43, column: 5, scope: !120)
|
||||
// CHECK:STDOUT: !129 = !DILocation(line: 41, column: 3, scope: !120)
|
||||
// CHECK:STDOUT: !130 = !DILocation(line: 40, column: 1, scope: !120)
|
||||
// CHECK:STDOUT: !131 = distinct !DISubprogram(name: "E", linkageName: "_CE.Main.5bd8d5767580997a", scope: null, file: !1, line: 60, type: !35, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !132)
|
||||
// CHECK:STDOUT: !124 = !DILocation(line: 42, column: 7, scope: !120)
|
||||
// CHECK:STDOUT: !125 = !DILocation(line: 42, column: 6, scope: !120)
|
||||
// CHECK:STDOUT: !126 = !DILocation(line: 43, column: 5, scope: !120)
|
||||
// CHECK:STDOUT: !127 = !DILocation(line: 44, column: 10, scope: !120)
|
||||
// CHECK:STDOUT: !128 = !DILocation(line: 44, column: 5, scope: !120)
|
||||
// CHECK:STDOUT: !129 = !DILocation(line: 42, column: 3, scope: !120)
|
||||
// CHECK:STDOUT: !130 = !DILocation(line: 41, column: 1, scope: !120)
|
||||
// CHECK:STDOUT: !131 = distinct !DISubprogram(name: "E", linkageName: "_CE.Main.5bd8d5767580997a", scope: null, file: !1, line: 61, type: !35, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !132)
|
||||
// CHECK:STDOUT: !132 = !{!133, !134}
|
||||
// CHECK:STDOUT: !133 = !DILocalVariable(arg: 1, scope: !131, type: !30)
|
||||
// CHECK:STDOUT: !134 = !DILocalVariable(arg: 2, scope: !131, type: !30)
|
||||
// CHECK:STDOUT: !135 = !DILocation(line: 61, column: 10, scope: !131)
|
||||
// CHECK:STDOUT: !136 = !DILocation(line: 61, column: 3, scope: !131)
|
||||
// CHECK:STDOUT: !137 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.5bd8d5767580997a", scope: null, file: !1, line: 64, type: !35, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !138)
|
||||
// CHECK:STDOUT: !135 = !DILocation(line: 62, column: 10, scope: !131)
|
||||
// CHECK:STDOUT: !136 = !DILocation(line: 62, column: 3, scope: !131)
|
||||
// CHECK:STDOUT: !137 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.5bd8d5767580997a", scope: null, file: !1, line: 65, type: !35, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !138)
|
||||
// CHECK:STDOUT: !138 = !{!139, !140}
|
||||
// CHECK:STDOUT: !139 = !DILocalVariable(arg: 1, scope: !137, type: !30)
|
||||
// CHECK:STDOUT: !140 = !DILocalVariable(arg: 2, scope: !137, type: !30)
|
||||
// CHECK:STDOUT: !141 = !DILocation(line: 65, column: 10, scope: !137)
|
||||
// CHECK:STDOUT: !142 = !DILocation(line: 65, column: 3, scope: !137)
|
||||
// CHECK:STDOUT: !143 = distinct !DISubprogram(name: "C", linkageName: "_CC.Main.c27b765f2159c9a0", scope: null, file: !1, line: 40, type: !81, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !144)
|
||||
// CHECK:STDOUT: !141 = !DILocation(line: 66, column: 10, scope: !137)
|
||||
// CHECK:STDOUT: !142 = !DILocation(line: 66, column: 3, scope: !137)
|
||||
// CHECK:STDOUT: !143 = distinct !DISubprogram(name: "C", linkageName: "_CC.Main.c27b765f2159c9a0", scope: null, file: !1, line: 41, type: !81, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !144)
|
||||
// CHECK:STDOUT: !144 = !{!145, !146}
|
||||
// CHECK:STDOUT: !145 = !DILocalVariable(arg: 1, scope: !143, type: !23)
|
||||
// CHECK:STDOUT: !146 = !DILocalVariable(arg: 2, scope: !143, type: !30)
|
||||
// CHECK:STDOUT: !147 = !DILocation(line: 41, column: 7, scope: !143)
|
||||
// CHECK:STDOUT: !148 = !DILocation(line: 41, column: 6, scope: !143)
|
||||
// CHECK:STDOUT: !149 = !DILocation(line: 42, column: 5, scope: !143)
|
||||
// CHECK:STDOUT: !150 = !DILocation(line: 43, column: 10, scope: !143)
|
||||
// CHECK:STDOUT: !151 = !DILocation(line: 43, column: 5, scope: !143)
|
||||
// CHECK:STDOUT: !152 = !DILocation(line: 41, column: 3, scope: !143)
|
||||
// CHECK:STDOUT: !153 = !DILocation(line: 40, column: 1, scope: !143)
|
||||
// CHECK:STDOUT: !154 = distinct !DISubprogram(name: "E", linkageName: "_CE.Main.c27b765f2159c9a0", scope: null, file: !1, line: 60, type: !44, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !155)
|
||||
// CHECK:STDOUT: !147 = !DILocation(line: 42, column: 7, scope: !143)
|
||||
// CHECK:STDOUT: !148 = !DILocation(line: 42, column: 6, scope: !143)
|
||||
// CHECK:STDOUT: !149 = !DILocation(line: 43, column: 5, scope: !143)
|
||||
// CHECK:STDOUT: !150 = !DILocation(line: 44, column: 10, scope: !143)
|
||||
// CHECK:STDOUT: !151 = !DILocation(line: 44, column: 5, scope: !143)
|
||||
// CHECK:STDOUT: !152 = !DILocation(line: 42, column: 3, scope: !143)
|
||||
// CHECK:STDOUT: !153 = !DILocation(line: 41, column: 1, scope: !143)
|
||||
// CHECK:STDOUT: !154 = distinct !DISubprogram(name: "E", linkageName: "_CE.Main.c27b765f2159c9a0", scope: null, file: !1, line: 61, type: !44, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !155)
|
||||
// CHECK:STDOUT: !155 = !{!156, !157}
|
||||
// CHECK:STDOUT: !156 = !DILocalVariable(arg: 1, scope: !154, type: !23)
|
||||
// CHECK:STDOUT: !157 = !DILocalVariable(arg: 2, scope: !154, type: !30)
|
||||
// CHECK:STDOUT: !158 = !DILocation(line: 61, column: 10, scope: !154)
|
||||
// CHECK:STDOUT: !159 = !DILocation(line: 61, column: 3, scope: !154)
|
||||
// CHECK:STDOUT: !160 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.c27b765f2159c9a0", scope: null, file: !1, line: 64, type: !44, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !161)
|
||||
// CHECK:STDOUT: !158 = !DILocation(line: 62, column: 10, scope: !154)
|
||||
// CHECK:STDOUT: !159 = !DILocation(line: 62, column: 3, scope: !154)
|
||||
// CHECK:STDOUT: !160 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.c27b765f2159c9a0", scope: null, file: !1, line: 65, type: !44, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !161)
|
||||
// CHECK:STDOUT: !161 = !{!162, !163}
|
||||
// CHECK:STDOUT: !162 = !DILocalVariable(arg: 1, scope: !160, type: !23)
|
||||
// CHECK:STDOUT: !163 = !DILocalVariable(arg: 2, scope: !160, type: !30)
|
||||
// CHECK:STDOUT: !164 = !DILocation(line: 65, column: 10, scope: !160)
|
||||
// CHECK:STDOUT: !165 = !DILocation(line: 65, column: 3, scope: !160)
|
||||
// CHECK:STDOUT: !166 = distinct !DISubprogram(name: "C", linkageName: "_CC.Main.2621742a01881e29", scope: null, file: !1, line: 40, type: !81, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !167)
|
||||
// CHECK:STDOUT: !164 = !DILocation(line: 66, column: 10, scope: !160)
|
||||
// CHECK:STDOUT: !165 = !DILocation(line: 66, column: 3, scope: !160)
|
||||
// CHECK:STDOUT: !166 = distinct !DISubprogram(name: "C", linkageName: "_CC.Main.2621742a01881e29", scope: null, file: !1, line: 41, type: !81, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !167)
|
||||
// CHECK:STDOUT: !167 = !{!168, !169}
|
||||
// CHECK:STDOUT: !168 = !DILocalVariable(arg: 1, scope: !166, type: !23)
|
||||
// CHECK:STDOUT: !169 = !DILocalVariable(arg: 2, scope: !166, type: !30)
|
||||
// CHECK:STDOUT: !170 = !DILocation(line: 41, column: 7, scope: !166)
|
||||
// CHECK:STDOUT: !171 = !DILocation(line: 41, column: 6, scope: !166)
|
||||
// CHECK:STDOUT: !172 = !DILocation(line: 42, column: 5, scope: !166)
|
||||
// CHECK:STDOUT: !173 = !DILocation(line: 43, column: 10, scope: !166)
|
||||
// CHECK:STDOUT: !174 = !DILocation(line: 43, column: 5, scope: !166)
|
||||
// CHECK:STDOUT: !175 = !DILocation(line: 41, column: 3, scope: !166)
|
||||
// CHECK:STDOUT: !176 = !DILocation(line: 40, column: 1, scope: !166)
|
||||
// CHECK:STDOUT: !177 = distinct !DISubprogram(name: "E", linkageName: "_CE.Main.2621742a01881e29", scope: null, file: !1, line: 60, type: !44, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !178)
|
||||
// CHECK:STDOUT: !170 = !DILocation(line: 42, column: 7, scope: !166)
|
||||
// CHECK:STDOUT: !171 = !DILocation(line: 42, column: 6, scope: !166)
|
||||
// CHECK:STDOUT: !172 = !DILocation(line: 43, column: 5, scope: !166)
|
||||
// CHECK:STDOUT: !173 = !DILocation(line: 44, column: 10, scope: !166)
|
||||
// CHECK:STDOUT: !174 = !DILocation(line: 44, column: 5, scope: !166)
|
||||
// CHECK:STDOUT: !175 = !DILocation(line: 42, column: 3, scope: !166)
|
||||
// CHECK:STDOUT: !176 = !DILocation(line: 41, column: 1, scope: !166)
|
||||
// CHECK:STDOUT: !177 = distinct !DISubprogram(name: "E", linkageName: "_CE.Main.2621742a01881e29", scope: null, file: !1, line: 61, type: !44, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !178)
|
||||
// CHECK:STDOUT: !178 = !{!179, !180}
|
||||
// CHECK:STDOUT: !179 = !DILocalVariable(arg: 1, scope: !177, type: !23)
|
||||
// CHECK:STDOUT: !180 = !DILocalVariable(arg: 2, scope: !177, type: !30)
|
||||
// CHECK:STDOUT: !181 = !DILocation(line: 61, column: 10, scope: !177)
|
||||
// CHECK:STDOUT: !182 = !DILocation(line: 61, column: 3, scope: !177)
|
||||
// CHECK:STDOUT: !183 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.2621742a01881e29", scope: null, file: !1, line: 64, type: !44, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !184)
|
||||
// CHECK:STDOUT: !181 = !DILocation(line: 62, column: 10, scope: !177)
|
||||
// CHECK:STDOUT: !182 = !DILocation(line: 62, column: 3, scope: !177)
|
||||
// CHECK:STDOUT: !183 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main.2621742a01881e29", scope: null, file: !1, line: 65, type: !44, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !184)
|
||||
// CHECK:STDOUT: !184 = !{!185, !186}
|
||||
// CHECK:STDOUT: !185 = !DILocalVariable(arg: 1, scope: !183, type: !23)
|
||||
// CHECK:STDOUT: !186 = !DILocalVariable(arg: 2, scope: !183, type: !30)
|
||||
// CHECK:STDOUT: !187 = !DILocation(line: 65, column: 10, scope: !183)
|
||||
// CHECK:STDOUT: !188 = !DILocation(line: 65, column: 3, scope: !183)
|
||||
// CHECK:STDOUT: !189 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.5bd8d5767580997a", scope: null, file: !1, line: 68, type: !35, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !190)
|
||||
// CHECK:STDOUT: !187 = !DILocation(line: 66, column: 10, scope: !183)
|
||||
// CHECK:STDOUT: !188 = !DILocation(line: 66, column: 3, scope: !183)
|
||||
// CHECK:STDOUT: !189 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.5bd8d5767580997a", scope: null, file: !1, line: 69, type: !35, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !190)
|
||||
// CHECK:STDOUT: !190 = !{!191, !192}
|
||||
// CHECK:STDOUT: !191 = !DILocalVariable(arg: 1, scope: !189, type: !30)
|
||||
// CHECK:STDOUT: !192 = !DILocalVariable(arg: 2, scope: !189, type: !30)
|
||||
// CHECK:STDOUT: !193 = !DILocation(line: 69, column: 15, scope: !189)
|
||||
// CHECK:STDOUT: !194 = !DILocation(line: 69, column: 10, scope: !189)
|
||||
// CHECK:STDOUT: !195 = !DILocation(line: 69, column: 3, scope: !189)
|
||||
// CHECK:STDOUT: !196 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.c27b765f2159c9a0", scope: null, file: !1, line: 68, type: !44, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !197)
|
||||
// CHECK:STDOUT: !193 = !DILocation(line: 70, column: 15, scope: !189)
|
||||
// CHECK:STDOUT: !194 = !DILocation(line: 70, column: 10, scope: !189)
|
||||
// CHECK:STDOUT: !195 = !DILocation(line: 70, column: 3, scope: !189)
|
||||
// CHECK:STDOUT: !196 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.c27b765f2159c9a0", scope: null, file: !1, line: 69, type: !44, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !197)
|
||||
// CHECK:STDOUT: !197 = !{!198, !199}
|
||||
// CHECK:STDOUT: !198 = !DILocalVariable(arg: 1, scope: !196, type: !23)
|
||||
// CHECK:STDOUT: !199 = !DILocalVariable(arg: 2, scope: !196, type: !30)
|
||||
// CHECK:STDOUT: !200 = !DILocation(line: 69, column: 15, scope: !196)
|
||||
// CHECK:STDOUT: !201 = !DILocation(line: 69, column: 10, scope: !196)
|
||||
// CHECK:STDOUT: !202 = !DILocation(line: 69, column: 3, scope: !196)
|
||||
// CHECK:STDOUT: !203 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.2621742a01881e29", scope: null, file: !1, line: 68, type: !44, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !204)
|
||||
// CHECK:STDOUT: !200 = !DILocation(line: 70, column: 15, scope: !196)
|
||||
// CHECK:STDOUT: !201 = !DILocation(line: 70, column: 10, scope: !196)
|
||||
// CHECK:STDOUT: !202 = !DILocation(line: 70, column: 3, scope: !196)
|
||||
// CHECK:STDOUT: !203 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.2621742a01881e29", scope: null, file: !1, line: 69, type: !44, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !204)
|
||||
// CHECK:STDOUT: !204 = !{!205, !206}
|
||||
// CHECK:STDOUT: !205 = !DILocalVariable(arg: 1, scope: !203, type: !23)
|
||||
// CHECK:STDOUT: !206 = !DILocalVariable(arg: 2, scope: !203, type: !30)
|
||||
// CHECK:STDOUT: !207 = !DILocation(line: 69, column: 15, scope: !203)
|
||||
// CHECK:STDOUT: !208 = !DILocation(line: 69, column: 10, scope: !203)
|
||||
// CHECK:STDOUT: !209 = !DILocation(line: 69, column: 3, scope: !203)
|
||||
// CHECK:STDOUT: !207 = !DILocation(line: 70, column: 15, scope: !203)
|
||||
// CHECK:STDOUT: !208 = !DILocation(line: 70, column: 10, scope: !203)
|
||||
// CHECK:STDOUT: !209 = !DILocation(line: 70, column: 3, scope: !203)
|
||||
// CHECK:STDOUT:
|
||||
|
||||
@@ -204,6 +204,13 @@ filegroup(
|
||||
],
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "carbon_core",
|
||||
srcs = [
|
||||
"//core:prelude_files",
|
||||
],
|
||||
)
|
||||
|
||||
# Currently, we're only installing the subset of LLVM's libc internals needed to
|
||||
# build libc++. At some point, we should ship LLVM's libc itself, and that will
|
||||
# likely expand this to cover more of the source. However, we'll still want to
|
||||
|
||||
@@ -48,6 +48,7 @@ CarbonRuntimesConfigInfo = provider(
|
||||
""",
|
||||
fields = [
|
||||
"builtins_archive",
|
||||
"carbon_prelude_prebuilt",
|
||||
"clang_hdrs_prefix",
|
||||
"crt_copts",
|
||||
"crtbegin_src",
|
||||
@@ -63,6 +64,7 @@ def _carbon_runtimes_config_impl(ctx):
|
||||
return [
|
||||
CarbonRuntimesConfigInfo(
|
||||
builtins_archive = ctx.files.builtins_archive[0],
|
||||
carbon_prelude_prebuilt = ctx.files.carbon_prelude_prebuilt,
|
||||
clang_hdrs_prefix = ctx.attr.clang_hdrs_prefix,
|
||||
crt_copts = ctx.attr.crt_copts,
|
||||
crtbegin_src = ctx.files.crtbegin_src[0] if ctx.files.crtbegin_src else None,
|
||||
@@ -78,6 +80,7 @@ carbon_runtimes_config = rule(
|
||||
implementation = _carbon_runtimes_config_impl,
|
||||
attrs = {
|
||||
"builtins_archive": attr.label(mandatory = True, allow_files = [".a"]),
|
||||
"carbon_prelude_prebuilt": attr.label(allow_files = [".o"]),
|
||||
"clang_hdrs_prefix": attr.string(default = "include/"),
|
||||
"crt_copts": attr.string_list(default = []),
|
||||
"crtbegin_src": attr.label(allow_files = [".c"]),
|
||||
@@ -170,6 +173,14 @@ def _carbon_runtimes_build_impl(ctx):
|
||||
ctx.actions.symlink(output = out_hdr, target_file = hdr)
|
||||
outputs.append(out_hdr)
|
||||
|
||||
for obj in config.carbon_prelude_prebuilt:
|
||||
rel_path = obj.path
|
||||
out_obj = ctx.actions.declare_file(
|
||||
"{0}/core/{1}".format(prefix, rel_path),
|
||||
)
|
||||
ctx.actions.symlink(output = out_obj, target_file = obj)
|
||||
outputs.append(out_obj)
|
||||
|
||||
return [DefaultInfo(files = depset(outputs))]
|
||||
|
||||
carbon_runtimes_build = rule(
|
||||
|
||||
@@ -47,6 +47,9 @@ struct SharedTestData {
|
||||
// Files in the prelude.
|
||||
llvm::SmallVector<std::string> prelude_files;
|
||||
|
||||
// Files in core not in the prelude.
|
||||
llvm::SmallVector<std::string> core_files;
|
||||
|
||||
// The installed files that tests can use.
|
||||
llvm::IntrusiveRefCntPtr<llvm::vfs::InMemoryFileSystem> file_system =
|
||||
new llvm::vfs::InMemoryFileSystem();
|
||||
@@ -63,6 +66,12 @@ static auto GetSharedTestData(llvm::StringRef exe_path)
|
||||
CARBON_RETURN_IF_ERROR(AddFile(*data.file_system, file));
|
||||
}
|
||||
|
||||
CARBON_ASSIGN_OR_RETURN(data.core_files,
|
||||
data.installation.ReadCarbonCoreManifest());
|
||||
for (const auto& file : data.core_files) {
|
||||
CARBON_RETURN_IF_ERROR(AddFile(*data.file_system, file));
|
||||
}
|
||||
|
||||
llvm::SmallVector<std::string> clang_header_files;
|
||||
CARBON_ASSIGN_OR_RETURN(clang_header_files,
|
||||
data.installation.ReadClangHeadersManifest());
|
||||
@@ -166,6 +175,7 @@ auto ToolchainFileTest::Run(
|
||||
if (component_ == "check" || component_ == "lower") {
|
||||
filtered_test_args.reserve(test_args.size());
|
||||
bool found_prelude_flag = false;
|
||||
bool found_include_core_flag = false;
|
||||
for (auto arg : test_args) {
|
||||
bool driver_flag = arg == "--custom-core" || arg == "--no-prelude-import";
|
||||
// A flag specified by a test prelude to indicate the intention to include
|
||||
@@ -174,7 +184,9 @@ auto ToolchainFileTest::Run(
|
||||
if (driver_flag || full_prelude) {
|
||||
found_prelude_flag = true;
|
||||
}
|
||||
if (!full_prelude) {
|
||||
bool include_core = arg == "--include-carbon-core";
|
||||
found_include_core_flag |= include_core;
|
||||
if (!full_prelude && !include_core) {
|
||||
filtered_test_args.push_back(arg);
|
||||
}
|
||||
}
|
||||
@@ -183,6 +195,13 @@ auto ToolchainFileTest::Run(
|
||||
"Include a prelude from //toolchain/testing/testdata/min_prelude "
|
||||
"to specify what should be imported into the test.");
|
||||
}
|
||||
// The compile driver includes the carbon-core by default, but we invert
|
||||
// this logic for the check and lower phases, meaning we detect the presence
|
||||
// of `--include-carbon-core` in the arguments, and unless that is there
|
||||
// we automatically append the `--no-include-carbon-core` flag.
|
||||
if (!found_include_core_flag) {
|
||||
filtered_test_args.push_back("--no-include-carbon-core");
|
||||
}
|
||||
} else {
|
||||
filtered_test_args = test_args;
|
||||
}
|
||||
@@ -266,7 +285,7 @@ auto ToolchainFileTest::GetDefaultArgs() const
|
||||
} else if (component_ == "lower") {
|
||||
args.insert(args.end(), {"--dump-llvm-ir", "--target=x86_64-linux-gnu"});
|
||||
} else if (component_ == "codegen") {
|
||||
// codegen tests specify flags as needed.
|
||||
args.insert(args.end(), {"--no-include-carbon-core"});
|
||||
} else {
|
||||
CARBON_FATAL("Unexpected test component {0}: {1}", component_, test_name());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user