]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: add Minalign field to ld.Arch
authorMichael Munday <munday@ca.ibm.com>
Thu, 3 Mar 2016 02:24:04 +0000 (21:24 -0500)
committerMinux Ma <minux@golang.org>
Thu, 3 Mar 2016 04:29:08 +0000 (04:29 +0000)
The new Minalign field sets the minimum alignment for all symbols.
This is required for the upcoming s390x port which requires symbols
be 2-byte aligned for efficient relative addressing.

All preexisting architectures have Minalign set to 1 which means
that this commit should have no effect.

I tested values of 2, 4 and 8 on linux amd64 and the tests appear to
pass. Increasing Minalign to 16 appears to break the runtime. I
think this is due to assumptions made about the layout of module
data.

toolstash -cmp on linux amd64 shows no changes due to this commit.

Resolves #14604

Change-Id: I0fe042d52c4e4732eba5fabcd0c31102a2408764
Reviewed-on: https://go-review.googlesource.com/20149
Reviewed-by: Minux Ma <minux@golang.org>
Run-TryBot: Minux Ma <minux@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

14 files changed:
src/cmd/link/internal/amd64/l.go
src/cmd/link/internal/amd64/obj.go
src/cmd/link/internal/arm/l.go
src/cmd/link/internal/arm/obj.go
src/cmd/link/internal/arm64/l.go
src/cmd/link/internal/arm64/obj.go
src/cmd/link/internal/ld/data.go
src/cmd/link/internal/ld/lib.go
src/cmd/link/internal/mips64/l.go
src/cmd/link/internal/mips64/obj.go
src/cmd/link/internal/ppc64/l.go
src/cmd/link/internal/ppc64/obj.go
src/cmd/link/internal/x86/l.go
src/cmd/link/internal/x86/obj.go

index 2537419eff7623f24d0e826acf12a2e110d12bf6..4ec8610afbf75279fd87771bbe627c48dea130ba 100644 (file)
@@ -33,6 +33,7 @@ package amd64
 const (
        thechar   = '6'
        MaxAlign  = 32 // max data alignment
+       MinAlign  = 1  // min data alignment
        FuncAlign = 16
 )
 
index 0167b6990004a87ed0798558c0fcdeaf6478d1e6..f5c2756fe714d1035ee0807ec65cedc2ee3eb485 100644 (file)
@@ -57,6 +57,7 @@ func linkarchinit() {
        ld.Thearch.Regsize = ld.Thelinkarch.Regsize
        ld.Thearch.Funcalign = FuncAlign
        ld.Thearch.Maxalign = MaxAlign
+       ld.Thearch.Minalign = MinAlign
        ld.Thearch.Minlc = MINLC
        ld.Thearch.Dwarfregsp = DWARFREGSP
        ld.Thearch.Dwarfreglr = DWARFREGLR
index b6de5a0cc16547cd89759b05cc9123ae94d4a277..58aecc4b648e701b274e44cf2edfaa614ac48e76 100644 (file)
@@ -65,6 +65,7 @@ package arm
 const (
        thechar   = '5'
        MaxAlign  = 8 // max data alignment
+       MinAlign  = 1 // min data alignment
        FuncAlign = 4 // single-instruction alignment
        MINLC     = 4
 )
index 1a83c3ba4c5b5aeb5ac3e80aa3cdcc487cb94186..bcd61fda9beb433db6fdf66d906bc03dd4e55b0e 100644 (file)
@@ -54,6 +54,7 @@ func linkarchinit() {
        ld.Thearch.Regsize = ld.Thelinkarch.Regsize
        ld.Thearch.Funcalign = FuncAlign
        ld.Thearch.Maxalign = MaxAlign
+       ld.Thearch.Minalign = MinAlign
        ld.Thearch.Minlc = MINLC
        ld.Thearch.Dwarfregsp = DWARFREGSP
        ld.Thearch.Dwarfreglr = DWARFREGLR
index 62703d2b7d9cb22e0d5b459be4b44bed1895c181..b9b7ea50e3f87e9aba3de81e7599e21f85a02394 100644 (file)
@@ -64,6 +64,7 @@ package arm64
 const (
        thechar   = '7'
        MaxAlign  = 32 // max data alignment
+       MinAlign  = 1  // min data alignment
        FuncAlign = 8
        MINLC     = 4
 )
index 762809fd3091a82ab65b17f00fe1bc03cec4dc40..693e106ff153f5cc6ca2372553179e641d00d47d 100644 (file)
@@ -54,6 +54,7 @@ func linkarchinit() {
        ld.Thearch.Regsize = ld.Thelinkarch.Regsize
        ld.Thearch.Funcalign = FuncAlign
        ld.Thearch.Maxalign = MaxAlign
+       ld.Thearch.Minalign = MinAlign
        ld.Thearch.Minlc = MINLC
        ld.Thearch.Dwarfregsp = DWARFREGSP
        ld.Thearch.Dwarfreglr = DWARFREGLR
index cbaf15280d8c0780dda0343069e31a8e5ec75b3b..bc7909d1edf332b54e18a929c5f21a4c88a9c919 100644 (file)
@@ -1026,18 +1026,18 @@ func dosymtype() {
        }
 }
 
+// symalign returns the required alignment for the given symbol s.
 func symalign(s *LSym) int32 {
-       if s.Align != 0 {
+       min := int32(Thearch.Minalign)
+       if s.Align >= min {
                return s.Align
+       } else if s.Align != 0 {
+               return min
        }
-
        align := int32(Thearch.Maxalign)
-       for int64(align) > s.Size && align > 1 {
+       for int64(align) > s.Size && align > min {
                align >>= 1
        }
-       if align < s.Align {
-               align = s.Align
-       }
        return align
 }
 
index 4bc150ff4f9edd8d28bc47c11b79b485c043f5f7..c5d736aaed6ab911674a38a7d23c8d49cda2e21f 100644 (file)
@@ -88,6 +88,7 @@ type Arch struct {
        Regsize          int
        Funcalign        int
        Maxalign         int
+       Minalign         int
        Minlc            int
        Dwarfregsp       int
        Dwarfreglr       int
index 8ea1d8433c71f850760a9700f8a0f4a2edf6d1ed..003ee5ce7156cfdd81b004f1fff87e15eaa15278 100644 (file)
@@ -64,6 +64,7 @@ package mips64
 const (
        thechar   = '0'
        MaxAlign  = 32 // max data alignment
+       MinAlign  = 1  // min data alignment
        FuncAlign = 8
        MINLC     = 4
 )
index 5ab58080477dbdc06d748f8f5a44e12562048ba4..57a1b2ab1451848472a0572acf6fb5b1630b3cdb 100644 (file)
@@ -58,6 +58,7 @@ func linkarchinit() {
        ld.Thearch.Regsize = ld.Thelinkarch.Regsize
        ld.Thearch.Funcalign = FuncAlign
        ld.Thearch.Maxalign = MaxAlign
+       ld.Thearch.Minalign = MinAlign
        ld.Thearch.Minlc = MINLC
        ld.Thearch.Dwarfregsp = DWARFREGSP
        ld.Thearch.Dwarfreglr = DWARFREGLR
index 1c4a4a9c862d54f2040cce2c2e16a89551c956c3..622d6bb12e31045e77cc4ae6d302120eddf449fd 100644 (file)
@@ -64,6 +64,7 @@ package ppc64
 const (
        thechar   = '9'
        MaxAlign  = 32 // max data alignment
+       MinAlign  = 1  // min data alignment
        FuncAlign = 8
        MINLC     = 4
 )
index 61b26799a105608938e27830417df93689077283..539ab1ac023ebbcd4295a06fd3d2fe5cccb25ac7 100644 (file)
@@ -58,6 +58,7 @@ func linkarchinit() {
        ld.Thearch.Regsize = ld.Thelinkarch.Regsize
        ld.Thearch.Funcalign = FuncAlign
        ld.Thearch.Maxalign = MaxAlign
+       ld.Thearch.Minalign = MinAlign
        ld.Thearch.Minlc = MINLC
        ld.Thearch.Dwarfregsp = DWARFREGSP
        ld.Thearch.Dwarfreglr = DWARFREGLR
index c067425ba504f4ab8d9e052e54fcbd820d67143f..068fed9c8daf99fd79305dcc3915cdff03203660 100644 (file)
@@ -34,6 +34,7 @@ const (
        thechar   = '8'
        PtrSize   = 4
        MaxAlign  = 32 // max data alignment
+       MinAlign  = 1  // min data alignment
        FuncAlign = 16
        MINLC     = 1
 )
index 00a825a7a31a7f037fadef69ce2379e881b7ab46..4380c41ebb46a21e291c5163443f06d559979537 100644 (file)
@@ -54,6 +54,7 @@ func linkarchinit() {
        ld.Thearch.Regsize = ld.Thelinkarch.Regsize
        ld.Thearch.Funcalign = FuncAlign
        ld.Thearch.Maxalign = MaxAlign
+       ld.Thearch.Minalign = MinAlign
        ld.Thearch.Minlc = MINLC
        ld.Thearch.Dwarfregsp = DWARFREGSP
        ld.Thearch.Dwarfreglr = DWARFREGLR