Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

cmd/compile: make 64-bit fields 64-bit aligned on 32-bit systems #599

Closed
rsc opened this issue Feb 12, 2010 · 36 comments
Closed

cmd/compile: make 64-bit fields 64-bit aligned on 32-bit systems #599

rsc opened this issue Feb 12, 2010 · 36 comments
Labels
FrozenDueToAge NeedsInvestigation Someone must examine and confirm this is a valid issue and not a duplicate of an existing one.
Milestone

Comments

@rsc
Copy link
Contributor

rsc commented Feb 12, 2010

Even though the 386 has a 4-byte word size, some instructions move 
data in larger chunks.  In particular float64 loads move 8 bytes and
some SSE2 operations (as yet unused) move even larger amounts.
A float64 load from an only-4-byte-aligned address is significantly
more expensive than one from a 8-byte-aligned address.  The same
is probably true of SSE2 too.

We should make sure that data symbols >32 bits (e.g., float64 constants)
are aligned on 8-byte boundaries in the data segment.  (Fairly easy.)

We should also make sure that the stack pointer can be relied upon to be
8-byte aligned (harder), by making stack frame sizes = -4 mod 8 
(the caller PC will add 4 more) and starting new goroutines with a
properly aligned stack pointer.

It might be worth using 16 bytes for the stack alignment.  OS X requires
that for their own ABI, presumably because it matters for SSE2.
@rsc
Copy link
Contributor Author

rsc commented Dec 9, 2011

Comment 1:

Labels changed: added priority-someday.

@rsc
Copy link
Contributor Author

rsc commented Sep 12, 2012

Comment 2:

Issue #3799 has been merged into this issue.

@rsc
Copy link
Contributor Author

rsc commented Sep 12, 2012

Comment 3:

This is necessary for atomics to work correctly.

@rsc
Copy link
Contributor Author

rsc commented Sep 12, 2012

Comment 4:

Labels changed: added priority-soon, removed priority-someday.

Status changed to Accepted.

@rsc
Copy link
Contributor Author

rsc commented Sep 12, 2012

Comment 5:

Labels changed: added go1.1.

@rsc
Copy link
Contributor Author

rsc commented Dec 10, 2012

Comment 7:

Labels changed: added size-l.

@rsc
Copy link
Contributor Author

rsc commented Dec 22, 2012

Comment 8:

Too hard. I tried a few different things and failed miserably. The gc toolchain expects
that the struct and function argument frame alignments match. The stack frame 
barely matters, since we don't take pointers of stack variables anymore, but that's
hard too.
This only really matters for atomics, and we do guarantee 64-bit alignment for the
base of an allocated struct or slice, so that will have to be good enough for now.

Labels changed: added priority-someday, removed priority-soon, go1.1.

@rsc
Copy link
Contributor Author

rsc commented Dec 22, 2012

Comment 9:

Labels changed: added size-xl, removed size-l.

@rsc
Copy link
Contributor Author

rsc commented Jul 30, 2013

Comment 10:

Labels changed: added go1.3maybe.

@robpike
Copy link
Contributor

robpike commented Aug 20, 2013

Comment 11:

Labels changed: removed go1.3maybe.

@rsc
Copy link
Contributor Author

rsc commented Oct 29, 2013

Comment 13:

I have had an opportunity to revisit this problem recently in a different context. I
think we can do it for Go 1.3.

Labels changed: added go1.3.

@rsc
Copy link
Contributor Author

rsc commented Dec 4, 2013

Comment 14:

Labels changed: added release-go1.3.

@rsc
Copy link
Contributor Author

rsc commented Dec 4, 2013

Comment 15:

Labels changed: removed go1.3.

@rsc
Copy link
Contributor Author

rsc commented Dec 4, 2013

Comment 16:

Labels changed: added repo-main.

@rsc
Copy link
Contributor Author

rsc commented Apr 3, 2014

Comment 17:

We didn't do it for 1.3. My guess is that in comment 13 I was referring to NaCl having
unusual alignment requirements, so perhaps that would pave the way.

Labels changed: added release-go1.4, removed release-go1.3.

@rsc
Copy link
Contributor Author

rsc commented Sep 15, 2014

Comment 18:

Labels changed: added release-none, removed release-go1.4.

rkoehn added a commit to rkoehn/mc that referenced this issue Feb 2, 2020
Keep elements that are used with atomic.* functions as first element
of struct because it guarantees 64bit alignment on 32 bit machines.
atomic.* functions crash if operand is not aligned at 64bit.
See golang/go#599
kannappanr pushed a commit to minio/mc that referenced this issue Feb 4, 2020
Keep elements that are used with atomic.* functions as first element
of struct because it guarantees 64bit alignment on 32 bit machines.
atomic.* functions crash if operand is not aligned at 64bit.
See golang/go#599
cesnietor added a commit to cesnietor/mc that referenced this issue Apr 2, 2020
* Fix zh_CN doc about policy errors (minio#2927)

* Fix Windows config path (minio#2898)

Remove '.exe' (case insensitive) from executable name for consistent config folder.

Potentially breaking: If people (for whatever reason) used 'mc.exe', this will potentially break their setup.

* Fix removing empty prefixes  with `mc rm ` command (minio#2912)

Fixes: 2909

* Add --type flag to `mc admin console` (minio#2914)

This allows filtering error logs by type

* Update mc to use secure-io package (minio#2931)

* Refactor mc cp and make session optional. (minio#2910)

Now `mc cp --recursive --continue` creates copy session on failure or
resumes if previous failed session is found.

Fixes minio#2893

* continue flag: Fix inconsistent punctuation in usage text (minio#2933)

* fix mc cp termination on signals (minio#2934)

* Adapt new changes in StorageInfo (minio#2889)

* Fix arrow signs to use more common U+2191 & U+2193 (minio#2942)

* Avoid index out of range errors (minio#2943)

Fixes minio#2941

* Fix typo in error message (minio#2945)

Change the error message from `Cannot remove new user` to 
`Cannot remove <User>`, when a non-existent user is removed.

* Add options to preserve filesystem attributes (minio#2938)

* mc admin config set/get/del/history/help (minio#2835)

Related to minio/minio#8392

* print disk usage as a plain integer when formatting as json (minio#2946)

* Fix the storage prints for xl/fs disks in `admin info server` (minio#2947)

* Fix config history to list in git style format (minio#2951)

```
~ mc admin config history list -n 2 myminio
RestoreId: df0ebb1e-69b0-4043-b9dd-ab54508f2897
Date: Mon, 04 Nov 2019 17:27:27 GMT

region name="us-east-1" state="on"
region name="us-east-1" state="on"
region name="us-east-1" state="on"
region name="us-east-1" state="on"

RestoreId: ecc6873a-0ed3-41f9-b03e-a2a1bab48b5f
Date: Mon, 04 Nov 2019 17:28:23 GMT

region name=us-east-1 state=off
```

* add lock command (minio#2880)

`lock` command enables to set, get and clear object lock configuration
of given bucket.

* update to latest minio (minio#2956)

* Fix encrypt-key flag parsing (minio#2955)

* update to latest minio (minio#2957)

* Rectify usage section of policy help (minio#2959)

* help command is now part of `mc admin config get/set` (minio#2961)

* mirror object lock configuration to dest bucket (minio#2964)

if bucket does not exist on the target side.

* Add default values in 'get' (minio#2962)

* Add mirror command to compare metadata and copy (minio#2965)

mirror now uses the newly introduced
ListObjectsV2WithMetadata API in minio-go

* Handle PutObjectRetention notification events correctly (minio#2966)

* Retention command to apply retention to objects with a Prefix (minio#2963)

* Fix totalSize and totalCounts calculation (minio#2969)

* Add import/export command (minio#2974)

* Add support for auto-complete in 'mc admin config' commands (minio#2975)

* Remove duplicated API method(s) for object retention (minio#2973)

* Fix progress bar update regression (minio#2976)

Regression introduced in cf6defe

* Update export command to print disabled sub-sys as comments (minio#2978)

* Add finalized command line options (minio#2979)

* Avoid re-parsing config history elements (minio#2981)

* change target to name in config help (minio#2983)

* fix: Source content can be nil when updating progress bar (minio#2984)

* Continue mirroring inspite of error events (minio#2986)

* watch: Add site wide level support (minio#2987)

* Continue listing upon error during diff and mirror (minio#2988)

* Support for multi master sites (minio#2991)

* Retry mirror forever on watch (minio#2992)

* Fix multi-master setup help text (minio#2993)

* Do full scan diff+mirror in multi-site mirror mode (minio#2994)

* update minio-go to master (minio#2995)

* Avoid mirror fatalIf in multi-master (minio#2998)

* Mirror with fallback list in multimaster mode, copy missing files (minio#2999)

* Fix mirroring of PutObjectRetention event (minio#3004)

* Multi-master only run single startMirror at a time (minio#3003)

Also randomize the sleep appropriately based
on Unix() time source.

* mc sql: Use compression parameter (minio#2996)

The compression parameter is not actually used, but always guessed from the file extension.

Only guess the compression type if it is not explicitly set.

Uploading a file called `out.csv.geezipd`:

Before:
```
λ mc sql -e="SELECT * from s3object LIMIT 1" --compression=GZIP --csv-input "rd=\n,fh=USE,fd=;" local/test/out.csv.geezipd
�""���k↔��Xs��W.v�      ��)��{2#��,r���:�|D▲�.��f♫��→�i�p�2l�♫��ʭ���Q��v▲�5ر�c
```
(content actually not ungzipped)

After:
```
λ mc sql -e="SELECT * from s3object LIMIT 1" --compression=GZIP --csv-input "rd=\n,fh=USE,fd=;" local/test/out.csv.geezipd
"281,1285,159625,159627,2637,20000827.0117590018,1239029,1663,-6.7535419,1533,0.53597438,8"
```

We leave validation of the compression value to the server.

* Replace Timestamp separator   (minio#3002)

Replace time stamp separator to use `-`

* New admin info (minio#2982)

* Stops showing usage info if Bucket#=0 (minio#3007)

* Extraneous line in 'mc admin info' output (minio#3010)

* cp: Only use session when -c is passed (minio#2989)

* Upgrade to new Listen bucket API (minio#3008)

* fix: ignore APINotImplemented errors from filesystem (minio#3018)

* Update to latest minio/minio (minio#3020)

* Mirror: Generate STag and ETag on destination only in Multimaster mode (minio#3021)

* Update mc dependencies to recent dep change on MinIO (minio#3026)

* Use colorjson to indent json properly in cp (minio#3030)

Additionally also do not initialize progress bar in json
or quiet mode in mirror.

Fixes minio#3029
Fixes minio#3017

* fix default flag behaviour in du command (minio#3031)

- `mc du` without args should print help like other `mc` commands
- `mc du` should behave like `du -h --max-depth=1` as default
- optional `--recursive` if they want capacity for each folder.
fixes minio#2871

* Add lock and retention docs (minio#3034)

* Only rename config directories (minio#3032)

If the user placed an `mc.exe` in the user directory and wasn't used it, it would be renamed.

* fix: crash in cp when cpURLs return error (minio#3035)

* fix: du to ignore too many recursive symlinks (minio#3033)

* fix: update docs for --attr command (minio#3040)

Also canonicalize metadata headers automatically
before, minio-go consumes it.

* retention: Error out early when url argument does not point to S3 server (minio#3041)

* fix: update minio-go to support snowball data-transfer (minio#3042)

* cp: add missing } in help template (minio#3047)

* Update pkg/madmin to support multiple profilers (minio#3048)

* admin/console: Fix a crash in console string generation (minio#3049)

* fix: best effort save permissions always (minio#3050)

* upgrade to latest server to remove replace tags (minio#3051)

* fix: update admin docs for latest changes (minio#3054)

* fix: handle symlinks by reading/following as needed (minio#3053)

Avoid using filepath.EvalSymlinks and let the caller
fail appropriately for symlinks.

Fixes minio#3011

* check for bucket exists in 'admin heal' (minio#3059)

* Ensure 64bit alignment on 32bit builds for atomics (minio#3065)

Keep elements that are used with atomic.* functions as first element
of struct because it guarantees 64bit alignment on 32 bit machines.
atomic.* functions crash if operand is not aligned at 64bit.
See golang/go#599

* add the `mc admin kms` subcommands (minio#2882)

This commit adds the first set of KMS admin
commands.

For new there is only the
`mc admin kms key status <endpoint> [key-ID]` command
that can be used to fetch status information for a
KMS master key. Listing and rotation commands are
planed.

* Fix go.sum file missing entries (minio#3071)

* add debug support for 'config host add' (minio#3076)

* Fix crash in mc admin console (minio#3079)

Fixes : minio#3078

* use latest minio-go version (minio#3080)

* allow mirror to copy zero byte file (minio#3084)

this PR also cleans up code and avoids
extra calls for source target

* go mod tidy (minio#3081)

* honor prefix for object and directory names in 'rm -r' (minio#3012)

* fix go mod tidy again

* added pkg/disk/stat_freebsd.go (minio#3090)

* fix handling of directories in Stat (minio#3092)

Fixes minio#3089
Fixes minio#3091

* retention - cleanup unused code (minio#3094)

* Use listObjectsV1 for GCS S3 implementation (minio#3101)

Fixes minio#3073

* Support arm32, 386 compilation: (minio#3103)

* deprecate 'mc session' documentation (minio#3104)

* Add support of threads & goroutines profiling type (minio#3108)

* fix go mod tidy

* Update minio-go to bring some fixes (minio#3106)

* resolve build issues on illumos (minio#3098)

* Update docs for mc admin update (minio#3110)

* fix: Make sure Ctrl-C cancels `mc cp` right away (minio#3113)

* mc cp -continue: Fix escape/colorization of JSON (minio#3116)

* info: Fix showing offline nodes in the pretty output (minio#3112)

Also do some simplification in the code.

* Secret key prompt (minio#3083)

* heal: Show scheduled next healing (minio#3111)

mc admin heal alias command will show the next healing time.

Also, show 'Never completed' when the server returns zero last healing activity

* mc cp: Fix prefix handling in TypeC (minio#3115)

for copy from filesystem to objectstorage.

Avoid prefixing dirname to file on target side
when doing a `mc cp /tmp/dir myminio/bucket --r`
to make `mc mirror` and `mc cp` behavior consistent

* info: Add missing new lines in the output (minio#3119)

* fix for incorrect mtime handling (minio#3121)

* mc retention: add --recursive and --bypass flags. (minio#3100)

--bypass flag allows overriding governance if user
has override permissions

* cleanup legacy metadata handling (minio#3118)

* Add global context and adapt context change in admin API (minio#3125)

This commit adds a new global context, monitors os signals
and cancels the global context in such cases to exit
on going process gracefully.

It will also update minio-go and adapts the code with
the new context changes in the admin API.

* Add tag command (minio#3117)

* cleanup tag command (minio#3126)

* Add legalhold command (minio#3095)

* mc watch windows URL/absolute path event path (minio#3133)

* Onboard Diagnostics (minio#3114)

Also colorize JSON output in all admin commands

* Make BuildS3Config public (minio#3132)

* add build trimpaths to remove gopath (minio#3137)

* add --disable-multipart flag in cp (minio#3135)

* set S3Client struct as public

* set s3client struct as public to be used by mcs

Co-authored-by: yiranzai <wuqingdzx@gmail.com>
Co-authored-by: Klaus Post <klauspost@gmail.com>
Co-authored-by: poornas <poornas@users.noreply.github.com>
Co-authored-by: Harshavardhana <harsha@minio.io>
Co-authored-by: Bala FA <bala.gluster@gmail.com>
Co-authored-by: Ashish Kumar Sinha <ashi.sinha.87@gmail.com>
Co-authored-by: Praveen raj Mani <praveen@minio.io>
Co-authored-by: Nitish Tiwari <nitish@minio.io>
Co-authored-by: kannappanr <30541348+kannappanr@users.noreply.github.com>
Co-authored-by: Wesley Collin Wright <deinlebenandern@gmail.com>
Co-authored-by: Krishna Srinivas <634494+krishnasrinivas@users.noreply.github.com>
Co-authored-by: Anis Elleuch <vadmeste@users.noreply.github.com>
Co-authored-by: BigUstad <priyank.raj@gatech.edu>
Co-authored-by: ebozduman <ersan.bozduman@gmail.com>
Co-authored-by: Maël Valais <mael.valais@gmail.com>
Co-authored-by: Reinhard Koehn <rkoehn@users.noreply.github.com>
Co-authored-by: Andreas Auernhammer <aead@mail.de>
Co-authored-by: Dmitry Wagin <dmitry.wagin@ya.ru>
Co-authored-by: Kody A Kantor <kody.kantor@gmail.com>
Co-authored-by: Jeffrey Clark <h0tw1r3@users.noreply.github.com>
Co-authored-by: Sidhartha Mani <wlan0@users.noreply.github.com>
Co-authored-by: Daniel Valdivia <hola@danielvaldivia.com>
comzyh added a commit to comzyh/gvisor that referenced this issue May 10, 2020
When using atomic operations from sync/atomic on 64 bit variables on 32
bit architecture care must be taken to assure the variables are 8 byte
aligned.

Issue: golang/go#599

Applying a hack from:
https://go101.org/article/memory-layout.html

Fix execution error:

runtime: unexpected return pc for armXadd64 called from 0x0
@gopherbot
Copy link

Change https://golang.org/cl/237317 mentions this issue: design/36606-64-bit-field-alignment: add proposal

gopherbot pushed a commit to golang/proposal that referenced this issue Jun 12, 2020
This change adds a new design proposal to the repository describing
changes to Go alignment behavior and addition of Go directives, as a way
to deal with the problems associated with issue golang/go#599.

Updates golang/go#36606

Change-Id: I2b09424a71d2ffed7136205756f6e101aafd13bb
Reviewed-on: https://go-review.googlesource.com/c/proposal/+/237317
Reviewed-by: Austin Clements <austin@google.com>
comzyh added a commit to comzyh/gvisor that referenced this issue Aug 14, 2020
When using atomic operations from sync/atomic on 64 bit variables on 32
bit architecture care must be taken to assure the variables are 8 byte
aligned.

Issue: golang/go#599

Applying a hack from:
https://go101.org/article/memory-layout.html

Fix execution error:

runtime: unexpected return pc for armXadd64 called from 0x0
Dreamacro pushed a commit to comzyh/gvisor that referenced this issue Sep 16, 2020
When using atomic operations from sync/atomic on 64 bit variables on 32
bit architecture care must be taken to assure the variables are 8 byte
aligned.

Issue: golang/go#599

Applying a hack from:
https://go101.org/article/memory-layout.html

Fix execution error:

runtime: unexpected return pc for armXadd64 called from 0x0
comzyh added a commit to comzyh/gvisor that referenced this issue Sep 22, 2020
When using atomic operations from sync/atomic on 64 bit variables on 32
bit architecture care must be taken to assure the variables are 8 byte
aligned.

Issue: golang/go#599

Applying a hack from:
https://go101.org/article/memory-layout.html

Fix execution error:

runtime: unexpected return pc for armXadd64 called from 0x0
@rsc
Copy link
Contributor Author

rsc commented Oct 7, 2020

Duplicate of #36606.

@rsc rsc closed this as completed Oct 7, 2020
Dreamacro pushed a commit to comzyh/gvisor that referenced this issue Nov 28, 2020
When using atomic operations from sync/atomic on 64 bit variables on 32
bit architecture care must be taken to assure the variables are 8 byte
aligned.

Issue: golang/go#599

Applying a hack from:
https://go101.org/article/memory-layout.html

Fix execution error:

runtime: unexpected return pc for armXadd64 called from 0x0
Dreamacro pushed a commit to comzyh/gvisor that referenced this issue Dec 20, 2020
When using atomic operations from sync/atomic on 64 bit variables on 32
bit architecture care must be taken to assure the variables are 8 byte
aligned.

Issue: golang/go#599

Applying a hack from:
https://go101.org/article/memory-layout.html

Fix execution error:

runtime: unexpected return pc for armXadd64 called from 0x0
Dreamacro pushed a commit to comzyh/gvisor that referenced this issue Jan 28, 2021
When using atomic operations from sync/atomic on 64 bit variables on 32
bit architecture care must be taken to assure the variables are 8 byte
aligned.

Issue: golang/go#599

Applying a hack from:
https://go101.org/article/memory-layout.html

Fix execution error:

runtime: unexpected return pc for armXadd64 called from 0x0
comzyh added a commit to comzyh/gvisor that referenced this issue Mar 2, 2021
When using atomic operations from sync/atomic on 64 bit variables on 32
bit architecture care must be taken to assure the variables are 8 byte
aligned.

Issue: golang/go#599

Applying a hack from:
https://go101.org/article/memory-layout.html

Fix execution error:

runtime: unexpected return pc for armXadd64 called from 0x0
comzyh added a commit to comzyh/gvisor that referenced this issue Apr 14, 2021
When using atomic operations from sync/atomic on 64 bit variables on 32
bit architecture care must be taken to assure the variables are 8 byte
aligned.

Issue: golang/go#599

Applying a hack from:
https://go101.org/article/memory-layout.html

Fix execution error:

runtime: unexpected return pc for armXadd64 called from 0x0
afjoseph added a commit to afjoseph/dht that referenced this issue Sep 1, 2021
int64 atomics are not supported on 32-bit systems as of now: golang/go#599
anacrolix pushed a commit to anacrolix/dht that referenced this issue Sep 2, 2021
int64 atomics are not supported on 32-bit systems as of now: golang/go#599
@golang golang locked and limited conversation to collaborators Oct 7, 2021
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
FrozenDueToAge NeedsInvestigation Someone must examine and confirm this is a valid issue and not a duplicate of an existing one.
Projects
None yet
Development

No branches or pull requests