Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions lld/COFF/Driver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -492,6 +492,12 @@ void LinkerDriver::parseDirectives(InputFile *file) {
case OPT_alternatename:
file->symtab.parseAlternateName(arg->getValue());
break;
case OPT_arm64xsameaddress:
if (!file->symtab.isEC())
Warn(ctx) << arg->getSpelling()
<< " is not allowed in non-ARM64EC files (" << toString(file)
<< ")";
break;
case OPT_defaultlib:
if (std::optional<StringRef> path = findLibIfNew(arg->getValue()))
enqueuePath(*path, false, false);
Expand Down
3 changes: 3 additions & 0 deletions lld/COFF/Options.td
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ multiclass B_priv<string name> {
def align : P<"align", "Section alignment">;
def aligncomm : P<"aligncomm", "Set common symbol alignment">;
def alternatename : P<"alternatename", "Define weak alias">;
def arm64xsameaddress
: P<"arm64xsameaddress", "Generate a thunk for the symbol with the same "
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As the option is a no-op, would it be better if the option description made this clear for now? Do you plan on doing a full implementation of the option later, or is that deferred until there's an actual need for it?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, I have a draft of it, but I still need to work out a few details and finish it. I noticed that for other no-op options we use P_priv, so I switched to that with the intention of updating it alongside the actual implementation. Thanks!

"address in both native and EC views on ARM64X.">;
def base : P<"base", "Base address of the program">;
def color_diagnostics: Flag<["--"], "color-diagnostics">,
HelpText<"Alias for --color-diagnostics=always">;
Expand Down
56 changes: 56 additions & 0 deletions lld/test/COFF/arm64x-sameaddress.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
REQUIRES: aarch64
RUN: split-file %s %t.dir && cd %t.dir

RUN: llvm-mc -filetype=obj -triple=arm64ec-windows func-arm64ec.s -o func-arm64ec.obj
RUN: llvm-mc -filetype=obj -triple=aarch64-windows func-arm64.s -o func-arm64.obj
RUN: llvm-mc -filetype=obj -triple=arm64ec-windows drectve.s -o drectve.obj
RUN: llvm-mc -filetype=obj -triple=aarch64-windows drectve.s -o drectve-arm64.obj
RUN: llvm-mc -filetype=obj -triple=arm64ec-windows %S/Inputs/loadconfig-arm64ec.s -o loadconfig-arm64ec.obj
RUN: llvm-mc -filetype=obj -triple=aarch64-windows %S/Inputs/loadconfig-arm64.s -o loadconfig-arm64.obj

RUN: lld-link -machine:arm64x -dll -noentry -out:out.dll loadconfig-arm64.obj loadconfig-arm64ec.obj \
RUN: func-arm64.obj func-arm64ec.obj drectve.obj

RUN: lld-link -machine:arm64x -dll -noentry -out:out-cmd.dll loadconfig-arm64.obj loadconfig-arm64ec.obj \
RUN: func-arm64.obj func-arm64ec.obj -arm64xsameaddress:func

RUN: lld-link -machine:arm64ec -dll -noentry -out:out-ec.dll loadconfig-arm64ec.obj func-arm64ec.obj drectve.obj

RUN: lld-link -machine:arm64x -dll -noentry -out:out-warn.dll loadconfig-arm64.obj loadconfig-arm64ec.obj \
RUN: func-arm64.obj func-arm64ec.obj drectve-arm64.obj 2>&1 | FileCheck --check-prefix=WARN %s
WARN: lld-link: warning: -arm64xsameaddress: is not allowed in non-ARM64EC files (drectve-arm64.obj)

#--- func-arm64.s
.section .text,"xr",discard,func
.globl func
func:
mov x0, #1
ret

#--- func-arm64ec.s
.section .text,"xr",discard,"#func"
.globl "#func"
"#func":
mov x0, #2
ret

.weak_anti_dep func
.set func,"#func"

.section .wowthk,"xr",discard,entry_thunk
.globl entry_thunk
entry_thunk:
mov x0, #3
ret

.section .test,"dr"
.rva func

.section .hybmp$x,"yi"
.symidx "#func"
.symidx entry_thunk
.word 1

#--- drectve.s
.section .drectve, "yn"
.ascii " -arm64xsameaddress:func"