Skip to content

Commit

Permalink
Reapply "Deprecate the -fbasic-block-sections=labels option." (llvm…
Browse files Browse the repository at this point in the history
…#110039)

This reapplies commit 1911a50 with a
minor fix in lld/ELF/LTO.cpp which sets Options.BBAddrMap when
`--lto-basic-block-sections=labels` is passed.
  • Loading branch information
rlavaee authored Sep 26, 2024
1 parent 0f98497 commit 7b7747d
Show file tree
Hide file tree
Showing 24 changed files with 52 additions and 82 deletions.
12 changes: 7 additions & 5 deletions clang/docs/UsersManual.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2369,14 +2369,16 @@ are listed below.
$ cd $P/bar && clang -c -funique-internal-linkage-names name_conflict.c
$ cd $P && clang foo/name_conflict.o && bar/name_conflict.o
.. option:: -fbasic-block-sections=[labels, all, list=<arg>, none]
.. option:: -f[no]-basic-block-address-map:
Emits a ``SHT_LLVM_BB_ADDR_MAP`` section which includes address offsets for each
basic block in the program, relative to the parent function address.


.. option:: -fbasic-block-sections=[all, list=<arg>, none]

Controls how Clang emits text sections for basic blocks. With values ``all``
and ``list=<arg>``, each basic block or a subset of basic blocks can be placed
in its own unique section. With the "labels" value, normal text sections are
emitted, but a ``.bb_addr_map`` section is emitted which includes address
offsets for each basic block in the program, relative to the parent function
address.
in its own unique section.

With the ``list=<arg>`` option, a file containing the subset of basic blocks
that need to placed in unique sections can be specified. The format of the
Expand Down
9 changes: 2 additions & 7 deletions clang/include/clang/Basic/CodeGenOptions.h
Original file line number Diff line number Diff line change
Expand Up @@ -107,18 +107,13 @@ class CodeGenOptions : public CodeGenOptionsBase {

// This field stores one of the allowed values for the option
// -fbasic-block-sections=. The allowed values with this option are:
// {"labels", "all", "list=<file>", "none"}.
// {"all", "list=<file>", "none"}.
//
// "labels": Only generate basic block symbols (labels) for all basic
// blocks, do not generate unique sections for basic blocks.
// Use the machine basic block id in the symbol name to
// associate profile info from virtual address to machine
// basic block.
// "all" : Generate basic block sections for all basic blocks.
// "list=<file>": Generate basic block sections for a subset of basic blocks.
// The functions and the machine basic block ids are specified
// in the file.
// "none": Disable sections/labels for basic blocks.
// "none": Disable sections for basic blocks.
std::string BBSections;

// If set, override the default value of MCAsmInfo::BinutilsVersion. If
Expand Down
4 changes: 2 additions & 2 deletions clang/include/clang/Driver/Options.td
Original file line number Diff line number Diff line change
Expand Up @@ -4244,8 +4244,8 @@ defm basic_block_address_map : BoolFOption<"basic-block-address-map",
def fbasic_block_sections_EQ : Joined<["-"], "fbasic-block-sections=">, Group<f_Group>,
Visibility<[ClangOption, CC1Option, CC1AsOption]>,
HelpText<"Place each function's basic blocks in unique sections (ELF Only)">,
DocBrief<[{Generate labels for each basic block or place each basic block or a subset of basic blocks in its own section.}]>,
Values<"all,labels,none,list=">,
DocBrief<[{Place each basic block or a subset of basic blocks in its own section.}]>,
Values<"all,none,list=">,
MarshallingInfoString<CodeGenOpts<"BBSections">, [{"none"}]>;
defm data_sections : BoolFOption<"data-sections",
CodeGenOpts<"DataSections">, DefaultFalse,
Expand Down
1 change: 0 additions & 1 deletion clang/lib/CodeGen/BackendUtil.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -429,7 +429,6 @@ static bool initTargetOptions(DiagnosticsEngine &Diags,
Options.BBSections =
llvm::StringSwitch<llvm::BasicBlockSection>(CodeGenOpts.BBSections)
.Case("all", llvm::BasicBlockSection::All)
.Case("labels", llvm::BasicBlockSection::Labels)
.StartsWith("list=", llvm::BasicBlockSection::List)
.Case("none", llvm::BasicBlockSection::None)
.Default(llvm::BasicBlockSection::None);
Expand Down
10 changes: 7 additions & 3 deletions clang/lib/Driver/ToolChains/Clang.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6228,9 +6228,13 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,

if (Arg *A = Args.getLastArg(options::OPT_fbasic_block_sections_EQ)) {
StringRef Val = A->getValue();
if (Triple.isX86() && Triple.isOSBinFormatELF()) {
if (Val != "all" && Val != "labels" && Val != "none" &&
!Val.starts_with("list="))
if (Val == "labels") {
D.Diag(diag::warn_drv_deprecated_arg)
<< A->getAsString(Args) << /*hasReplacement=*/true
<< "-fbasic-block-address-map";
CmdArgs.push_back("-fbasic-block-address-map");
} else if (Triple.isX86() && Triple.isOSBinFormatELF()) {
if (Val != "all" && Val != "none" && !Val.starts_with("list="))
D.Diag(diag::err_drv_invalid_value)
<< A->getAsString(Args) << A->getValue();
else
Expand Down
3 changes: 2 additions & 1 deletion clang/test/Driver/fbasic-block-sections.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@
// CHECK-OPT-NONE: "-fbasic-block-sections=none"
// CHECK-OPT-ALL: "-fbasic-block-sections=all"
// CHECK-OPT-LIST: "-fbasic-block-sections={{[^ ]*}}fbasic-block-sections.c"
// CHECK-OPT-LABELS: "-fbasic-block-sections=labels"
// CHECK-OPT-LABELS: warning: argument '-fbasic-block-sections=labels' is deprecated, use '-fbasic-block-address-map' instead
// CHECK-OPT-LABELS: "-fbasic-block-address-map"
// CHECK-TRIPLE: error: unsupported option '-fbasic-block-sections=all' for target
// CHECK-INVALID-VALUE: error: invalid value {{[^ ]*}} in '-fbasic-block-sections={{.*}}'
// CHECK-OPT-NULL-LIST: "-fbasic-block-sections=list="
Expand Down
7 changes: 4 additions & 3 deletions lld/ELF/LTO.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,6 @@ static lto::Config createConfig(Ctx &ctx) {
c.Options.FunctionSections = true;
c.Options.DataSections = true;

c.Options.BBAddrMap = ctx.arg.ltoBBAddrMap;

// Check if basic block sections must be used.
// Allowed values for --lto-basic-block-sections are "all", "labels",
// "<file name specifying basic block ids>", or none. This is the equivalent
Expand All @@ -71,7 +69,8 @@ static lto::Config createConfig(Ctx &ctx) {
if (ctx.arg.ltoBasicBlockSections == "all") {
c.Options.BBSections = BasicBlockSection::All;
} else if (ctx.arg.ltoBasicBlockSections == "labels") {
c.Options.BBSections = BasicBlockSection::Labels;
c.Options.BBAddrMap = true;
c.Options.BBSections = BasicBlockSection::None;
} else if (ctx.arg.ltoBasicBlockSections == "none") {
c.Options.BBSections = BasicBlockSection::None;
} else {
Expand All @@ -87,6 +86,8 @@ static lto::Config createConfig(Ctx &ctx) {
}
}

c.Options.BBAddrMap = ctx.arg.ltoBBAddrMap;

c.Options.UniqueBasicBlockSectionNames =
ctx.arg.ltoUniqueBasicBlockSectionNames;

Expand Down
2 changes: 1 addition & 1 deletion llvm/docs/CommandGuide/llvm-objdump.rst
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,7 @@ OPTIONS
When printing a PC-relative global symbol reference, print it as an offset from the leading symbol.

When a bb-address-map section is present (i.e., the object file is built with
``-fbasic-block-sections=labels``), labels are retrieved from that section
``-fbasic-block-address-map``), labels are retrieved from that section
instead. If a pgo-analysis-map is present alongside the bb-address-map, any
available analyses are printed after the relevant block label. By default,
any analysis with a special representation (i.e. BlockFrequency,
Expand Down
2 changes: 1 addition & 1 deletion llvm/docs/Extensions.rst
Original file line number Diff line number Diff line change
Expand Up @@ -401,7 +401,7 @@ the symbol that belongs to the partition. It may be constructed as follows:
This section stores the binary address of basic blocks along with other related
metadata. This information can be used to map binary profiles (like perf
profiles) directly to machine basic blocks.
This section is emitted with ``-basic-block-sections=labels`` and will contain
This section is emitted with ``-basic-block-address-map`` and will contain
a BB address map table for every function.

The ``SHT_LLVM_BB_ADDR_MAP`` type provides backward compatibility to allow
Expand Down
5 changes: 0 additions & 5 deletions llvm/include/llvm/CodeGen/MachineFunction.h
Original file line number Diff line number Diff line change
Expand Up @@ -699,11 +699,6 @@ class LLVM_ABI MachineFunction {
BBSectionsType == BasicBlockSection::Preset);
}

/// Returns true if basic block labels are to be generated for this function.
bool hasBBLabels() const {
return BBSectionsType == BasicBlockSection::Labels;
}

void setBBSectionsType(BasicBlockSection V) { BBSectionsType = V; }

/// Assign IsBeginSection IsEndSection fields for basic blocks in this
Expand Down
3 changes: 0 additions & 3 deletions llvm/include/llvm/Target/TargetOptions.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,9 +64,6 @@ namespace llvm {
List, // Get list of functions & BBs from a file. Selectively enables
// basic block sections for a subset of basic blocks which can be
// used to control object size bloats from creating sections.
Labels, // Do not use Basic Block Sections but label basic blocks. This
// is useful when associating profile counts from virtual addresses
// to basic blocks.
Preset, // Similar to list but the blocks are identified by passes which
// seek to use Basic Block Sections, e.g. MachineFunctionSplitter.
// This option cannot be set via the command line.
Expand Down
11 changes: 5 additions & 6 deletions llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1432,7 +1432,7 @@ void AsmPrinter::emitBBAddrMapSection(const MachineFunction &MF) {
OutStreamer->AddComment("BB id");
// Emit the BB ID for this basic block.
// We only emit BaseID since CloneID is unset for
// basic-block-sections=labels.
// -basic-block-adress-map.
// TODO: Emit the full BBID when labels and sections can be mixed
// together.
OutStreamer->emitULEB128IntValue(MBB.getBBID()->BaseID);
Expand Down Expand Up @@ -1866,7 +1866,7 @@ void AsmPrinter::emitFunctionBody() {
// We must emit temporary symbol for the end of this basic block, if either
// we have BBLabels enabled or if this basic blocks marks the end of a
// section.
if (MF->hasBBLabels() || MF->getTarget().Options.BBAddrMap ||
if (MF->getTarget().Options.BBAddrMap ||
(MAI->hasDotTypeDotSizeDirective() && MBB.isEndSection()))
OutStreamer->emitLabel(MBB.getEndSymbol());

Expand Down Expand Up @@ -2021,7 +2021,7 @@ void AsmPrinter::emitFunctionBody() {
// Emit section containing BB address offsets and their metadata, when
// BB labels are requested for this function. Skip empty functions.
if (HasAnyRealCode) {
if (MF->hasBBLabels() || MF->getTarget().Options.BBAddrMap)
if (MF->getTarget().Options.BBAddrMap)
emitBBAddrMapSection(*MF);
else if (PgoAnalysisMapFeatures.getBits() != 0)
MF->getContext().reportWarning(
Expand Down Expand Up @@ -2620,7 +2620,7 @@ void AsmPrinter::SetupMachineFunction(MachineFunction &MF) {
F.hasFnAttribute("xray-instruction-threshold") ||
needFuncLabels(MF, *this) || NeedsLocalForSize ||
MF.getTarget().Options.EmitStackSizeSection ||
MF.getTarget().Options.BBAddrMap || MF.hasBBLabels()) {
MF.getTarget().Options.BBAddrMap) {
CurrentFnBegin = createTempSymbol("func_begin");
if (NeedsLocalForSize)
CurrentFnSymForSize = CurrentFnBegin;
Expand Down Expand Up @@ -4155,8 +4155,7 @@ bool AsmPrinter::shouldEmitLabelForBasicBlock(
// With `-fbasic-block-sections=`, a label is needed for every non-entry block
// in the labels mode (option `=labels`) and every section beginning in the
// sections mode (`=all` and `=list=`).
if ((MF->hasBBLabels() || MF->getTarget().Options.BBAddrMap ||
MBB.isBeginSection()) &&
if ((MF->getTarget().Options.BBAddrMap || MBB.isBeginSection()) &&
!MBB.isEntryBlock())
return true;
// A label is needed for any block with at least one predecessor (when that
Expand Down
7 changes: 0 additions & 7 deletions llvm/lib/CodeGen/BasicBlockSections.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -311,11 +311,6 @@ bool BasicBlockSections::handleBBSections(MachineFunction &MF) {
// original layout positions and finding the original fallthroughs.
MF.RenumberBlocks();

if (BBSectionsType == BasicBlockSection::Labels) {
MF.setBBSectionsType(BBSectionsType);
return true;
}

DenseMap<UniqueBBID, BBClusterInfo> FuncClusterInfo;
if (BBSectionsType == BasicBlockSection::List) {
auto [HasProfile, ClusterInfo] =
Expand Down Expand Up @@ -382,8 +377,6 @@ bool BasicBlockSections::handleBBSections(MachineFunction &MF) {
// avoids the need to store basic block IDs in the BB address map section, since
// they can be determined implicitly.
bool BasicBlockSections::handleBBAddrMap(MachineFunction &MF) {
if (MF.getTarget().getBBSectionsType() == BasicBlockSection::Labels)
return false;
if (!MF.getTarget().Options.BBAddrMap)
return false;
MF.RenumberBlocks();
Expand Down
2 changes: 0 additions & 2 deletions llvm/lib/CodeGen/CommandFlags.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -525,8 +525,6 @@ llvm::BasicBlockSection
codegen::getBBSectionsMode(llvm::TargetOptions &Options) {
if (getBBSections() == "all")
return BasicBlockSection::All;
else if (getBBSections() == "labels")
return BasicBlockSection::Labels;
else if (getBBSections() == "none")
return BasicBlockSection::None;
else {
Expand Down
9 changes: 1 addition & 8 deletions llvm/lib/CodeGen/MIRParser/MIParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -780,7 +780,7 @@ bool MIParser::parseBasicBlockDefinition(
"' is not defined in the function '" +
MF.getName() + "'");
}
auto *MBB = MF.CreateMachineBasicBlock(BB);
auto *MBB = MF.CreateMachineBasicBlock(BB, BBID);
MF.insert(MF.end(), MBB);
bool WasInserted = MBBSlots.insert(std::make_pair(ID, MBB)).second;
if (!WasInserted)
Expand All @@ -799,13 +799,6 @@ bool MIParser::parseBasicBlockDefinition(
MBB->setSectionID(*SectionID);
MF.setBBSectionsType(BasicBlockSection::List);
}
if (BBID.has_value()) {
// BBSectionsType is set to `List` if any basic blocks has `SectionID`.
// Here, we set it to `Labels` if it hasn't been set above.
if (!MF.hasBBSections())
MF.setBBSectionsType(BasicBlockSection::Labels);
MBB->setBBID(BBID.value());
}
MBB->setCallFrameSize(CallFrameSize);
return false;
}
Expand Down
4 changes: 1 addition & 3 deletions llvm/lib/CodeGen/MIRParser/MIRParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -569,9 +569,7 @@ MIRParserImpl::initializeMachineFunction(const yaml::MachineFunction &YamlMF,
return true;
}
// Check Basic Block Section Flags.
if (MF.getTarget().getBBSectionsType() == BasicBlockSection::Labels) {
MF.setBBSectionsType(BasicBlockSection::Labels);
} else if (MF.hasBBSections()) {
if (MF.hasBBSections()) {
MF.assignBeginEndSections();
}
PFS.SM = &SM;
Expand Down
8 changes: 3 additions & 5 deletions llvm/lib/CodeGen/MachineFunction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -465,11 +465,9 @@ MachineFunction::CreateMachineBasicBlock(const BasicBlock *BB,
MachineBasicBlock *MBB =
new (BasicBlockRecycler.Allocate<MachineBasicBlock>(Allocator))
MachineBasicBlock(*this, BB);
// Set BBID for `-basic-block=sections=labels` and
// `-basic-block-sections=list` to allow robust mapping of profiles to basic
// blocks.
if (Target.getBBSectionsType() == BasicBlockSection::Labels ||
Target.Options.BBAddrMap ||
// Set BBID for `-basic-block-sections=list` and `-basic-block-address-map` to
// allow robust mapping of profiles to basic blocks.
if (Target.Options.BBAddrMap ||
Target.getBBSectionsType() == BasicBlockSection::List)
MBB->setBBID(BBID.has_value() ? *BBID : UniqueBBID{NextBBID++, 0});
return MBB;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
;; This test verifies that with -gc-empty-basic-blocks SHT_LLVM_BB_ADDR_MAP will not include entries for empty blocks.
; RUN: llc < %s -mtriple=x86_64 -O0 -basic-block-sections=labels -gc-empty-basic-blocks | FileCheck --check-prefix=CHECK %s
; RUN: llc < %s -mtriple=x86_64 -O0 -basic-block-address-map -gc-empty-basic-blocks | FileCheck --check-prefix=CHECK %s

define void @foo(i1 zeroext %0) nounwind {
br i1 %0, label %2, label %empty_block
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
;; Verify that the BB address map is not emitted for empty functions.
; RUN: llc < %s -mtriple=x86_64 -basic-block-sections=labels | FileCheck %s --check-prefixes=CHECK,BASIC
; RUN: llc < %s -mtriple=x86_64 -basic-block-sections=labels -pgo-analysis-map=func-entry-count,bb-freq | FileCheck %s --check-prefixes=CHECK,PGO
; RUN: llc < %s -mtriple=x86_64 -basic-block-address-map | FileCheck %s --check-prefixes=CHECK,BASIC
; RUN: llc < %s -mtriple=x86_64 -basic-block-address-map -pgo-analysis-map=func-entry-count,bb-freq | FileCheck %s --check-prefixes=CHECK,PGO

define void @empty_func() {
entry:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
; RUN: llc < %s -mtriple=x86_64 -function-sections -basic-block-sections=labels | FileCheck %s
; RUN: llc < %s -mtriple=x86_64 -function-sections -basic-block-address-map | FileCheck %s

$_Z4fooTIiET_v = comdat any
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Start after bbsections0-prepare and check that the BB address map is generated.
# RUN: llc -mtriple x86_64-unknown-linux-gnu -start-after=bbsections-prepare %s -o - | FileCheck %s -check-prefix=CHECK
# RUN: llc -mtriple x86_64-unknown-linux-gnu -start-after=bbsections-prepare -basic-block-address-map %s -o - | FileCheck %s -check-prefix=CHECK

# How to generate the input:
# foo.cc
Expand All @@ -9,7 +9,7 @@
# }
#
# clang -O0 -S -emit-llvm foo.cc
# llc < foo.ll -stop-after=bbsections-prepare -basic-block-sections=labels
# llc < foo.ll -stop-after=bbsections-prepare -basic-block-address-map

# CHECK: .section .llvm_bb_addr_map,"o",@llvm_bb_addr_map,.text
--- |
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
; Check the basic block sections labels option
; RUN: llc < %s -mtriple=x86_64 -function-sections -unique-section-names=true -basic-block-sections=labels | FileCheck %s --check-prefixes=CHECK,BASIC
; RUN: llc < %s -mtriple=x86_64 -function-sections -unique-section-names=true -basic-block-address-map | FileCheck %s --check-prefixes=CHECK,BASIC

;; Also verify this holds for all PGO features enabled
; RUN: llc < %s -mtriple=x86_64 -function-sections -unique-section-names=true -basic-block-sections=labels -pgo-analysis-map=func-entry-count,bb-freq,br-prob | FileCheck %s --check-prefixes=CHECK,PGO-ALL,PGO-FEC,PGO-BBF,PGO-BRP
; RUN: llc < %s -mtriple=x86_64 -function-sections -unique-section-names=true -basic-block-address-map -pgo-analysis-map=func-entry-count,bb-freq,br-prob | FileCheck %s --check-prefixes=CHECK,PGO-ALL,PGO-FEC,PGO-BBF,PGO-BRP

;; Also verify that pgo extension only includes the enabled feature
; RUN: llc < %s -mtriple=x86_64 -function-sections -unique-section-names=true -basic-block-sections=labels -pgo-analysis-map=func-entry-count | FileCheck %s --check-prefixes=CHECK,PGO-FEC,FEC-ONLY
; RUN: llc < %s -mtriple=x86_64 -function-sections -unique-section-names=true -basic-block-sections=labels -pgo-analysis-map=bb-freq | FileCheck %s --check-prefixes=CHECK,PGO-BBF,BBF-ONLY
; RUN: llc < %s -mtriple=x86_64 -function-sections -unique-section-names=true -basic-block-sections=labels -pgo-analysis-map=br-prob | FileCheck %s --check-prefixes=CHECK,PGO-BRP,BRP-ONLY
; RUN: llc < %s -mtriple=x86_64 -function-sections -unique-section-names=true -basic-block-address-map -pgo-analysis-map=func-entry-count | FileCheck %s --check-prefixes=CHECK,PGO-FEC,FEC-ONLY
; RUN: llc < %s -mtriple=x86_64 -function-sections -unique-section-names=true -basic-block-address-map -pgo-analysis-map=bb-freq | FileCheck %s --check-prefixes=CHECK,PGO-BBF,BBF-ONLY
; RUN: llc < %s -mtriple=x86_64 -function-sections -unique-section-names=true -basic-block-address-map -pgo-analysis-map=br-prob | FileCheck %s --check-prefixes=CHECK,PGO-BRP,BRP-ONLY


define void @_Z3bazb(i1 zeroext, i1 zeroext) personality ptr @__gxx_personality_v0 !prof !0 {
Expand Down
4 changes: 1 addition & 3 deletions llvm/test/CodeGen/X86/basic-block-address-map.ll
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
; Check the basic block sections labels option
; RUN: llc < %s -mtriple=x86_64 -function-sections -unique-section-names=true -basic-block-address-map | FileCheck %s --check-prefixes=CHECK,UNIQ
; RUN: llc < %s -mtriple=x86_64 -function-sections -unique-section-names=true -basic-block-sections=labels | FileCheck %s --check-prefixes=CHECK,UNIQ
; RUN: llc < %s -mtriple=x86_64 -function-sections -unique-section-names=false -basic-block-address-map | FileCheck %s --check-prefixes=CHECK,NOUNIQ
; RUN: llc < %s -mtriple=x86_64 -function-sections -unique-section-names=false -basic-block-sections=labels | FileCheck %s --check-prefixes=CHECK,NOUNIQ
; RUN: llc < %s -mtriple=x86_64 -function-sections -unique-section-names=true -basic-block-sections=labels -split-machine-functions | FileCheck %s --check-prefixes=CHECK,UNIQ
; RUN: llc < %s -mtriple=x86_64 -function-sections -unique-section-names=true -basic-block-address-map -split-machine-functions | FileCheck %s --check-prefixes=CHECK,UNIQ

define void @_Z3bazb(i1 zeroext, i1 zeroext) personality ptr @__gxx_personality_v0 {
br i1 %0, label %3, label %8
Expand Down
Loading

0 comments on commit 7b7747d

Please sign in to comment.