Skip to content

Commit 396d0e7

Browse files
committed
[LLD][COFF] Support -aligncomm directives on ARM64X
1 parent 4460766 commit 396d0e7

File tree

7 files changed

+57
-38
lines changed

7 files changed

+57
-38
lines changed

lld/COFF/Config.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -214,9 +214,6 @@ struct Configuration {
214214
// used for /dwodir
215215
StringRef dwoDir;
216216

217-
// Used for /aligncomm.
218-
std::map<std::string, int> alignComm;
219-
220217
// Used for /failifmismatch.
221218
std::map<StringRef, std::pair<StringRef, InputFile *>> mustMatch;
222219

lld/COFF/Driver.cpp

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -487,7 +487,7 @@ void LinkerDriver::parseDirectives(InputFile *file) {
487487
for (auto *arg : directives.args) {
488488
switch (arg->getOption().getID()) {
489489
case OPT_aligncomm:
490-
parseAligncomm(arg->getValue());
490+
file->symtab.parseAligncomm(arg->getValue());
491491
break;
492492
case OPT_alternatename:
493493
file->symtab.parseAlternateName(arg->getValue());
@@ -2050,7 +2050,7 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
20502050

20512051
// Handle /aligncomm
20522052
for (auto *arg : args.filtered(OPT_aligncomm))
2053-
parseAligncomm(arg->getValue());
2053+
mainSymtab.parseAligncomm(arg->getValue());
20542054

20552055
// Handle /manifestdependency.
20562056
for (auto *arg : args.filtered(OPT_manifestdependency))
@@ -2700,25 +2700,27 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
27002700
writeDefFile(ctx, arg->getValue(), mainSymtab.exports);
27012701

27022702
// Set extra alignment for .comm symbols
2703-
for (auto pair : config->alignComm) {
2704-
StringRef name = pair.first;
2705-
uint32_t alignment = pair.second;
2703+
ctx.forEachSymtab([&](SymbolTable &symtab) {
2704+
for (auto pair : symtab.alignComm) {
2705+
StringRef name = pair.first;
2706+
uint32_t alignment = pair.second;
27062707

2707-
Symbol *sym = ctx.symtab.find(name);
2708-
if (!sym) {
2709-
Warn(ctx) << "/aligncomm symbol " << name << " not found";
2710-
continue;
2711-
}
2708+
Symbol *sym = symtab.find(name);
2709+
if (!sym) {
2710+
Warn(ctx) << "/aligncomm symbol " << name << " not found";
2711+
continue;
2712+
}
27122713

2713-
// If the symbol isn't common, it must have been replaced with a regular
2714-
// symbol, which will carry its own alignment.
2715-
auto *dc = dyn_cast<DefinedCommon>(sym);
2716-
if (!dc)
2717-
continue;
2714+
// If the symbol isn't common, it must have been replaced with a regular
2715+
// symbol, which will carry its own alignment.
2716+
auto *dc = dyn_cast<DefinedCommon>(sym);
2717+
if (!dc)
2718+
continue;
27182719

2719-
CommonChunk *c = dc->getChunk();
2720-
c->setAlignment(std::max(c->getAlignment(), alignment));
2721-
}
2720+
CommonChunk *c = dc->getChunk();
2721+
c->setAlignment(std::max(c->getAlignment(), alignment));
2722+
}
2723+
});
27222724

27232725
// Windows specific -- Create an embedded or side-by-side manifest.
27242726
// /manifestdependency: enables /manifest unless an explicit /manifest:no is

lld/COFF/Driver.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,6 @@ class LinkerDriver {
212212
void parseMerge(StringRef);
213213
void parsePDBPageSize(StringRef);
214214
void parseSection(StringRef);
215-
void parseAligncomm(StringRef);
216215

217216
// Parses a MS-DOS stub file
218217
void parseDosStub(StringRef path);

lld/COFF/DriverUtils.cpp

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -218,22 +218,6 @@ void LinkerDriver::parseSection(StringRef s) {
218218
ctx.config.section[name] = parseSectionAttributes(ctx, attrs);
219219
}
220220

221-
// Parses /aligncomm option argument.
222-
void LinkerDriver::parseAligncomm(StringRef s) {
223-
auto [name, align] = s.split(',');
224-
if (name.empty() || align.empty()) {
225-
Err(ctx) << "/aligncomm: invalid argument: " << s;
226-
return;
227-
}
228-
int v;
229-
if (align.getAsInteger(0, v)) {
230-
Err(ctx) << "/aligncomm: invalid argument: " << s;
231-
return;
232-
}
233-
ctx.config.alignComm[std::string(name)] =
234-
std::max(ctx.config.alignComm[std::string(name)], 1 << v);
235-
}
236-
237221
void LinkerDriver::parseDosStub(StringRef path) {
238222
std::unique_ptr<MemoryBuffer> stub =
239223
CHECK(MemoryBuffer::getFile(path), "could not open " + path);

lld/COFF/SymbolTable.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1331,6 +1331,21 @@ void SymbolTable::parseAlternateName(StringRef s) {
13311331
alternateNames.insert(it, std::make_pair(from, to));
13321332
}
13331333

1334+
// Parses /aligncomm option argument.
1335+
void SymbolTable::parseAligncomm(StringRef s) {
1336+
auto [name, align] = s.split(',');
1337+
if (name.empty() || align.empty()) {
1338+
Err(ctx) << "/aligncomm: invalid argument: " << s;
1339+
return;
1340+
}
1341+
int v;
1342+
if (align.getAsInteger(0, v)) {
1343+
Err(ctx) << "/aligncomm: invalid argument: " << s;
1344+
return;
1345+
}
1346+
alignComm[std::string(name)] = std::max(alignComm[std::string(name)], 1 << v);
1347+
}
1348+
13341349
Symbol *SymbolTable::addUndefined(StringRef name) {
13351350
return addUndefined(name, nullptr, false);
13361351
}

lld/COFF/SymbolTable.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,10 +174,14 @@ class SymbolTable {
174174
// Used for /alternatename.
175175
std::map<StringRef, StringRef> alternateNames;
176176

177+
// Used for /aligncomm.
178+
std::map<std::string, int> alignComm;
179+
177180
void fixupExports();
178181
void assignExportOrdinals();
179182
void parseModuleDefs(StringRef path);
180183
void parseAlternateName(StringRef);
184+
void parseAligncomm(StringRef);
181185

182186
// Iterates symbols in non-determinstic hash table order.
183187
template <typename T> void forEachSymbol(T callback) {

lld/test/COFF/arm64x-comm.s

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// REQUIRES: aarch64
2+
3+
// Check that -aligncomm applies to both native and EC symbols.
4+
5+
// RUN: llvm-mc -filetype=obj -triple=aarch64-windows-gnu %s -o %t-arm64.obj
6+
// RUN: llvm-mc -filetype=obj -triple=arm64ec-windows-gnu %s -o %t-arm64ec.obj
7+
// RUN: lld-link -machine:arm64x -lldmingw -dll -noentry -out:%t.dll %t-arm64.obj %t-arm64ec.obj
8+
// RUN: llvm-readobj --hex-dump=.test %t.dll | FileCheck %s
9+
// CHECK: 0x180004000 08200000 10200000 18200000 20200000
10+
11+
.data
12+
.word 0
13+
14+
.section .test,"dr"
15+
.rva sym
16+
.rva sym2
17+
.comm sym,4,3
18+
.comm sym2,4,4

0 commit comments

Comments
 (0)