-
-
Notifications
You must be signed in to change notification settings - Fork 5.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add second round of LLVM 3.7.1 patches
- Loading branch information
Showing
2 changed files
with
221 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,220 @@ | ||
diff --git a/include/llvm/MC/MCStreamer.h b/include/llvm/MC/MCStreamer.h | ||
index 6b9b8a1..86e273b 100644 | ||
--- a/include/llvm/MC/MCStreamer.h | ||
+++ b/include/llvm/MC/MCStreamer.h | ||
@@ -131,6 +131,10 @@ public: | ||
|
||
void finish() override; | ||
|
||
+ /// Reset any state between object emissions, i.e. the equivalent of | ||
+ /// MCStreamer's reset method. | ||
+ virtual void reset(); | ||
+ | ||
/// Callback used to implement the ldr= pseudo. | ||
/// Add a new entry to the constant pool for the current section and return an | ||
/// MCExpr that can be used to refer to the constant pool location. | ||
diff --git a/include/llvm/Support/MathExtras.h b/include/llvm/Support/MathExtras.h | ||
index 2cf7e0e..6bacca0 100644 | ||
--- a/include/llvm/Support/MathExtras.h | ||
+++ b/include/llvm/Support/MathExtras.h | ||
@@ -63,7 +63,7 @@ template <typename T, std::size_t SizeOfT> struct TrailingZerosCounter { | ||
} | ||
}; | ||
|
||
-#if __GNUC__ >= 4 || _MSC_VER | ||
+#if __GNUC__ >= 4 || defined(_MSC_VER) | ||
template <typename T> struct TrailingZerosCounter<T, 4> { | ||
static std::size_t count(T Val, ZeroBehavior ZB) { | ||
if (ZB != ZB_Undefined && Val == 0) | ||
@@ -71,7 +71,7 @@ template <typename T> struct TrailingZerosCounter<T, 4> { | ||
|
||
#if __has_builtin(__builtin_ctz) || LLVM_GNUC_PREREQ(4, 0, 0) | ||
return __builtin_ctz(Val); | ||
-#elif _MSC_VER | ||
+#elif defined(_MSC_VER) | ||
unsigned long Index; | ||
_BitScanForward(&Index, Val); | ||
return Index; | ||
@@ -87,7 +87,7 @@ template <typename T> struct TrailingZerosCounter<T, 8> { | ||
|
||
#if __has_builtin(__builtin_ctzll) || LLVM_GNUC_PREREQ(4, 0, 0) | ||
return __builtin_ctzll(Val); | ||
-#elif _MSC_VER | ||
+#elif defined(_MSC_VER) | ||
unsigned long Index; | ||
_BitScanForward64(&Index, Val); | ||
return Index; | ||
@@ -132,7 +132,7 @@ template <typename T, std::size_t SizeOfT> struct LeadingZerosCounter { | ||
} | ||
}; | ||
|
||
-#if __GNUC__ >= 4 || _MSC_VER | ||
+#if __GNUC__ >= 4 || defined(_MSC_VER) | ||
template <typename T> struct LeadingZerosCounter<T, 4> { | ||
static std::size_t count(T Val, ZeroBehavior ZB) { | ||
if (ZB != ZB_Undefined && Val == 0) | ||
@@ -140,7 +140,7 @@ template <typename T> struct LeadingZerosCounter<T, 4> { | ||
|
||
#if __has_builtin(__builtin_clz) || LLVM_GNUC_PREREQ(4, 0, 0) | ||
return __builtin_clz(Val); | ||
-#elif _MSC_VER | ||
+#elif defined(_MSC_VER) | ||
unsigned long Index; | ||
_BitScanReverse(&Index, Val); | ||
return Index ^ 31; | ||
@@ -156,7 +156,7 @@ template <typename T> struct LeadingZerosCounter<T, 8> { | ||
|
||
#if __has_builtin(__builtin_clzll) || LLVM_GNUC_PREREQ(4, 0, 0) | ||
return __builtin_clzll(Val); | ||
-#elif _MSC_VER | ||
+#elif defined(_MSC_VER) | ||
unsigned long Index; | ||
_BitScanReverse64(&Index, Val); | ||
return Index ^ 63; | ||
diff --git a/lib/ExecutionEngine/SectionMemoryManager.cpp b/lib/ExecutionEngine/SectionMemoryManager.cpp | ||
index e2f2208..1ad5f17 100644 | ||
--- a/lib/ExecutionEngine/SectionMemoryManager.cpp | ||
+++ b/lib/ExecutionEngine/SectionMemoryManager.cpp | ||
@@ -137,9 +137,6 @@ bool SectionMemoryManager::finalizeMemory(std::string *ErrMsg) | ||
return true; | ||
} | ||
|
||
- // Don't allow free memory blocks to be used after setting protection flags. | ||
- RODataMem.FreeMem.clear(); | ||
- | ||
// Make read-only data memory read-only. | ||
ec = applyMemoryGroupPermissions(RODataMem, | ||
sys::Memory::MF_READ | sys::Memory::MF_EXEC); | ||
diff --git a/lib/MC/MCMachOStreamer.cpp b/lib/MC/MCMachOStreamer.cpp | ||
index 53cd131..7f9a6c5 100644 | ||
--- a/lib/MC/MCMachOStreamer.cpp | ||
+++ b/lib/MC/MCMachOStreamer.cpp | ||
@@ -60,6 +60,7 @@ public: | ||
|
||
/// state management | ||
void reset() override { | ||
+ CreatedADWARFSection = false; | ||
HasSectionLabel.clear(); | ||
MCObjectStreamer::reset(); | ||
} | ||
diff --git a/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp b/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp | ||
index d17fdb9..62d3914 100644 | ||
--- a/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp | ||
+++ b/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp | ||
@@ -388,6 +388,9 @@ private: | ||
|
||
size_t calculateContentSize() const; | ||
|
||
+ // Reset state between object emissions | ||
+ void reset() override; | ||
+ | ||
public: | ||
ARMTargetELFStreamer(MCStreamer &S) | ||
: ARMTargetStreamer(S), CurrentVendor("aeabi"), FPU(ARM::FK_INVALID), | ||
@@ -415,7 +418,7 @@ public: | ||
MCCodeEmitter *Emitter, bool IsThumb) | ||
: MCELFStreamer(Context, TAB, OS, Emitter), IsThumb(IsThumb), | ||
MappingSymbolCounter(0), LastEMS(EMS_None) { | ||
- Reset(); | ||
+ EHReset(); | ||
} | ||
|
||
~ARMELFStreamer() {} | ||
@@ -578,7 +581,10 @@ private: | ||
} | ||
|
||
// Helper functions for ARM exception handling directives | ||
- void Reset(); | ||
+ void EHReset(); | ||
+ | ||
+ // Reset state between object emissions | ||
+ void reset() override; | ||
|
||
void EmitPersonalityFixup(StringRef Name); | ||
void FlushPendingOffset(); | ||
@@ -1045,6 +1051,8 @@ void ARMTargetELFStreamer::emitInst(uint32_t Inst, char Suffix) { | ||
getStreamer().emitInst(Inst, Suffix); | ||
} | ||
|
||
+void ARMTargetELFStreamer::reset() { AttributeSection = nullptr; } | ||
+ | ||
void ARMELFStreamer::FinishImpl() { | ||
MCTargetStreamer &TS = *getTargetStreamer(); | ||
ARMTargetStreamer &ATS = static_cast<ARMTargetStreamer &>(TS); | ||
@@ -1053,6 +1061,18 @@ void ARMELFStreamer::FinishImpl() { | ||
MCELFStreamer::FinishImpl(); | ||
} | ||
|
||
+void ARMELFStreamer::reset() { | ||
+ MCTargetStreamer &TS = *getTargetStreamer(); | ||
+ ARMTargetStreamer &ATS = static_cast<ARMTargetStreamer &>(TS); | ||
+ ATS.reset(); | ||
+ MappingSymbolCounter = 0; | ||
+ MCELFStreamer::reset(); | ||
+ // MCELFStreamer clear's the assembler's e_flags. However, for | ||
+ // arm we manually set the ABI version on streamer creation, so | ||
+ // do the same here | ||
+ getAssembler().setELFHeaderEFlags(ELF::EF_ARM_EABI_VER5); | ||
+} | ||
+ | ||
inline void ARMELFStreamer::SwitchToEHSection(const char *Prefix, | ||
unsigned Type, | ||
unsigned Flags, | ||
@@ -1104,7 +1124,7 @@ void ARMELFStreamer::EmitFixup(const MCExpr *Expr, MCFixupKind Kind) { | ||
Kind)); | ||
} | ||
|
||
-void ARMELFStreamer::Reset() { | ||
+void ARMELFStreamer::EHReset() { | ||
ExTab = nullptr; | ||
FnStart = nullptr; | ||
Personality = nullptr; | ||
@@ -1174,7 +1194,7 @@ void ARMELFStreamer::emitFnEnd() { | ||
SwitchSection(&FnStart->getSection()); | ||
|
||
// Clean exception handling frame information | ||
- Reset(); | ||
+ EHReset(); | ||
} | ||
|
||
void ARMELFStreamer::emitCantUnwind() { CantUnwind = true; } | ||
diff --git a/lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp b/lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp | ||
index b680db5..25da8fc 100644 | ||
--- a/lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp | ||
+++ b/lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp | ||
@@ -38,6 +38,9 @@ void ARMTargetStreamer::emitCurrentConstantPool() { | ||
// finish() - write out any non-empty assembler constant pools. | ||
void ARMTargetStreamer::finish() { ConstantPools->emitAll(Streamer); } | ||
|
||
+// reset() - Reset any state | ||
+void ARMTargetStreamer::reset() {} | ||
+ | ||
// The remaining callbacks should be handled separately by each | ||
// streamer. | ||
void ARMTargetStreamer::emitFnStart() {} | ||
diff --git a/tools/llvm-shlib/Makefile b/tools/llvm-shlib/Makefile | ||
index 2bc81da..4ff211d 100644 | ||
--- a/tools/llvm-shlib/Makefile | ||
+++ b/tools/llvm-shlib/Makefile | ||
@@ -86,11 +86,19 @@ $(LibName.SO): $(SHLIB_STUBS) | ||
$(Echo) Collecting global symbols of $(notdir $*) | ||
$(Verb) $(NM_PATH) -g $< > $@ | ||
|
||
+# The Windows ABI specifies leading underscores only on 32bit, so | ||
+# make sure we don't strip them on x86_64 | ||
+ifeq ($(ARCH),x86_64) | ||
+ABI_UNDERSCORE = | ||
+else | ||
+ABI_UNDERSCORE =_ | ||
+endif | ||
+ | ||
$(ObjDir)/$(LIBRARYNAME).exports: $(SHLIB_FRAGS) $(ObjDir)/.dir | ||
$(Echo) Generating exports for $(LIBRARYNAME) | ||
$(Verb) ($(SED) -n \ | ||
- -e "s/^.* T _\([^.][^.]*\)$$/\1/p" \ | ||
- -e "s/^.* [BDR] _\([^.][^.]*\)$$/\1 DATA/p" \ | ||
+ -e "s/^.* T $(ABI_UNDERSCORE)\([^.][^.]*\)$$/\1/p" \ | ||
+ -e "s/^.* [BDR] $(ABI_UNDERSCORE)\([^.][^.]*\)$$/\1 DATA/p" \ | ||
$(SHLIB_FRAGS) \ | ||
| sort -u) > $@ | ||
|
also needed / does it apply cleanly if you happen to download 3.7.0? maybe no point in anyone doing that?