[llvm] 0b06727 - [MC] Reject CFI advance_loc separated by a non-private label for Mach-O
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 26 14:26:10 PDT 2023
Author: Fangrui Song
Date: 2023-06-26T14:26:06-07:00
New Revision: 0b0672773e8b2ed01ad3fce103f4d84becfdd1ed
URL: https://github.com/llvm/llvm-project/commit/0b0672773e8b2ed01ad3fce103f4d84becfdd1ed
DIFF: https://github.com/llvm/llvm-project/commit/0b0672773e8b2ed01ad3fce103f4d84becfdd1ed.diff
LOG: [MC] Reject CFI advance_loc separated by a non-private label for Mach-O
Due to Mach-O's .subsections_via_symbols mechanism, non-private labels cannot
appear between .cfi_startproc/.cfi_endproc. Compilers do not produce such
labels, but hand-written assembly may. Give an error. Unfortunately,
emitDwarfAdvanceFrameAddr generated MCExpr doesn't have location
informatin.
Note: evaluateKnownAbsolute is to force folding A-B to a constant even if A and
B are separate by a non-private label. The function is a workaround for some
Mach-O assembler issues and should generally be avoided.
Reviewed By: efriedma
Differential Revision: https://reviews.llvm.org/D153167
Added:
llvm/test/MC/MachO/cfi-advance-loc-err.s
Modified:
llvm/lib/MC/MCAssembler.cpp
Removed:
################################################################################
diff --git a/llvm/lib/MC/MCAssembler.cpp b/llvm/lib/MC/MCAssembler.cpp
index 17170cb61d34e..cde1d75cd30c7 100644
--- a/llvm/lib/MC/MCAssembler.cpp
+++ b/llvm/lib/MC/MCAssembler.cpp
@@ -1110,16 +1110,20 @@ bool MCAssembler::relaxDwarfCallFrameFragment(MCAsmLayout &Layout,
return WasRelaxed;
MCContext &Context = Layout.getAssembler().getContext();
- uint64_t OldSize = DF.getContents().size();
- int64_t AddrDelta;
- bool Abs = DF.getAddrDelta().evaluateKnownAbsolute(AddrDelta, Layout);
- assert(Abs && "We created call frame with an invalid expression");
- (void) Abs;
+ int64_t Value;
+ bool Abs = DF.getAddrDelta().evaluateAsAbsolute(Value, Layout);
+ if (!Abs) {
+ getContext().reportError(DF.getAddrDelta().getLoc(),
+ "invalid CFI advance_loc expression");
+ return false;
+ }
+
SmallVectorImpl<char> &Data = DF.getContents();
+ uint64_t OldSize = Data.size();
Data.clear();
DF.getFixups().clear();
- MCDwarfFrameEmitter::encodeAdvanceLoc(Context, AddrDelta, Data);
+ MCDwarfFrameEmitter::encodeAdvanceLoc(Context, Value, Data);
return OldSize != Data.size();
}
diff --git a/llvm/test/MC/MachO/cfi-advance-loc-err.s b/llvm/test/MC/MachO/cfi-advance-loc-err.s
new file mode 100644
index 0000000000000..a049c197ab320
--- /dev/null
+++ b/llvm/test/MC/MachO/cfi-advance-loc-err.s
@@ -0,0 +1,21 @@
+# RUN: not llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o /dev/null 2>&1 | FileCheck %s --implicit-check-not=error:
+
+# CHECK-COUNT-4: <unknown>:0: error: invalid CFI advance_loc expression
+
+.section __TEXT,__text
+.globl _foo
+_foo:
+ .cfi_startproc
+ subq $8, %rsp
+ .cfi_adjust_cfa_offset 8
+ subq $8, %rsp
+ .cfi_adjust_cfa_offset 8
+
+tmp0: # non-private label cannot appear here
+ addq $8, %rsp
+ .cfi_adjust_cfa_offset -8
+.tmp1: # non-private label cannot appear here
+ addq $8, %rsp
+ .cfi_adjust_cfa_offset -8
+ retq
+ .cfi_endproc
More information about the llvm-commits
mailing list