File tree Expand file tree Collapse file tree 5 files changed +42
-25
lines changed Expand file tree Collapse file tree 5 files changed +42
-25
lines changed Original file line number Diff line number Diff line change @@ -1266,7 +1266,11 @@ class MCPlusBuilder {
12661266
12671267 // / Return MCSymbol extracted from the expression.
12681268 virtual const MCSymbol *getTargetSymbol (const MCExpr *Expr) const {
1269- if (auto *SymbolRefExpr = dyn_cast<const MCSymbolRefExpr>(Expr))
1269+ if (auto *BinaryExpr = dyn_cast<const MCBinaryExpr>(Expr))
1270+ return getTargetSymbol (BinaryExpr->getLHS ());
1271+
1272+ auto *SymbolRefExpr = dyn_cast<const MCSymbolRefExpr>(Expr);
1273+ if (SymbolRefExpr && SymbolRefExpr->getKind () == MCSymbolRefExpr::VK_None)
12701274 return &SymbolRefExpr->getSymbol ();
12711275
12721276 return nullptr ;
Original file line number Diff line number Diff line change @@ -862,20 +862,12 @@ class AArch64MCPlusBuilder : public MCPlusBuilder {
862862 if (AArchExpr && AArchExpr->getSubExpr ())
863863 return getTargetSymbol (AArchExpr->getSubExpr ());
864864
865- auto *BinExpr = dyn_cast<MCBinaryExpr>(Expr);
866- if (BinExpr)
867- return getTargetSymbol (BinExpr->getLHS ());
868-
869- auto *SymExpr = dyn_cast<MCSymbolRefExpr>(Expr);
870- if (SymExpr && SymExpr->getKind () == MCSymbolRefExpr::VK_None)
871- return &SymExpr->getSymbol ();
872-
873- return nullptr ;
865+ return MCPlusBuilder::getTargetSymbol (Expr);
874866 }
875867
876868 const MCSymbol *getTargetSymbol (const MCInst &Inst,
877869 unsigned OpNum = 0 ) const override {
878- if (!getSymbolRefOperandNum (Inst, OpNum))
870+ if (!OpNum && ! getSymbolRefOperandNum (Inst, OpNum))
879871 return nullptr ;
880872
881873 const MCOperand &Op = Inst.getOperand (OpNum);
Original file line number Diff line number Diff line change @@ -338,15 +338,7 @@ class RISCVMCPlusBuilder : public MCPlusBuilder {
338338 if (RISCVExpr && RISCVExpr->getSubExpr ())
339339 return getTargetSymbol (RISCVExpr->getSubExpr ());
340340
341- auto *BinExpr = dyn_cast<MCBinaryExpr>(Expr);
342- if (BinExpr)
343- return getTargetSymbol (BinExpr->getLHS ());
344-
345- auto *SymExpr = dyn_cast<MCSymbolRefExpr>(Expr);
346- if (SymExpr && SymExpr->getKind () == MCSymbolRefExpr::VK_None)
347- return &SymExpr->getSymbol ();
348-
349- return nullptr ;
341+ return MCPlusBuilder::getTargetSymbol (Expr);
350342 }
351343
352344 const MCSymbol *getTargetSymbol (const MCInst &Inst,
Original file line number Diff line number Diff line change @@ -1796,11 +1796,7 @@ class X86MCPlusBuilder : public MCPlusBuilder {
17961796 if (!Op.isExpr ())
17971797 return nullptr ;
17981798
1799- auto *SymExpr = dyn_cast<MCSymbolRefExpr>(Op.getExpr ());
1800- if (!SymExpr || SymExpr->getKind () != MCSymbolRefExpr::VK_None)
1801- return nullptr ;
1802-
1803- return &SymExpr->getSymbol ();
1799+ return MCPlusBuilder::getTargetSymbol (Op.getExpr ());
18041800 }
18051801
18061802 bool analyzeBranch (InstructionIterator Begin, InstructionIterator End,
Original file line number Diff line number Diff line change 1+ ## Check that llvm-bolt properly updates references in unoptimized code when
2+ ## such references are non-trivial expressions.
3+
4+ # RUN: %clang %cflags %s -o %t.exe -Wl,-q -no-pie
5+ # RUN: llvm-bolt %t.exe -o %t.bolt --funcs=_start
6+ # RUN: llvm-objdump -d --disassemble-symbols=_start %t.bolt > %t.out
7+ # RUN: llvm-objdump -d --disassemble-symbols=cold %t.bolt >> %t.out
8+ # RUN: FileCheck %s < %t.out
9+
10+ ## _start() will be optimized and assigned a new address.
11+ # CHECK: [[#%x,ADDR:]] <_start>:
12+
13+ ## cold() is not optimized, but references to _start are updated.
14+ # CHECK-LABEL: <cold>:
15+ # CHECK-NEXT: movl $0x[[#ADDR - 1]], %ecx
16+ # CHECK-NEXT: movl $0x[[#ADDR]], %ecx
17+ # CHECK-NEXT: movl $0x[[#ADDR + 1]], %ecx
18+
19+ .text
20+ .globl cold
21+ .type cold, %function
22+ cold:
23+ movl $_start-1 , %ecx
24+ movl $_start, %ecx
25+ movl $_start+1 , %ecx
26+ ret
27+ .size cold, .-cold
28+
29+ .globl _start
30+ .type _start, %function
31+ _start:
32+ ret
33+ .size _start, .-_start
You can’t perform that action at this time.
0 commit comments