mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 15:48:51 +00:00
fix erronous updating alignment of external global
This commit is contained in:
@@ -722,7 +722,10 @@ gb_internal unsigned lb_try_get_alignment(LLVMValueRef addr_ptr, unsigned defaul
|
|||||||
gb_internal bool lb_try_update_alignment(LLVMValueRef addr_ptr, unsigned alignment) {
|
gb_internal bool lb_try_update_alignment(LLVMValueRef addr_ptr, unsigned alignment) {
|
||||||
if (LLVMIsAGlobalValue(addr_ptr) || LLVMIsAAllocaInst(addr_ptr) || LLVMIsALoadInst(addr_ptr)) {
|
if (LLVMIsAGlobalValue(addr_ptr) || LLVMIsAAllocaInst(addr_ptr) || LLVMIsALoadInst(addr_ptr)) {
|
||||||
if (LLVMGetAlignment(addr_ptr) < alignment) {
|
if (LLVMGetAlignment(addr_ptr) < alignment) {
|
||||||
if (LLVMIsAAllocaInst(addr_ptr) || LLVMIsAGlobalValue(addr_ptr)) {
|
if (LLVMIsAAllocaInst(addr_ptr)) {
|
||||||
|
LLVMSetAlignment(addr_ptr, alignment);
|
||||||
|
} else if (LLVMIsAGlobalValue(addr_ptr) && LLVMGetLinkage(addr_ptr) != LLVMExternalLinkage) {
|
||||||
|
// NOTE(laytan): setting alignment of an external global just changes the alignment we expect it to be.
|
||||||
LLVMSetAlignment(addr_ptr, alignment);
|
LLVMSetAlignment(addr_ptr, alignment);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -755,10 +758,7 @@ gb_internal bool lb_try_vector_cast(lbModule *m, lbValue ptr, LLVMTypeRef *vecto
|
|||||||
|
|
||||||
LLVMValueRef addr_ptr = ptr.value;
|
LLVMValueRef addr_ptr = ptr.value;
|
||||||
if (LLVMIsAAllocaInst(addr_ptr) || LLVMIsAGlobalValue(addr_ptr)) {
|
if (LLVMIsAAllocaInst(addr_ptr) || LLVMIsAGlobalValue(addr_ptr)) {
|
||||||
unsigned alignment = LLVMGetAlignment(addr_ptr);
|
possible = lb_try_update_alignment(addr_ptr, vector_alignment);
|
||||||
alignment = gb_max(alignment, vector_alignment);
|
|
||||||
possible = true;
|
|
||||||
LLVMSetAlignment(addr_ptr, alignment);
|
|
||||||
} else if (LLVMIsALoadInst(addr_ptr)) {
|
} else if (LLVMIsALoadInst(addr_ptr)) {
|
||||||
unsigned alignment = LLVMGetAlignment(addr_ptr);
|
unsigned alignment = LLVMGetAlignment(addr_ptr);
|
||||||
possible = alignment >= vector_alignment;
|
possible = alignment >= vector_alignment;
|
||||||
|
|||||||
Reference in New Issue
Block a user