|
|
1bf09a7 |
From 39184e407cd937f2f20d3f61eec205925bae7b13 Mon Sep 17 00:00:00 2001
|
|
|
1bf09a7 |
From: Yonghong Song <yhs@fb.com>
|
|
|
1bf09a7 |
Date: Wed, 22 Aug 2018 21:21:03 +0000
|
|
|
1bf09a7 |
Subject: [PATCH] bpf: fix an assertion in BPFAsmBackend applyFixup()
|
|
|
1bf09a7 |
|
|
|
1bf09a7 |
Fix bug https://bugs.llvm.org/show_bug.cgi?id=38643
|
|
|
1bf09a7 |
|
|
|
1bf09a7 |
In BPFAsmBackend applyFixup(), there is an assertion for FixedValue to be 0.
|
|
|
1bf09a7 |
This may not be true, esp. for optimiation level 0.
|
|
|
1bf09a7 |
For example, in the above bug, for the following two
|
|
|
1bf09a7 |
static variables:
|
|
|
1bf09a7 |
@bpf_map_lookup_elem = internal global i8* (i8*, i8*)*
|
|
|
1bf09a7 |
inttoptr (i64 1 to i8* (i8*, i8*)*), align 8
|
|
|
1bf09a7 |
@bpf_map_update_elem = internal global i32 (i8*, i8*, i8*, i64)*
|
|
|
1bf09a7 |
inttoptr (i64 2 to i32 (i8*, i8*, i8*, i64)*), align 8
|
|
|
1bf09a7 |
|
|
|
1bf09a7 |
The static variable @bpf_map_update_elem will have a symbol
|
|
|
1bf09a7 |
offset of 8 and a FK_SecRel_8 with FixupValue 8 will cause
|
|
|
1bf09a7 |
the assertion if llvm is built with -DLLVM_ENABLE_ASSERTIONS=ON.
|
|
|
1bf09a7 |
|
|
|
1bf09a7 |
The above relocations will not exist if the program is compiled
|
|
|
1bf09a7 |
with optimization level -O1 and above as the compiler optimizes
|
|
|
1bf09a7 |
those static variables away. In the below error message, -O2
|
|
|
1bf09a7 |
is suggested as this is the common practice.
|
|
|
1bf09a7 |
|
|
|
1bf09a7 |
Note that FixedValue = 0 in applyFixup() does exist and is valid,
|
|
|
1bf09a7 |
e.g., for the global variable my_map in the above bug. The bpf
|
|
|
1bf09a7 |
loader will process them properly for map_id's before loading
|
|
|
1bf09a7 |
the program into the kernel.
|
|
|
1bf09a7 |
|
|
|
1bf09a7 |
The static variables, which are not optimized away by compiler,
|
|
|
1bf09a7 |
may have FK_SecRel_8 relocation with non-zero FixedValue.
|
|
|
1bf09a7 |
|
|
|
1bf09a7 |
The patch removed the offending assertion and will issue
|
|
|
1bf09a7 |
a hard error as below if the FixedValue in applyFixup()
|
|
|
1bf09a7 |
is not 0.
|
|
|
1bf09a7 |
$ llc -march=bpf -filetype=obj fixup.ll
|
|
|
1bf09a7 |
LLVM ERROR: Unsupported relocation: try to compile with -O2 or above,
|
|
|
1bf09a7 |
or check your static variable usage
|
|
|
1bf09a7 |
|
|
|
1bf09a7 |
Signed-off-by: Yonghong Song <yhs@fb.com>
|
|
|
1bf09a7 |
|
|
|
1bf09a7 |
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@340455 91177308-0d34-0410-b5e6-96231b3b80d8
|
|
|
1bf09a7 |
---
|
|
|
1bf09a7 |
lib/Target/BPF/MCTargetDesc/BPFAsmBackend.cpp | 9 ++++++++-
|
|
|
1bf09a7 |
1 file changed, 8 insertions(+), 1 deletion(-)
|
|
|
1bf09a7 |
|
|
|
1bf09a7 |
diff --git a/lib/Target/BPF/MCTargetDesc/BPFAsmBackend.cpp b/lib/Target/BPF/MCTargetDesc/BPFAsmBackend.cpp
|
|
|
1bf09a7 |
index 6c255e9..1822d86 100644
|
|
|
1bf09a7 |
--- a/lib/Target/BPF/MCTargetDesc/BPFAsmBackend.cpp
|
|
|
1bf09a7 |
+++ b/lib/Target/BPF/MCTargetDesc/BPFAsmBackend.cpp
|
|
|
1bf09a7 |
@@ -10,6 +10,8 @@
|
|
|
1bf09a7 |
#include "MCTargetDesc/BPFMCTargetDesc.h"
|
|
|
1bf09a7 |
#include "llvm/ADT/StringRef.h"
|
|
|
1bf09a7 |
#include "llvm/MC/MCAsmBackend.h"
|
|
|
1bf09a7 |
+#include "llvm/MC/MCAssembler.h"
|
|
|
1bf09a7 |
+#include "llvm/MC/MCContext.h"
|
|
|
1bf09a7 |
#include "llvm/MC/MCFixup.h"
|
|
|
1bf09a7 |
#include "llvm/MC/MCObjectWriter.h"
|
|
|
1bf09a7 |
#include "llvm/Support/EndianStream.h"
|
|
|
1bf09a7 |
@@ -71,7 +73,12 @@ void BPFAsmBackend::applyFixup(const MCAssembler &Asm, const MCFixup &Fixup,
|
|
|
1bf09a7 |
bool IsResolved,
|
|
|
1bf09a7 |
const MCSubtargetInfo *STI) const {
|
|
|
1bf09a7 |
if (Fixup.getKind() == FK_SecRel_4 || Fixup.getKind() == FK_SecRel_8) {
|
|
|
1bf09a7 |
- assert(Value == 0);
|
|
|
1bf09a7 |
+ if (Value) {
|
|
|
1bf09a7 |
+ MCContext &Ctx = Asm.getContext();
|
|
|
1bf09a7 |
+ Ctx.reportError(Fixup.getLoc(),
|
|
|
1bf09a7 |
+ "Unsupported relocation: try to compile with -O2 or above, "
|
|
|
1bf09a7 |
+ "or check your static variable usage");
|
|
|
1bf09a7 |
+ }
|
|
|
1bf09a7 |
} else if (Fixup.getKind() == FK_Data_4) {
|
|
|
1bf09a7 |
support::endian::write<uint32_t>(&Data[Fixup.getOffset()], Value, Endian);
|
|
|
1bf09a7 |
} else if (Fixup.getKind() == FK_Data_8) {
|
|
|
1bf09a7 |
--
|
|
|
1bf09a7 |
1.8.3.1
|
|
|
1bf09a7 |
|