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 {
1266
1266
1267
1267
// / Return MCSymbol extracted from the expression.
1268
1268
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)
1270
1274
return &SymbolRefExpr->getSymbol ();
1271
1275
1272
1276
return nullptr ;
Original file line number Diff line number Diff line change @@ -862,20 +862,12 @@ class AArch64MCPlusBuilder : public MCPlusBuilder {
862
862
if (AArchExpr && AArchExpr->getSubExpr ())
863
863
return getTargetSymbol (AArchExpr->getSubExpr ());
864
864
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);
874
866
}
875
867
876
868
const MCSymbol *getTargetSymbol (const MCInst &Inst,
877
869
unsigned OpNum = 0 ) const override {
878
- if (!getSymbolRefOperandNum (Inst, OpNum))
870
+ if (!OpNum && ! getSymbolRefOperandNum (Inst, OpNum))
879
871
return nullptr ;
880
872
881
873
const MCOperand &Op = Inst.getOperand (OpNum);
Original file line number Diff line number Diff line change @@ -338,15 +338,7 @@ class RISCVMCPlusBuilder : public MCPlusBuilder {
338
338
if (RISCVExpr && RISCVExpr->getSubExpr ())
339
339
return getTargetSymbol (RISCVExpr->getSubExpr ());
340
340
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);
350
342
}
351
343
352
344
const MCSymbol *getTargetSymbol (const MCInst &Inst,
Original file line number Diff line number Diff line change @@ -1796,11 +1796,7 @@ class X86MCPlusBuilder : public MCPlusBuilder {
1796
1796
if (!Op.isExpr ())
1797
1797
return nullptr ;
1798
1798
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 ());
1804
1800
}
1805
1801
1806
1802
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