Skip to content

Commit 74cdfec

Browse files
cjacekSquallATF
authored andcommitted
[LLD][COFF] Support -aligncomm directives on ARM64X (llvm#129513)
1 parent 57eb50c commit 74cdfec

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))
@@ -2699,25 +2699,27 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
26992699
writeDefFile(ctx, arg->getValue(), mainSymtab.exports);
27002700

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

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

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

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

27222724
// Windows specific -- Create an embedded or side-by-side manifest.
27232725
// /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
@@ -1336,6 +1336,21 @@ void SymbolTable::parseAlternateName(StringRef s) {
13361336
alternateNames.insert(it, std::make_pair(from, to));
13371337
}
13381338

1339+
// Parses /aligncomm option argument.
1340+
void SymbolTable::parseAligncomm(StringRef s) {
1341+
auto [name, align] = s.split(',');
1342+
if (name.empty() || align.empty()) {
1343+
Err(ctx) << "/aligncomm: invalid argument: " << s;
1344+
return;
1345+
}
1346+
int v;
1347+
if (align.getAsInteger(0, v)) {
1348+
Err(ctx) << "/aligncomm: invalid argument: " << s;
1349+
return;
1350+
}
1351+
alignComm[std::string(name)] = std::max(alignComm[std::string(name)], 1 << v);
1352+
}
1353+
13391354
Symbol *SymbolTable::addUndefined(StringRef name) {
13401355
return addUndefined(name, nullptr, false);
13411356
}

lld/COFF/SymbolTable.h

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

174+
// Used for /aligncomm.
175+
std::map<std::string, int> alignComm;
176+
174177
void fixupExports();
175178
void assignExportOrdinals();
176179
void parseModuleDefs(StringRef path);
177180
void parseAlternateName(StringRef);
181+
void parseAligncomm(StringRef);
178182

179183
// Iterates symbols in non-determinstic hash table order.
180184
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 10200000 18200000 20200000 28200000
10+
11+
.data
12+
.word 0
13+
14+
.section .test,"dr"
15+
.rva sym
16+
.rva sym2
17+
.comm sym,4,4
18+
.comm sym2,4,3

0 commit comments

Comments
 (0)