[ELF] Fix split-stack caller with hidden non-split-stack callee
authorFangrui Song <i@maskray.me>
Wed, 19 Jan 2022 20:25:01 +0000 (12:25 -0800)
committerFangrui Song <i@maskray.me>
Wed, 19 Jan 2022 20:25:01 +0000 (12:25 -0800)
Fix a regression after aabe901d57d6df4cd2786163359a7b2a7aae8c32 (`[ELF] Remove
one redundant computeBinding`): isLocal() does not indicate that the symbol is
originally local. For simplicity, just drop this optimization.

lld/ELF/InputSection.cpp
lld/test/ELF/Inputs/x86-64-split-stack-main.s
lld/test/ELF/x86-64-split-stack-prologue-adjust-success.s

index fc8b3b1..62db24f 100644 (file)
@@ -1181,11 +1181,6 @@ void InputSectionBase::adjustSplitStackFunctionPrologues(uint8_t *buf,
   std::vector<Relocation *> morestackCalls;
 
   for (Relocation &rel : relocations) {
-    // Local symbols can't possibly be cross-calls, and should have been
-    // resolved long before this line.
-    if (rel.sym->isLocal())
-      continue;
-
     // Ignore calls into the split-stack api.
     if (rel.sym->getName().startswith("__morestack")) {
       if (rel.sym->getName().equals("__morestack"))
index 3be9fac..22874c2 100644 (file)
@@ -6,6 +6,13 @@ non_split:
        retq
        .size   non_split,. - non_split
 
+       .global non_split_hidden
+        .hidden non_split_hidden
+       .type   non_split_hidden,@function
+non_split_hidden:
+       retq
+       .size   non_split_hidden,. - non_split_hidden
+
        .global non_function_text_symbol
 non_function_text_symbol:
        .byte 0x01
index 1fce4fd..6205793 100644 (file)
@@ -111,5 +111,13 @@ prologue2 non_split r10 0x100
 
 prologue2 non_split r11 0x200
 
+# CHECK: <prologue2_calls_non_split_hiddenr11>:
+# CHECK-NEXT: lea{{.*}} -16896(%rsp),{{.*}}%r11
+# CHECK: cmp{{.*}}%fs:{{[^,]*}},{{.*}}%r11
+# CHECK: jae{{.*$}}
+# CHECK-NEXT: callq{{.*}}<__morestack_non_split>
+
+prologue2 non_split_hidden r11 0x200
+
        .section        .note.GNU-stack,"",@progbits
        .section        .note.GNU-split-stack,"",@progbits