Make lld respect ALIGN directives on output sections even with -r. Fixes
authorkettenis <kettenis@openbsd.org>
Mon, 1 Jan 2018 19:18:30 +0000 (19:18 +0000)
committerkettenis <kettenis@openbsd.org>
Mon, 1 Jan 2018 19:18:30 +0000 (19:18 +0000)
the generation of gap.o.

ok patrick@

gnu/llvm/tools/lld/ELF/LinkerScript.cpp

index 8bdbd8d..468c2ba 100644 (file)
@@ -732,6 +732,10 @@ void LinkerScript::adjustSectionsBeforeSorting() {
       continue;
     if (OutputSection *Sec = Cmd->Sec) {
       Flags = Sec->Flags;
+
+      // Handle align (e.g. ".foo : ALIGN(16) { ... }").
+      if (Cmd->AlignExpr)
+        Sec->updateAlignment(Cmd->AlignExpr().getValue());
       continue;
     }
 
@@ -742,18 +746,18 @@ void LinkerScript::adjustSectionsBeforeSorting() {
     OutSec->SectionIndex = I;
     Cmd->Sec = OutSec;
     SecToCommand[OutSec] = Cmd;
+
+    // Handle align (e.g. ".foo : ALIGN(16) { ... }").
+    if (Cmd->AlignExpr)
+      Cmd->Sec->updateAlignment(Cmd->AlignExpr().getValue());
   }
 }
 
 void LinkerScript::adjustSectionsAfterSorting() {
   // Try and find an appropriate memory region to assign offsets in.
   for (BaseCommand *Base : Opt.Commands) {
-    if (auto *Cmd = dyn_cast<OutputSectionCommand>(Base)) {
+    if (auto *Cmd = dyn_cast<OutputSectionCommand>(Base))
       Cmd->MemRegion = findMemoryRegion(Cmd);
-      // Handle align (e.g. ".foo : ALIGN(16) { ... }").
-      if (Cmd->AlignExpr)
-        Cmd->Sec->updateAlignment(Cmd->AlignExpr().getValue());
-    }
   }
 
   // If output section command doesn't specify any segments,