Skip to content

Commit 4d4ec95

Browse files
SC llvm teamSC llvm team
authored andcommitted
Merged main:cf670d5e56d1 into amd-gfx:917468d90022
Local branch amd-gfx 917468d Merged main:122064a6303e into amd-gfx:ba5461f13b4c Remote branch main cf670d5 [flang][openacc] Accept scalar integer expression in the if clause (llvm#69381)
2 parents 917468d + cf670d5 commit 4d4ec95

File tree

64 files changed

+1315
-604
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+1315
-604
lines changed

flang/docs/OpenACC.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,5 @@ local:
2121
* `!$acc end loop` does not trigger a parsing error and is just ignored.
2222
* The restriction on `!$acc data` required clauses is emitted as a portability
2323
warning instead of an error as other compiler accepts it.
24+
* The `if` clause accepts scalar integer expression in addition to scalar
25+
logical expression.

flang/lib/Semantics/check-acc-structure.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,6 @@ CHECK_SIMPLE_CLAUSE(DeviceNum, ACCC_device_num)
376376
CHECK_SIMPLE_CLAUSE(Finalize, ACCC_finalize)
377377
CHECK_SIMPLE_CLAUSE(Firstprivate, ACCC_firstprivate)
378378
CHECK_SIMPLE_CLAUSE(Host, ACCC_host)
379-
CHECK_SIMPLE_CLAUSE(If, ACCC_if)
380379
CHECK_SIMPLE_CLAUSE(IfPresent, ACCC_if_present)
381380
CHECK_SIMPLE_CLAUSE(Independent, ACCC_independent)
382381
CHECK_SIMPLE_CLAUSE(NoCreate, ACCC_no_create)
@@ -660,6 +659,20 @@ void AccStructureChecker::Enter(const parser::AccClause::Link &x) {
660659
CheckMultipleOccurrenceInDeclare(x.v, llvm::acc::Clause::ACCC_link);
661660
}
662661

662+
void AccStructureChecker::Enter(const parser::AccClause::If &x) {
663+
CheckAllowed(llvm::acc::Clause::ACCC_if);
664+
if (const auto *expr{GetExpr(x.v)}) {
665+
if (auto type{expr->GetType()}) {
666+
if (type->category() == TypeCategory::Integer ||
667+
type->category() == TypeCategory::Logical) {
668+
return; // LOGICAL and INTEGER type supported for the if clause.
669+
}
670+
}
671+
}
672+
context_.Say(
673+
GetContext().clauseSource, "Must have LOGICAL or INTEGER type"_err_en_US);
674+
}
675+
663676
void AccStructureChecker::Enter(const parser::Module &) {
664677
declareSymbols.clear();
665678
}

flang/test/Fir/invalid.fir

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -690,7 +690,7 @@ func.func @bad_array_modify(%arr1 : !fir.ref<!fir.array<?x?xf32>>, %m : index, %
690690
func.func @slice_must_be_integral() {
691691
%0 = arith.constant 42 : i32
692692
%1 = fir.field_index field, !fir.type<t(param:i32){field:i32}> (%0 : i32)
693-
// expected-error@+1 {{'fir.slice' op operand #0 must be any integer, but got '!fir.field'}}
693+
// expected-error@+1 {{'fir.slice' op operand #0 must be variadic of any integer, but got '!fir.field'}}
694694
%2 = fir.slice %1, %1, %1 : (!fir.field, !fir.field, !fir.field) -> !fir.slice<1>
695695
return
696696
}

flang/test/HLFIR/invalid.fir

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -267,15 +267,15 @@ func.func @bad_concat(%arg0: !fir.ref<!fir.char<1,10>>, %arg1: !fir.ref<!fir.cha
267267
// -----
268268
func.func @bad_concat_2(%arg0: !fir.ref<!fir.array<100x!fir.char<1,10>>>, %arg1: !fir.ref<!fir.array<100x!fir.char<1,20>>>) {
269269
%c30 = arith.constant 30 : index
270-
// expected-error@+1 {{'hlfir.concat' op operand #0 must be any character scalar type, but got '!fir.ref<!fir.array<100x!fir.char<1,10>>>'}}
270+
// expected-error@+1 {{'hlfir.concat' op operand #0 must be variadic of any character scalar type, but got '!fir.ref<!fir.array<100x!fir.char<1,10>>>'}}
271271
%0 = hlfir.concat %arg0, %arg1 len %c30 : (!fir.ref<!fir.array<100x!fir.char<1,10>>>, !fir.ref<!fir.array<100x!fir.char<1,20>>>, index) -> (!hlfir.expr<100x!fir.char<1,30>>)
272272
return
273273
}
274274

275275
// -----
276276
func.func @bad_concat_3(%arg0: !fir.ref<!fir.char<1,10>>, %arg1: !fir.ref<i32>) {
277277
%c30 = arith.constant 30 : index
278-
// expected-error@+1 {{'hlfir.concat' op operand #1 must be any character scalar type, but got '!fir.ref<i32>'}}
278+
// expected-error@+1 {{'hlfir.concat' op operand #1 must be variadic of any character scalar type, but got '!fir.ref<i32>'}}
279279
%0 = hlfir.concat %arg0, %arg1 len %c30 : (!fir.ref<!fir.char<1,10>>, !fir.ref<i32>, index) -> (!hlfir.expr<!fir.char<1,30>>)
280280
return
281281
}

flang/test/Lower/OpenACC/acc-init.f90

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
subroutine acc_init
77
logical :: ifCondition = .TRUE.
8+
integer :: ifInt = 1
89

910
!$acc init
1011
!CHECK: acc.init{{ *}}{{$}}
@@ -28,4 +29,9 @@ subroutine acc_init
2829
!CHECK: [[DEVTYPE2:%.*]] = arith.constant 2 : i32
2930
!CHECK: acc.init device_type([[DEVTYPE1]], [[DEVTYPE2]] : i32, i32) device_num([[DEVNUM]] : i32){{$}}
3031

32+
!$acc init if(ifInt)
33+
!CHECK: %[[IFINT:.*]] = fir.load %{{.*}} : !fir.ref<i32>
34+
!CHECK: %[[CONV:.*]] = fir.convert %[[IFINT]] : (i32) -> i1
35+
!CHECK: acc.init if(%[[CONV]])
36+
3137
end subroutine acc_init

flang/test/Semantics/OpenACC/acc-init-validity.f90

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,14 @@ program openacc_init_validity
1010
integer :: i, j
1111
integer, parameter :: N = 256
1212
logical :: ifCondition = .TRUE.
13+
integer :: ifInt
14+
real :: ifReal
1315
real(8), dimension(N) :: a
1416

1517
!$acc init
1618
!$acc init if(.TRUE.)
1719
!$acc init if(ifCondition)
20+
!$acc init if(ifInt)
1821
!$acc init device_num(1)
1922
!$acc init device_num(i)
2023
!$acc init device_type(i)
@@ -93,4 +96,7 @@ program openacc_init_validity
9396
!ERROR: At most one DEVICE_TYPE clause can appear on the INIT directive
9497
!$acc init device_type(2) device_type(i, j)
9598

99+
!ERROR: Must have LOGICAL or INTEGER type
100+
!$acc init if(ifReal)
101+
96102
end program openacc_init_validity

lld/ELF/Driver.cpp

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2248,24 +2248,6 @@ static void replaceCommonSymbols() {
22482248
}
22492249
}
22502250

2251-
// If all references to a DSO happen to be weak, the DSO is not added to
2252-
// DT_NEEDED. If that happens, replace ShardSymbol with Undefined to avoid
2253-
// dangling references to an unneeded DSO. Use a weak binding to avoid
2254-
// --no-allow-shlib-undefined diagnostics. Similarly, demote lazy symbols.
2255-
static void demoteSharedAndLazySymbols() {
2256-
llvm::TimeTraceScope timeScope("Demote shared and lazy symbols");
2257-
for (Symbol *sym : symtab.getSymbols()) {
2258-
auto *s = dyn_cast<SharedSymbol>(sym);
2259-
if (!(s && !cast<SharedFile>(s->file)->isNeeded) && !sym->isLazy())
2260-
continue;
2261-
2262-
uint8_t binding = sym->isLazy() ? sym->binding : uint8_t(STB_WEAK);
2263-
Undefined(nullptr, sym->getName(), binding, sym->stOther, sym->type)
2264-
.overwrite(*sym);
2265-
sym->versionId = VER_NDX_GLOBAL;
2266-
}
2267-
}
2268-
22692251
// The section referred to by `s` is considered address-significant. Set the
22702252
// keepUnique flag on the section if appropriate.
22712253
static void markAddrsig(Symbol *s) {
@@ -3023,7 +3005,6 @@ void LinkerDriver::link(opt::InputArgList &args) {
30233005

30243006
// Garbage collection and removal of shared symbols from unused shared objects.
30253007
invokeELFT(markLive,);
3026-
demoteSharedAndLazySymbols();
30273008

30283009
// Make copies of any input sections that need to be copied into each
30293010
// partition.

lld/ELF/LinkerScript.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -613,6 +613,7 @@ void LinkerScript::processSectionCommands() {
613613
discard(*s);
614614
discardSynthetic(*osec);
615615
osec->commands.clear();
616+
seenDiscard = true;
616617
return false;
617618
}
618619

lld/ELF/LinkerScript.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,7 @@ class LinkerScript final {
356356

357357
bool hasSectionsCommand = false;
358358
bool seenDataAlign = false;
359+
bool seenDiscard = false;
359360
bool seenRelroEnd = false;
360361
bool errorOnMissingSection = false;
361362
std::string backwardDotErr;

lld/ELF/MapFile.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ static void writeCref(raw_fd_ostream &os) {
229229
if (isa<SharedSymbol>(sym))
230230
map[sym].insert(file);
231231
if (auto *d = dyn_cast<Defined>(sym))
232-
if (!d->isLocal() && (!d->section || d->section->isLive()))
232+
if (!d->isLocal())
233233
map[d].insert(file);
234234
}
235235
}

lld/ELF/Relocations.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -507,8 +507,7 @@ int64_t RelocationScanner::computeMipsAddend(const RelTy &rel, RelExpr expr,
507507
template <class ELFT>
508508
static std::string maybeReportDiscarded(Undefined &sym) {
509509
auto *file = dyn_cast_or_null<ObjFile<ELFT>>(sym.file);
510-
if (!file || !sym.discardedSecIdx ||
511-
file->getSections()[sym.discardedSecIdx] != &InputSection::discarded)
510+
if (!file || !sym.discardedSecIdx)
512511
return "";
513512
ArrayRef<typename ELFT::Shdr> objSections =
514513
file->template getELFShdrs<ELFT>();
@@ -1575,7 +1574,8 @@ template <class ELFT> void elf::scanRelocations() {
15751574
scanner.template scanSection<ELFT>(*sec);
15761575
if (part.armExidx && part.armExidx->isLive())
15771576
for (InputSection *sec : part.armExidx->exidxSections)
1578-
scanner.template scanSection<ELFT>(*sec);
1577+
if (sec->isLive())
1578+
scanner.template scanSection<ELFT>(*sec);
15791579
}
15801580
});
15811581
}

lld/ELF/Symbols.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -316,12 +316,13 @@ void elf::maybeWarnUnorderableSymbol(const Symbol *sym) {
316316
if (!config->warnSymbolOrdering)
317317
return;
318318

319-
// If UnresolvedPolicy::Ignore is used, no "undefined symbol" error/warning
320-
// is emitted. It makes sense to not warn on undefined symbols.
319+
// If UnresolvedPolicy::Ignore is used, no "undefined symbol" error/warning is
320+
// emitted. It makes sense to not warn on undefined symbols (excluding those
321+
// demoted by demoteSymbols).
321322
//
322323
// Note, ld.bfd --symbol-ordering-file= does not warn on undefined symbols,
323324
// but we don't have to be compatible here.
324-
if (sym->isUndefined() &&
325+
if (sym->isUndefined() && !cast<Undefined>(sym)->discardedSecIdx &&
325326
config->unresolvedSymbols == UnresolvedPolicy::Ignore)
326327
return;
327328

@@ -330,9 +331,12 @@ void elf::maybeWarnUnorderableSymbol(const Symbol *sym) {
330331

331332
auto report = [&](StringRef s) { warn(toString(file) + s + sym->getName()); };
332333

333-
if (sym->isUndefined())
334-
report(": unable to order undefined symbol: ");
335-
else if (sym->isShared())
334+
if (sym->isUndefined()) {
335+
if (cast<Undefined>(sym)->discardedSecIdx)
336+
report(": unable to order discarded symbol: ");
337+
else
338+
report(": unable to order undefined symbol: ");
339+
} else if (sym->isShared())
336340
report(": unable to order shared symbol: ");
337341
else if (d && !d->section)
338342
report(": unable to order absolute symbol: ");

lld/ELF/Writer.cpp

Lines changed: 61 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,59 @@ void elf::addReservedSymbols() {
251251
ElfSym::edata2 = add("_edata", -1);
252252
}
253253

254+
static void demoteDefined(Defined &sym, DenseMap<SectionBase *, size_t> &map) {
255+
if (map.empty())
256+
for (auto [i, sec] : llvm::enumerate(sym.file->getSections()))
257+
map.try_emplace(sec, i);
258+
// Change WEAK to GLOBAL so that if a scanned relocation references sym,
259+
// maybeReportUndefined will report an error.
260+
uint8_t binding = sym.isWeak() ? uint8_t(STB_GLOBAL) : sym.binding;
261+
Undefined(sym.file, sym.getName(), binding, sym.stOther, sym.type,
262+
/*discardedSecIdx=*/map.lookup(sym.section))
263+
.overwrite(sym);
264+
}
265+
266+
// If all references to a DSO happen to be weak, the DSO is not added to
267+
// DT_NEEDED. If that happens, replace ShardSymbol with Undefined to avoid
268+
// dangling references to an unneeded DSO. Use a weak binding to avoid
269+
// --no-allow-shlib-undefined diagnostics. Similarly, demote lazy symbols.
270+
//
271+
// In addition, demote symbols defined in discarded sections, so that
272+
// references to /DISCARD/ discarded symbols will lead to errors.
273+
static void demoteSymbolsAndComputeIsPreemptible() {
274+
llvm::TimeTraceScope timeScope("Demote symbols");
275+
DenseMap<InputFile *, DenseMap<SectionBase *, size_t>> sectionIndexMap;
276+
for (Symbol *sym : symtab.getSymbols()) {
277+
if (auto *d = dyn_cast<Defined>(sym)) {
278+
if (d->section && !d->section->isLive())
279+
demoteDefined(*d, sectionIndexMap[d->file]);
280+
} else {
281+
auto *s = dyn_cast<SharedSymbol>(sym);
282+
if (sym->isLazy() || (s && !cast<SharedFile>(s->file)->isNeeded)) {
283+
uint8_t binding = sym->isLazy() ? sym->binding : uint8_t(STB_WEAK);
284+
Undefined(nullptr, sym->getName(), binding, sym->stOther, sym->type)
285+
.overwrite(*sym);
286+
sym->versionId = VER_NDX_GLOBAL;
287+
}
288+
}
289+
290+
if (config->hasDynSymTab)
291+
sym->isPreemptible = computeIsPreemptible(*sym);
292+
}
293+
}
294+
295+
static void demoteLocalSymbolsInDiscardedSections() {
296+
llvm::TimeTraceScope timeScope("Demote local symbols");
297+
parallelForEach(ctx.objectFiles, [&](ELFFileBase *file) {
298+
DenseMap<SectionBase *, size_t> sectionIndexMap;
299+
for (Symbol *sym : file->getLocalSymbols()) {
300+
Defined *d = dyn_cast<Defined>(sym);
301+
if (d && d->section && !d->section->isLive())
302+
demoteDefined(*d, sectionIndexMap);
303+
}
304+
});
305+
}
306+
254307
// Fully static executables don't support MTE globals at this point in time, as
255308
// we currently rely on:
256309
// - A dynamic loader to process relocations, and
@@ -1935,14 +1988,16 @@ template <class ELFT> void Writer<ELFT>::finalizeSections() {
19351988
for (Partition &part : partitions)
19361989
finalizeSynthetic(part.ehFrame.get());
19371990
}
1938-
1939-
if (config->hasDynSymTab) {
1940-
parallelForEach(symtab.getSymbols(), [](Symbol *sym) {
1941-
sym->isPreemptible = computeIsPreemptible(*sym);
1942-
});
1943-
}
19441991
}
19451992

1993+
demoteSymbolsAndComputeIsPreemptible();
1994+
// Also demote local symbols defined relative to discarded input sections so
1995+
// that relocations referencing them will lead to errors. To avoid unneeded
1996+
// work, we only do this when /DISCARD/ is seen, but this demotation also
1997+
// applies to --gc-sections discarded sections.
1998+
if (script->seenDiscard)
1999+
demoteLocalSymbolsInDiscardedSections();
2000+
19462001
// Change values of linker-script-defined symbols from placeholders (assigned
19472002
// by declareSymbols) to actual definitions.
19482003
script->processSymbolAssignments();

lld/test/ELF/gc-sections-tls.s

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@
77

88
# ERR: error: {{.*}}.o has an STT_TLS symbol but doesn't have an SHF_TLS section
99

10+
## TODO As a corner case, when /DISCARD/ is present, demoteLocalSymbolsInDiscardedSections
11+
## demotes tls and the error is not triggered.
12+
# RUN: echo 'SECTIONS { /DISCARD/ : {} }' > %t.lds
13+
# RUN: ld.lld %t.o --gc-sections -T %t.lds -o /dev/null
14+
1015
## If we happen to have a PT_TLS, we will resolve the relocation to
1116
## an arbitrary value (current implementation uses a negative value).
1217
# RUN: echo '.section .tbss,"awT"; .globl root; root: .long 0' | \
@@ -17,6 +22,9 @@
1722
# CHECK: Hex dump of section '.noalloc':
1823
# CHECK-NEXT: 0x00000000 {{[0-9a-f]+}} ffffffff
1924

25+
.globl _start
26+
_start:
27+
2028
.section .tbss,"awT",@nobits
2129
tls:
2230
.long 0

lld/test/ELF/linkerscript/discard-section.s

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,55 @@
44
# RUN: rm -rf %t && split-file %s %t && cd %t
55
# RUN: llvm-mc -filetype=obj -triple=x86_64 a.s -o a.o
66
# RUN: llvm-mc -filetype=obj -triple=x86_64 b.s -o b.o
7-
# RUN: ld.lld -T a.lds a.o b.o -z undefs -o /dev/null 2>&1 | count 0
8-
# RUN: ld.lld -T a.lds a.o b.o -o /dev/null 2>&1 | count 0
9-
# RUN: ld.lld -r -T a.lds a.o b.o -o a.ro 2>&1 | count 0
7+
# RUN: not ld.lld --threads=1 -T a.lds a.o b.o -z undefs -o /dev/null 2>&1 | FileCheck %s --check-prefix=LOCAL --implicit-check-not=error:
8+
# RUN: not ld.lld --threads=1 -T a.lds a.o b.o -o /dev/null 2>&1 | FileCheck %s --check-prefixes=LOCAL,NONLOCAL --implicit-check-not=error:
9+
# RUN: ld.lld -r -T a.lds a.o b.o -o a.ro 2>&1 | FileCheck %s --check-prefix=WARNING --implicit-check-not=warning:
1010
# RUN: llvm-readelf -r -s a.ro | FileCheck %s --check-prefix=RELOC
1111

12+
# LOCAL: error: relocation refers to a discarded section: .aaa
13+
# LOCAL-NEXT: >>> defined in a.o
14+
# LOCAL-NEXT: >>> referenced by a.o:(.bbb+0x0)
15+
16+
# NONLOCAL: error: relocation refers to a symbol in a discarded section: global
17+
# NONLOCAL-NEXT: >>> defined in a.o
18+
# NONLOCAL-NEXT: >>> referenced by b.o:(.data+0x0)
19+
20+
# NONLOCAL: error: relocation refers to a symbol in a discarded section: weak
21+
# NONLOCAL-NEXT: >>> defined in a.o
22+
# NONLOCAL-NEXT: >>> referenced by b.o:(.data+0x8)
23+
24+
# NONLOCAL: error: relocation refers to a symbol in a discarded section: weakref1
25+
# NONLOCAL-NEXT: >>> defined in a.o
26+
# NONLOCAL-NEXT: >>> referenced by b.o:(.data+0x10)
27+
28+
# NONLOCAL: error: relocation refers to a symbol in a discarded section: weakref2
29+
# NONLOCAL-NEXT: >>> defined in a.o
30+
# NONLOCAL-NEXT: >>> referenced by b.o:(.data+0x18)
31+
32+
# WARNING: warning: relocation refers to a discarded section: .aaa
33+
# WARNING-NEXT: >>> referenced by a.o:(.rela.bbb+0x0)
34+
1235
# RELOC: Relocation section '.rela.bbb' at offset {{.*}} contains 1 entries:
1336
# RELOC-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
1437
# RELOC-NEXT: 0000000000000000 0000000000000000 R_X86_64_NONE 0
1538
# RELOC-EMPTY:
1639
# RELOC-NEXT: Relocation section '.rela.data' at offset {{.*}} contains 4 entries:
1740
# RELOC-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
18-
# RELOC-NEXT: 0000000000000000 0000000000000001 R_X86_64_64 0
19-
# RELOC-NEXT: 0000000000000008 0000000000000001 R_X86_64_64 0
20-
# RELOC-NEXT: 0000000000000010 0000000000000001 R_X86_64_64 0
21-
# RELOC-NEXT: 0000000000000018 0000000000000001 R_X86_64_64 0
41+
# RELOC-NEXT: 0000000000000000 0000000500000001 R_X86_64_64 0000000000000000 global + 0
42+
# RELOC-NEXT: 0000000000000008 0000000700000001 R_X86_64_64 0000000000000000 weak + 0
43+
# RELOC-NEXT: 0000000000000010 0000000600000001 R_X86_64_64 0000000000000000 weakref1 + 0
44+
# RELOC-NEXT: 0000000000000018 0000000800000001 R_X86_64_64 0000000000000000 weakref2 + 0
2245

2346
# RELOC: Num: Value Size Type Bind Vis Ndx Name
2447
# RELOC-NEXT: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
2548
# RELOC-NEXT: 1: 0000000000000000 0 SECTION LOCAL DEFAULT 1 .text
2649
# RELOC-NEXT: 2: 0000000000000000 0 SECTION LOCAL DEFAULT 2 .bbb
2750
# RELOC-NEXT: 3: 0000000000000000 0 SECTION LOCAL DEFAULT 4 .data
2851
# RELOC-NEXT: 4: 0000000000000000 0 NOTYPE GLOBAL DEFAULT 1 _start
52+
# RELOC-NEXT: 5: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND global
53+
# RELOC-NEXT: 6: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND weakref1
54+
# RELOC-NEXT: 7: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND weak
55+
# RELOC-NEXT: 8: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND weakref2
2956
# RELOC-EMPTY:
3057

3158
#--- a.s

0 commit comments

Comments
 (0)